From ba5cf646ac5eab6e23ed817e5d6f0f60c53e5ec9 Mon Sep 17 00:00:00 2001 From: Michael Kavulich Date: Mon, 17 Aug 2020 17:41:13 -0600 Subject: [PATCH 01/19] Add check to generate_FV3SAR_wflow.sh for correct python environment (#257) ## DESCRIPTION OF CHANGES: As it currently exists, the generate_FV3SAR_wflow.sh script can fail in some non-obvious ways if the correct python environment is not available. This PR adds some checks at the beginning of this script for the required python version and python modules that are needed to successfully set up the regional workflow, so the script will immediately fail with a descriptive error message if the necessary python environment is not available. The error messaging is still not ideal, as the structure of this script does not allow for a simple exit upon error and still outputs some spurious error messages, but this is an improvement over the previous behavior in the case of a bad python environment. ## TESTS CONDUCTED: Ran checks on Cheyenne, Jet, and Hera for the script's expected behavior. When the correct python environment was loaded, behavior did not change, as expected. When python versions or modules were insufficient, the script now fails immediately, and outputs a descriptive error message about the unmet requirement. Also ran the end-to-end workflow tests on Hera, there was no change in behavior. --- ush/generate_FV3SAR_wflow.sh | 58 ++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/ush/generate_FV3SAR_wflow.sh b/ush/generate_FV3SAR_wflow.sh index e09a87bde..2c24392d5 100755 --- a/ush/generate_FV3SAR_wflow.sh +++ b/ush/generate_FV3SAR_wflow.sh @@ -49,6 +49,64 @@ ushdir="${scrfunc_dir}" . $ushdir/set_FV3nml_sfc_climo_filenames.sh . $ushdir/set_FV3nml_stoch_params.sh . $ushdir/create_diag_table_files.sh +# +#----------------------------------------------------------------------- +# +# Run python checks +# +#----------------------------------------------------------------------- +# + +# This line will return two numbers: the python major and minor versions +pyversion=($(/usr/bin/env python3 -c 'import platform; major, minor, patch = platform.python_version_tuple(); print(major); print(minor)')) + +#Now, set an error check variable so that we can print all python errors rather than just the first +pyerrors=0 + +# Check that the call to python3 returned no errors, then check if the +# python3 minor version is 6 or higher +if [[ -z "$pyversion" ]];then + print_info_msg "\ + + Error: python3 not found" + pyerrors=$((pyerrors+1)) +else + if [[ ${#pyversion[@]} -lt 2 ]]; then + print_info_msg "\ + + Error retrieving python3 version" + pyerrors=$((pyerrors+1)) + elif [[ ${pyversion[1]} -lt 6 ]]; then + print_info_msg "\ + + Error: python version must be 3.6 or higher + python version: ${pyversion[*]}" + pyerrors=$((pyerrors+1)) + fi +fi + +#Next, check for the non-standard python packages: jinja2, yaml, and f90nml +pkgs=(jinja2 yaml f90nml) +for pkg in ${pkgs[@]} ; do + if ! /usr/bin/env python3 -c "import ${pkg}" &> /dev/null; then + print_info_msg "\ + + Error: python module ${pkg} not available" + pyerrors=$((pyerrors+1)) + fi +done + +#Finally, check if the number of errors is >0, and if so exit with helpful message +if [ $pyerrors -gt 0 ];then + print_err_msg_exit "\ + Errors found: check your python environment + + Instructions for setting up python environments can be found on the web: + https://github.com/ufs-community/ufs-srweather-app/wiki/Getting-Started + +" +fi + # #----------------------------------------------------------------------- # From e278310b2696bd6a2df7fedfe11b92efedfce697 Mon Sep 17 00:00:00 2001 From: Laurie Carson Date: Tue, 18 Aug 2020 09:27:24 -0600 Subject: [PATCH 02/19] Standalone wrapper scripts to run workflow tasks (#258) DESCRIPTION OF CHANGES: Add a subdirectory to ush/ containing wrapper scripts each wrapper script runs one workflow task the experiment-generation step MUST be completed before running these scripts an example batch submit script is provided for PBSpro (cheyenne) and Slurm (hera) a README file is provided with basic instructions (including which tasks in which order) users on other systems will need to customize a batch script for their system TESTS CONDUCTED: A single experiment was run using the standard rocoto job control, on hera and cheyenne. This same experiment was run using the wrapper scripts on hera and cheyenne. ISSUE (optional): Fixes issue #133 --- ush/wrappers/README.md | 40 +++++++++++++++++++++++++++ ush/wrappers/qsub_job.sh | 33 +++++++++++++++++++++++ ush/wrappers/run_fcst.sh | 11 ++++++++ ush/wrappers/run_get_ics.sh | 12 +++++++++ ush/wrappers/run_get_lbcs.sh | 11 ++++++++ ush/wrappers/run_make_grid.sh | 8 ++++++ ush/wrappers/run_make_ics.sh | 10 +++++++ ush/wrappers/run_make_lbcs.sh | 10 +++++++ ush/wrappers/run_make_orog.sh | 8 ++++++ ush/wrappers/run_make_sfc_climo.sh | 8 ++++++ ush/wrappers/run_post.sh | 15 +++++++++++ ush/wrappers/sq_job.sh | 43 ++++++++++++++++++++++++++++++ 12 files changed, 209 insertions(+) create mode 100644 ush/wrappers/README.md create mode 100755 ush/wrappers/qsub_job.sh create mode 100755 ush/wrappers/run_fcst.sh create mode 100755 ush/wrappers/run_get_ics.sh create mode 100755 ush/wrappers/run_get_lbcs.sh create mode 100755 ush/wrappers/run_make_grid.sh create mode 100755 ush/wrappers/run_make_ics.sh create mode 100755 ush/wrappers/run_make_lbcs.sh create mode 100755 ush/wrappers/run_make_orog.sh create mode 100755 ush/wrappers/run_make_sfc_climo.sh create mode 100755 ush/wrappers/run_post.sh create mode 100755 ush/wrappers/sq_job.sh diff --git a/ush/wrappers/README.md b/ush/wrappers/README.md new file mode 100644 index 000000000..2775d0fba --- /dev/null +++ b/ush/wrappers/README.md @@ -0,0 +1,40 @@ +Each workflow task has a wrapper script to set environment variables and run the job script + +The experiment-generation step MUST be done FIRST! generate_FV3SAR_wflow.sh + +There is an example batch-submit script for hera (Slurm) and cheyenne (PBS). These examples set the build and run environment for hera or cheyenne, so that run-time libraries match the compiled libraries (i.e. netcdf, mpi). + +Users may either modify the one batch submit script as each task is submitted, or duplicate this batch wrapper for their system settings, for each task. Alternatively, some batch systems allow users to specify most of the settings on the command line (with the sbatch or qsub command, for example). This piece will be unique to your system - use the examples, but expect that you will need to change things! + +Tasks with the same Stage level may be run concurrently (no dependency). + +``` + +Stage/step Task Run Script #procs Wall clock time + (on cheyenne, hera) + ========= =============== ====== =============== + 1 run_get_ics.sh 1 0:20 - depends on HPSS vs FTP vs staged-on-disk + 1 run_get_lbcs.sh 1 0:20 - depends on HPSS vs FTP vs staged-on-disk + 1 run_make_grid.sh 24 0:20 + 2 run_make_orog.sh 24 0:20 + 3 run_make_sfc_climo.sh 48 0:20 + 4 run_make_ics.sh 48 0:30 + 4 run_make_lbcs.sh 48 0:30 + 5 run_fcst.sh 48 2:30 + 6 run_post.sh 48 0:25 - 2min per output forecast hour + +``` + +QuickStart: +1. clone, and build the ufs-srweather-app: https://github.com/ufs-community/ufs-srweather-app/wiki/Getting-Started +2. Generate an experiment configuration: https://github.com/ufs-community/ufs-srweather-app/wiki/Getting-Started +3. CD to the experiment directory +4. SET the environment variable EXPTDIR: setenv EXPTDIR `pwd` //or// export EXPTDIR=`pwd` +5. COPY the wrapper scripts from the workflow directory: cp ufs-srweather-app/regional-workflow/ush/wrappers/* . +6. Run each of the listed scripts, in the order given. Scripts with the same stage-# may be run simultaneously. + - On most HPC systems, you will need to submit a batch job to run the multi-processor jobs + - On some HPC systems, you can run the first two jobs (serial) on a login node/command-line + - Example scripts for Slurm (hera) and for PBS (cheyenne) are provided. These will need to be adapted to your system + - This batch-submit script is hard-coded per task, so will need to be modified or copied to run each task + + diff --git a/ush/wrappers/qsub_job.sh b/ush/wrappers/qsub_job.sh new file mode 100755 index 000000000..797590509 --- /dev/null +++ b/ush/wrappers/qsub_job.sh @@ -0,0 +1,33 @@ +#!/bin/sh +#PBS -A P48503002 +#PBS -q regular +#PBS -l select=1:mpiprocs=24:ncpus=24 +#PBS -l walltime=02:30:00 +#PBS -N run_make_grid +#PBS -j oe -o /glade/scratch/carson/ufs/expt_dirs/test_1/log/run_make_grid.log +cd /glade/scratch/carson/ufs/expt_dirs/test_1 +set -x +# +source /etc/profile.d/modules.sh +module load ncarenv/1.3 +module load intel/19.0.2 +module load mpt/2.19 +module load ncarcompilers/0.5.0 +module load netcdf/4.6.3 + +module use -a /glade/p/ral/jntp/GMTB/tools/modulefiles/intel-19.0.2/mpt-2.19 +module load esmf/8.0.0 +# +# Different modules are needed for the UFS_UTILS/mpi jobs... why are they using impi anyway??? +## make_sfc_climo make_ics make_lbcs +# +##module load ncarenv/1.3 +##module load intel/19.0.2 +##module load ncarcompilers/0.5.0 +##module load impi/2019.2.187 +##module load netcdf/4.6.3 +# +##module use -a /glade/p/ral/jntp/GMTB/tools/modulefiles/intel-19.0.2/impi-2019.2.187 +##module load esmf/8.0.0_bs50 +# +./run_make_grid.sh diff --git a/ush/wrappers/run_fcst.sh b/ush/wrappers/run_fcst.sh new file mode 100755 index 000000000..f5abf5e5d --- /dev/null +++ b/ush/wrappers/run_fcst.sh @@ -0,0 +1,11 @@ +#!/bin/sh +export GLOBAL_VAR_DEFNS_FP="${EXPTDIR}/var_defns.sh" +set -x +source ${GLOBAL_VAR_DEFNS_FP} +export CDATE=${DATE_FIRST_CYCL}${CYCL_HRS} +export CYCLE_DIR=${EXPTDIR}/${CDATE} +export SLASH_ENSMEM_SUBDIR="" +export ENSMEM_INDX="" + +${JOBSDIR}/JREGIONAL_RUN_FCST + diff --git a/ush/wrappers/run_get_ics.sh b/ush/wrappers/run_get_ics.sh new file mode 100755 index 000000000..69b0a6bcc --- /dev/null +++ b/ush/wrappers/run_get_ics.sh @@ -0,0 +1,12 @@ +#!/bin/sh +export GLOBAL_VAR_DEFNS_FP="${EXPTDIR}/var_defns.sh" +set -x +source ${GLOBAL_VAR_DEFNS_FP} +export CDATE=${DATE_FIRST_CYCL}${CYCL_HRS} +export CYCLE_DIR=${EXPTDIR}/${CDATE} + +# get the ICS files +export ICS_OR_LBCS="ICS" +export EXTRN_MDL_NAME=${EXTRN_MDL_NAME_ICS} +${JOBSDIR}/JREGIONAL_GET_EXTRN_MDL_FILES + diff --git a/ush/wrappers/run_get_lbcs.sh b/ush/wrappers/run_get_lbcs.sh new file mode 100755 index 000000000..07da38940 --- /dev/null +++ b/ush/wrappers/run_get_lbcs.sh @@ -0,0 +1,11 @@ +#!/bin/sh +export GLOBAL_VAR_DEFNS_FP="${EXPTDIR}/var_defns.sh" +set -x +source ${GLOBAL_VAR_DEFNS_FP} +export CDATE=${DATE_FIRST_CYCL}${CYCL_HRS} +export CYCLE_DIR=${EXPTDIR}/${CDATE} + +# get the LBCS files +export ICS_OR_LBCS="LBCS" +export EXTRN_MDL_NAME=${EXTRN_MDL_NAME_LBCS} +${JOBSDIR}/JREGIONAL_GET_EXTRN_MDL_FILES diff --git a/ush/wrappers/run_make_grid.sh b/ush/wrappers/run_make_grid.sh new file mode 100755 index 000000000..96fd8a4ec --- /dev/null +++ b/ush/wrappers/run_make_grid.sh @@ -0,0 +1,8 @@ +#!/bin/sh +export GLOBAL_VAR_DEFNS_FP="${EXPTDIR}/var_defns.sh" +set -x +source ${GLOBAL_VAR_DEFNS_FP} + +export CDATE=${DATE_FIRST_CYCL}${CYCL_HRS} +export CYCLE_DIR=${EXPTDIR}/${CDATE} +${JOBSDIR}/JREGIONAL_MAKE_GRID diff --git a/ush/wrappers/run_make_ics.sh b/ush/wrappers/run_make_ics.sh new file mode 100755 index 000000000..de3d3de6d --- /dev/null +++ b/ush/wrappers/run_make_ics.sh @@ -0,0 +1,10 @@ +#!/bin/sh +export GLOBAL_VAR_DEFNS_FP="${EXPTDIR}/var_defns.sh" +set -x +source ${GLOBAL_VAR_DEFNS_FP} +export CDATE=${DATE_FIRST_CYCL}${CYCL_HRS} +export CYCLE_DIR=${EXPTDIR}/${CDATE} +export SLASH_ENSMEM_SUBDIR="" + +${JOBSDIR}/JREGIONAL_MAKE_ICS + diff --git a/ush/wrappers/run_make_lbcs.sh b/ush/wrappers/run_make_lbcs.sh new file mode 100755 index 000000000..adae78ea4 --- /dev/null +++ b/ush/wrappers/run_make_lbcs.sh @@ -0,0 +1,10 @@ +#!/bin/sh +export GLOBAL_VAR_DEFNS_FP="${EXPTDIR}/var_defns.sh" +set -x +source ${GLOBAL_VAR_DEFNS_FP} +export CDATE=${DATE_FIRST_CYCL}${CYCL_HRS} +export CYCLE_DIR=${EXPTDIR}/${CDATE} +export SLASH_ENSMEM_SUBDIR="" + +${JOBSDIR}/JREGIONAL_MAKE_LBCS + diff --git a/ush/wrappers/run_make_orog.sh b/ush/wrappers/run_make_orog.sh new file mode 100755 index 000000000..cf1adab4c --- /dev/null +++ b/ush/wrappers/run_make_orog.sh @@ -0,0 +1,8 @@ +#!/bin/sh +export GLOBAL_VAR_DEFNS_FP="${EXPTDIR}/var_defns.sh" +set -x +source ${GLOBAL_VAR_DEFNS_FP} + +export CDATE=${DATE_FIRST_CYCL}${CYCL_HRS} +export CYCLE_DIR=${EXPTDIR}/${CDATE} +${JOBSDIR}/JREGIONAL_MAKE_OROG diff --git a/ush/wrappers/run_make_sfc_climo.sh b/ush/wrappers/run_make_sfc_climo.sh new file mode 100755 index 000000000..06c926079 --- /dev/null +++ b/ush/wrappers/run_make_sfc_climo.sh @@ -0,0 +1,8 @@ +#!/bin/sh +export GLOBAL_VAR_DEFNS_FP="${EXPTDIR}/var_defns.sh" +set -x +source ${GLOBAL_VAR_DEFNS_FP} + +export CDATE=${DATE_FIRST_CYCL}${CYCL_HRS} +export CYCLE_DIR=${EXPTDIR}/${CDATE} +${JOBSDIR}/JREGIONAL_MAKE_SFC_CLIMO diff --git a/ush/wrappers/run_post.sh b/ush/wrappers/run_post.sh new file mode 100755 index 000000000..174cc62b5 --- /dev/null +++ b/ush/wrappers/run_post.sh @@ -0,0 +1,15 @@ +#!/bin/sh +export GLOBAL_VAR_DEFNS_FP="${EXPTDIR}/var_defns.sh" +set -x +source ${GLOBAL_VAR_DEFNS_FP} +export CDATE=${DATE_FIRST_CYCL}${CYCL_HRS} +export CYCLE_DIR=${EXPTDIR}/${CDATE} +export cyc=${CYCL_HRS} +export SLASH_ENSMEM_SUBDIR="" +export ENSMEM_INDX="" + +num_fcst_hrs=${FCST_LEN_HRS} +for (( i=0; i<=$((num_fcst_hrs)); i++ )); do + export fhr=`printf "%02i" ${i}` + ${JOBSDIR}/JREGIONAL_RUN_POST +done diff --git a/ush/wrappers/sq_job.sh b/ush/wrappers/sq_job.sh new file mode 100755 index 000000000..394bfabe2 --- /dev/null +++ b/ush/wrappers/sq_job.sh @@ -0,0 +1,43 @@ +#!/bin/sh +#SBATCH -e /scratch1/BMC/gmtb/Laurie.Carson/expt_dirs/test_2/log/run_make_grid.log +#SBATCH --account=gmtb +#SBATCH --qos=batch +#SBATCH --ntasks=48 +#SBATCH --time=20 +#SBATCH --job-name="run_make_grid" +cd /scratch1/BMC/gmtb/Laurie.Carson/expt_dirs/test_2 +set -x +. /apps/lmod/lmod/init/sh + +module purge +module load hpss + +module load intel/18.0.5.274 +module load impi/2018.0.4 +module load wgrib2 +############ +# use this netcdf for most of the tasks +module load netcdf/4.7.0 +############ + +############ +# use this version for make_sfc_climo, make_ics and make_lbcs +#module load netcdf/4.6.1 +############ + +module load hdf5/1.10.5 + +############ +# use this for the forecast model +#module use -a /scratch1/NCEPDEV/nems/emc.nemspara/soft/modulefiles +#module load hdf5_parallel/1.10.6 +#module load netcdf_parallel/4.7.4 +#module load esmf/8.0.0_ParallelNetCDF +############ + + +module use -a /contrib/miniconda3/modulefiles +module load miniconda3 +conda activate regional_workflow + +./run_make_grid.sh From 09a06f34b2fc79f96425beddbb6885b0d6ca32ee Mon Sep 17 00:00:00 2001 From: JeffBeck-NOAA <55201531+JeffBeck-NOAA@users.noreply.github.com> Date: Tue, 18 Aug 2020 17:05:42 -0600 Subject: [PATCH 03/19] Rename SAR to LAM and JP to ESG, remove fix files (#268) * Remove all references to /lfs3 on Jet * Add Ben and Ratko to the CODEOWNERS file * Replace hard-coded make_orog module file with build-level module file in UFS_UTILS * Remove hard-coded make_sfc_climo module file * Rename all FV3-SAR and SAR-FV3 to FV3-LAM, rename all JPgrid to ESGgrid. Remove fix files in regional_workflow and source from fix_am and EMC_post. * Add alpha/kappa parameter back in exregional_make_grid.sh * Remove dash from FV3LAM_wflow.xml * Change FIXam to FIXgsm to source Thompson CCN file * Remove old, unused grid stanza from exregional_run_post.sh * Change Jet locations of fix_am/fix_orog to EMC paths --- fix/fix_gsd/CCN_ACTIVATE.BIN | Bin 35288 -> 0 bytes fix/fix_upp/nam_micro_lookup.dat | Bin 30200 -> 0 bytes fix/fix_upp/params_grib2_tbl_new | 1244 -- fix/fix_upp/postxconfig-NT-fv3sar.txt | 17943 ---------------- jobs/JREGIONAL_GET_EXTRN_MDL_FILES | 2 +- jobs/JREGIONAL_MAKE_GRID | 8 +- jobs/JREGIONAL_RUN_POST | 2 +- scripts/exregional_get_extrn_mdl_files.sh | 6 +- scripts/exregional_make_grid.sh | 34 +- scripts/exregional_make_ics.sh | 16 +- scripts/exregional_make_lbcs.sh | 18 +- scripts/exregional_make_orog.sh | 12 +- scripts/exregional_make_sfc_climo.sh | 4 +- scripts/exregional_run_fcst.sh | 20 +- scripts/exregional_run_post.sh | 29 +- tests/baseline_configs/config.GSD_RAP13km.sh | 12 +- .../config.community_ensemble_008mems.sh | 2 +- .../config.community_ensemble_2mems.sh | 2 +- tests/baseline_configs/config.nco_conus.sh | 6 +- .../baseline_configs/config.nco_conus_c96.sh | 6 +- tests/baseline_configs/config.nco_ensemble.sh | 6 +- ...ig.new_JPgrid.sh => config.new_ESGgrid.sh} | 38 +- tests/baseline_configs/config.regional_001.sh | 2 +- tests/baseline_configs/config.regional_002.sh | 2 +- tests/baseline_configs/config.regional_003.sh | 2 +- tests/baseline_configs/config.regional_004.sh | 2 +- tests/baseline_configs/config.regional_005.sh | 2 +- tests/baseline_configs/config.regional_006.sh | 8 +- tests/baseline_configs/config.regional_009.sh | 6 +- tests/baseline_configs/config.regional_010.sh | 2 +- tests/baseline_configs/config.regional_011.sh | 2 +- tests/baseline_configs/config.regional_012.sh | 2 +- tests/baseline_configs/config.regional_013.sh | 2 +- tests/baseline_configs/config.regional_014.sh | 2 +- tests/baseline_configs/config.regional_016.sh | 2 +- .../config.user_staged_extrn_files.sh | 2 +- tests/baselines_list.txt | 2 +- tests/run_experiments.sh | 2 +- ush/NCL/NCL_ICs_BCs/generate_ICs_BCs.sh | 26 +- .../generate_RAP_based_ICs_BCs.ncl | 106 +- ...RFV3.ncl => interpolate_RAP_to_FV3LAM.ncl} | 46 +- .../NCL_ICs_BCs/plot_model_field_generic.ncl | 2 +- ...rid_halo.ncl => read_FV3LAM_grid_halo.ncl} | 10 +- ush/NCL/check_filevar_existence_dims.ncl | 2 +- ush/NCL/find_wrtcmp_grid_params.ncl | 8 +- ush/NCL/make_plot_titles.ncl | 12 +- ...ative.ncl => plot_FV3LAM_field_native.ncl} | 116 +- ush/NCL/plot_grid.ncl | 98 +- ush/NCL/process_plot_params.ncl | 2 +- ...ative.ncl => read_FV3LAM_field_native.ncl} | 8 +- ...rtcmp.ncl => read_FV3LAM_field_wrtcmp.ncl} | 6 +- ...native.ncl => read_FV3LAM_grid_native.ncl} | 12 +- ...wrtcmp.ncl => read_FV3LAM_grid_wrtcmp.ncl} | 22 +- ...e.ncl => read_FV3LAM_gridfield_native.ncl} | 10 +- ush/UFS_plot_domains.py | 32 +- ush/cmp_expt_to_baseline.sh | 2 +- ush/config.community.sh | 2 +- ush/config.nco.sh | 6 +- ush/config_defaults.sh | 66 +- ...3SAR_wflow.sh => generate_FV3LAM_wflow.sh} | 34 +- ush/get_extrn_mdl_file_dir_info.sh | 40 +- ...FV3SAR_wflow.sh => launch_FV3LAM_wflow.sh} | 10 +- ush/link_fix.sh | 22 +- ush/load_modules_run_task.sh | 2 +- ush/set_FV3nml_sfc_climo_filenames.sh | 6 +- ush/set_extrn_mdl_params.sh | 4 +- ...ms_JPgrid.sh => set_gridparams_ESGgrid.sh} | 8 +- ush/set_gridparams_GFDLgrid.sh | 2 +- ush/set_predef_grid_params.sh | 354 +- ush/setup.sh | 162 +- .../{FV3SAR_wflow.xml => FV3LAM_wflow.xml} | 2 +- ush/templates/README.xml_templating.md | 2 +- ush/valid_param_vals.sh | 2 +- 73 files changed, 738 insertions(+), 19958 deletions(-) delete mode 100644 fix/fix_gsd/CCN_ACTIVATE.BIN delete mode 100755 fix/fix_upp/nam_micro_lookup.dat delete mode 100755 fix/fix_upp/params_grib2_tbl_new delete mode 100644 fix/fix_upp/postxconfig-NT-fv3sar.txt rename tests/baseline_configs/{config.new_JPgrid.sh => config.new_ESGgrid.sh} (68%) rename ush/NCL/NCL_ICs_BCs/{interpolate_RAP_to_SARFV3.ncl => interpolate_RAP_to_FV3LAM.ncl} (82%) rename ush/NCL/NCL_ICs_BCs/{read_FV3SAR_grid_halo.ncl => read_FV3LAM_grid_halo.ncl} (98%) rename ush/NCL/{plot_FV3SAR_field_native.ncl => plot_FV3LAM_field_native.ncl} (94%) rename ush/NCL/{read_FV3SAR_field_native.ncl => read_FV3LAM_field_native.ncl} (98%) rename ush/NCL/{read_FV3SAR_field_wrtcmp.ncl => read_FV3LAM_field_wrtcmp.ncl} (97%) rename ush/NCL/{read_FV3SAR_grid_native.ncl => read_FV3LAM_grid_native.ncl} (99%) rename ush/NCL/{read_FV3SAR_grid_wrtcmp.ncl => read_FV3LAM_grid_wrtcmp.ncl} (93%) rename ush/NCL/{read_FV3SAR_gridfield_native.ncl => read_FV3LAM_gridfield_native.ncl} (98%) rename ush/{generate_FV3SAR_wflow.sh => generate_FV3LAM_wflow.sh} (97%) rename ush/{launch_FV3SAR_wflow.sh => launch_FV3LAM_wflow.sh} (98%) rename ush/{set_gridparams_JPgrid.sh => set_gridparams_ESGgrid.sh} (96%) rename ush/templates/{FV3SAR_wflow.xml => FV3LAM_wflow.xml} (99%) diff --git a/fix/fix_gsd/CCN_ACTIVATE.BIN b/fix/fix_gsd/CCN_ACTIVATE.BIN deleted file mode 100644 index 9026e073ef0e701939c75ca4a22390a77425b3a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35288 zcmbuIUC3_NRfUfVf`6cbw4soT7L~RTQ(8Rf`T5=^HneIK#8jn8qY2oA#wJKf#iq%j z_DGGrP}&Py6e$%5+b%r+ z=|8{x)z_T6{E>J3*X7s0@a0QSUjOP#w>^LJ#h2f8k!#LA@R5H$`+>**=<;7a`m>ks z{Hr%!{{BzA&exp%$E)6V_6Ik-|Li9|`+_IqRA%=z~({%zrY&-L#B_k~B#zc=Q*$BnM3IZxd1oWOO2o5QuAd5h;f zb91=k?ROP7&-~p@XTN*XOS}jE4j=mZcOTyOZ@<0A&Ed+It_yA+xZxM#8I7A2`^3!~ zKYl)9?sz_O*OiOkb^mvO`@#)h__K()xjFy2@45KQFTQwDxVffc4mbbv#Oq2oy2de& zcz*K1*M@FVTSLr$=uIzN{>Q)nLu;#Wp&P~Q?2eE9j^A@IE_CyKum7zxb0cjXuH5o) zaD#4s=3hT^5U#_w-Sq@9Sg=2R>!6#P{`)>+5HSZ=)B1%6zjo_|Z$1BeJs(2raMSa_ zxOzV5n$Rh@G9Q8)w59iimW|8#ko<*~J1*yg-V<6*T$K-KOYhm>A|Jkd`;)8YGv@a{ z{-1};2Vy|H3RjEyTmSU#rz+2?yf{NgQ#U;T@3>9`{A^qwWp|K<&cU%&RI!#%J4`r(~Fdd_|l{*`l% zJkOX1cI$oeKy)#CfjtmikjKY-@~9U`7vGc@G@m@`1>)~;<;lAa5BqHJ`N?M-8WrG3O)PRNl549(5kia^7}s&@Y}veV(~V&p%vAuckhCZsg}HK6#qC zLEmr}wcogThH5r=o^u z-w}QUH}p5jU-T~4?z?~GQuQ~wX2F-Z@HF}WYJ&Qk5j)(-7pa%xW{9WieDyfJhEIJP z+zc_#zRmtH)Nt1+u2FwjxLm^w=y(bvncxFA#r24aZO1zsOI98t$A)&#Au6o<_{^J^Gi29=P4{ zDnH4-H}F0D(&wwcp@zes^tWPv?5Xg3`r^!)-oI4Lv#+f=w|+jZ!3T+#eX{F9{B69T z=^}KPJ=frqc-HI%^gyYL^6DL3EMAbkdiMhPu z()5dAp2UYbN8VG%@GSC@I;A-T7ia)KvzNFB6^_t}cqnbQ9*P(6`o?h*IfWJ-uB3$$VS;M#3)!%1-6IyP4 zbM2%6J=n9hh8K{__+0L74Y<%VH9U1QctQ5_;rG%_t;5l(b-{bY zP3Yb60+;K&Vz78Y)^Ov>HSHSP(F;O<8|>)?dQag(&-Aq&JMjXSb>SL79ka)|PN9qB z=FoA`zusjp=19o(gUW#8ZPkIe- z%Flueure3s0JrEnz24)|UwV&-S_nq*#CUj#`(~ce#+MkaIR_WvhkE}SKlGV6G{2<= zShM~u92vXuK97Itx~QoGc8@)GW6YCz;peV%i97D=dql)nx-9JWS-3HG%Gr1(d#c38 z+?c!YGv1FM<(h&%gYf}-<3{6azOQrl+6F(~$Nu!KXmfu|&p{XNFRks4-MT}UszKl? z>}{b%mdy?-F&4IoS)cH;Fk!PfJXi-q9@F3^_gNf;ntrn>8GMH)FhGS!b^NDW0?G z>%f-19e%Ql9nX;;<41~b_zimj)NOvG)95dmqvjWR?{UVwZshsAA75a+^qKo4^dTOv zG3J+Z#V`B6?U?ST4l(y#e5zy77x-P{@8A>NY2F*`%#*yOKGQ$o#m3H< z*A(ayZrb=V7sZD<26u^#``3BGjr7m`N3kofsRKNJ4 z-Mi0!C(RV@Iqu{lHDpH@wGM~d4fgbE{2pC3T`Y4+uZA1A%kgoZdIq}j{hn|AmS5qC zr?8*wZN#r~?I?EiOg`;lXWr!U4mZ(P_?&^cHEtGsxellP!rd-*yi?zGInZ>Vo>q+{F!ZSTUfB>`lzw z2A^^UFW#;1U>CpWc5~m#ozMDWuZlfNtxtUxANv}tO}(~n=j@v^MXiBjpObw|#j*ND zuM=4Rv#*H8%_nu8^te4H*vq3=Il@it zYv5m<8}YZqHtR~~hFmM$6E}KBoxQd*8Gm=;{rT9_VDH`6j9IUb?9IOb7uL$8(l9)YXJ+~@Fo zU*MQGt;ZR=u8Ej~t7+YPKAU`CFDuVF2VBkv-a|f6&s=xN2k!}K9TB;0T;zlLt2G~1 zEe9^IGpdiw9u|Mdd>{tSbM|HZ?Z7wutx@K1>|2{Z&M8yNd%B34VO*>Yoiox!)HC7* zF4hQ57q!P}T+SKR0bU-tmiw>8y+7IO-L>gmq!RP)>waoyYe7d{4!cex&On)-qWy-H)V~hW>Id zs(dZKDT!}R(o4Kw<#QLfu$RObo8KI{WOLx8i0uAK;jM zedC(*A!@j^%(~7oC-?Op@^-<#Xt~x{>rLGEF8H*zaZl@<*=Sz5Nfqhbb9yPpswSBVs zm#pFFf*NjJRNN;okS<(XOYbi)-;~t1MyYrAWzpAC$M)(J{0V#H@vL{WLk(~q@AWUP zzs80CC&xn#H!kX-IF7ixhWnh7_YC_zlP=^JHBWIHxler2zi`+~qE1QQQ4gfsz+f+N z531Y`-z2B$z55){L5|PgO++6HhN@%KB5Bip&U#Gx8}l~z-xXul3gcMTGI0^}thl?z zEx+m8LYt1EVr<-jJ=X(~bL1o%NN&6ysQ%pCk<+XxIycm@ktG_4_LHS>kjG^YnLAPUVrKB;07<(HPO$b)zn3B!#LP8URCGG z8P45Zs8Z=-} zToJR0o5IDs@wvv$W}VV&K(D{n1=^yo^E%vmw=VRK1z+~8);s;*P{-V}s?M+vN^iHp zjxO@sMYzS&hz)(3a751{4=B%qd*;{1!%LV0@c{!o(c^|^c@D}sdaR5c#NgWG{jjR^0jf_9NXh*WvHl__j8#_r`sA30`en9lQ64&?UHh4e#?hlDvhx#?6qo zaKl;_edzvWo{byc!Tl9m&o5&vU5{SpaXmxv+plrUHF)(gUZSrcX7pHKZn%RN`)tHnF4@de7bX$pA5GC@Y$6FZVne6}2U%>(6eJtLoIdZ?prJ->y%1PEdJfC-N<|$9y z?O#&Y)OTw1=03(Bdurb&mV0B28bo}J4g6qWo_Gm!>)bFF^TdzjX`Z|9?-nUc-&!3imaZv7z_${qq=q20QQH8{_Zb_1GAFy>rpI?%%|nTqU3O zbm86v?q+Uct)!UYS2K4t7kM?@bna>l?DBhKJEnQ=KNVZ@X?SLG8h@wfcfA_7yrD2F~(KLeE()FF`mS(-lk)ku~WnQ zy!$wuqYJp3ukpDM+>on%JmyLLl`dv(1`P6e{Kni3V_*}%zJD{8+?>RI?=`VMnR^by znd1C?L9Wf?8veZrdO2z~dlEjk$@P8Ibk+d5zGXcX*RX!KchNJ^@6lJ$GqQdsj%W=X z6BBxie9!XlvFF(Yd5qo^3)Y{diFW2fE^YTQvo?t{_SqSa{YUmJICpq?J%^7u_r3Ra z-WqdO9}{~PKD)^CjXvk#hHsGbn(7734gFy9S8HyxGI3LD`nm`U&H|iteJ+bypTlE1>` zd@z5x&lhWmo)7RxKA>e{4leS6wI97U`9QpktLH;#p8j5amSgUG(7r@rkNq$`1COF^ z>OHX^-($Y_y$ySG&WHT=!aCi{nacAi=CRM$akZGU&sp`3Joi3OUbFe$rsYh1e@1`p zejs(RV3#j?Zyf*2+7f$@#zoBAw-<%0<#~N;)bt+wwQF|00RA|m?RvK^@Pd9;XI$xl z_~ie|3zSz2_S^%SbP;=#*1PiDdXN9Ek^R5xBCo0aO}qeH?V7>=t#`as*Tg=>tarU9 zya25_kF9sKqnrq>x({mpA7@#PY36a&ncC;e{@c1BujGT_S@4hFXr2*6xZu2z^)2(n zi;1((q@)ng-eDap_M(e8QrD7Nu=nI$wo&{FszJ-6^kT%b*C})(Zpvrj#`>ln>KS`}WPeyN2vt9A_SxRQBsW9-buGj9@N#J_aP^$Y zbDOB)&U5=Y9P1g;(^A9jY4{0V5H-AcwQ*(6EZDuzmo?n{4cM~}V9!JE={;BU>iC?n z$9EUjvb}(wHMyyt%RWh+B4@-+d4YR%u7N-5nCtKClYDQ(oc4TD>xRfR(*v$@S!>dhxDz_yc>cQwF`mF*Ur` zU+W$1NEg-5TNlkQ7JR9T?xn-p*Sg3$Ll0^G_58r8oW;{(p6Ml#+v47Jkn!>?xTW5L z6Yb+??8h(%#}H4;@#UON>(^fExF4^p7@^Jeyl|{>c$WHi{9Nyd+EMq}&-kr1D)ZbO zd+tW!S)N6G&e(uEu)`bN;73`X{tOYExg)wiKndP}g& zv!Xw9KA=}}Kl46#am@SoHp$HpbNE9ya7S89!3~=5{(^G`zk)mZI@j=? zGs%tTRJAT^!rIp{@2uhWlZ}_VhUcEzF7`!RvF=Ep?J*DRXcfJqSNeUpnZ3a4Y;yzl zzNSDIjho@D&io}e{rm6mN!NtR>E;F2#o*;|(|nQ`Y_O+Ks_z~8m!|i??p~Z+rq(6y z(0ta`&~y4&c|qoJ)OmE_8h{UaodPcR{K-w#aB!JFawht^RjY%SZhCffp*lmaz%w@3 z(M8r7=74sIFLPj?>_O5`;920{{lun?*EeqDEj*yx9ADm-+9W3#PafB~Fo*P`tR?Fh zIQ4_4aqls|#;c?6$?GSa%i8eB7$Wc#p4hl4KSDS7 z71)xS1$+7t&w#reUwHvTazlNuzO`f1GpHHTtpW)Q=j23$Cr1v{*(EkJ8`qlD?JTvj>es5Xq~?CI%C%}=&z1qm*-ip z#-1^cJfi2KH$kr+H+HWnlxIGquBMm4SF=LhCAX;{UsMCy~mjQGIFNrJ;wSvW#VS2zdWOHv&^&g ztY}Mf*!o%Og1ByKTxy;gaZ>Z*hWHU*aPotOc%CrFx{>=m?lI-bGEeD_`H>skOAKm^ zIml1ApK#PwyvY7|6C>u2-yVxCKFPE9VvFZ6r@b-$PI`~}FI^4Td6(iDJp!@m z*gfX|MzZJLdGq_2dmrCmkeB=Un=!c4IM|P2pszjU<)_BLgqIsTvEhe#5PNbGZs+mP znPQ61x-U2O!XTez4etKTb4L?q=+PFMW0%FYL-mxS6@DIVi8G&waech`D~?j&Wi%kMU=)Grl**-;vM9#^`IU z=RNFr3Hh{#otWXXd*ksw=@s3~+|*o@>-2S9cQuyS;m+gp7=PyZr{exfUgwz4*oi;) z8uvU-OyCCYe2p~|-`gnH_qZtx%9)v)8UwrPSRWt8k{h0XDyRQH*wKt}&De0s7 z`m1#cUNq~XFeqo7bACsSflWCBHgb~jVT^J43EVTj8B1j{e}MHr`GD3u{dk`;p`?u|mgah@O*v zTF>td}?o=y?6c{ z==}Dg=B&M#;ToM?R6Nnm#9ysl%#F3hUKcTUJn0wVCinOw=HxH6f?nI}2wfANPY$^z z(ofQp>Y4=~bw|1(577-dI`mSF8+s0L!yZh;JmVSXQTgq~(R|>1+PE^F?DIrEh`-P& zeX_OAHOXJ$az3Cf=Y#v4y?j8+#zj8RYv=lM>F@Kb&iUZpwBnv?V()dyr((|1Y5Y6B zE#~pxpKo)HZwssoynubIoOAJ~^C-@*BVL)q#b0vleV9$ou%AV(CSKs0awhf*GG4KM z%9zL6$$S2IpL-$r(>04GSQD!zd(Q!F={=$4oO8rnxHylB|9?)`vUK5ZtTtZYn9p9o z{^g{L!3(-B@Pe*)>msiyFQBeWx_D(T$hD8XAboPsJ9*x}HDb@%xQO}7`RyHN^FD{$ z@rzjZbzL;Sh?tVc_`kgrj@jR3PUNxu-+3j!7{0f$m*N+?refN35q=@0|J+{>E)-vTNuOt(wNh8p&r84T<${4dROWzZfmL}K&%n=O zeZ(HB`ZfGKa{!)KzgADw&NpJuxN@30mup}>gEQmxzO4Ci?bZ1IDwJpC8GGo!-<(W2 z7u@)p6Xv|b4cvLogErBD^graSYdG&Aev!B8nPzS(ewnwO8`jzbcE#A-Y-(KNM!ry9 z?A%sA5ZcDi*pujc>?td)|hg^Sg@hvz`z3e1CJ&V{Xq%ZmMtdxeom0 znN_T<>}mFM_!Bn~uU^B=pSW4HocRDQ@*(@f6?@AEa-a7M*xR0vv{iM=euP(3>-grR z$K1L|Zd_Z3oZ%Vtb*{fHXW~70xofy%Zr>xPUBg}L?C0X9dRlsXds^nqiZA=No-+e> z^*5|D$QkiB*I$2AviaV|o)0(pV8d1YA2nRuRQOEynM#xypq>e{p~)9cBH>L zx9_-87Ylalz4_#34b*g@yb5ntJce54p4M8n-oKIWZSYp&)%8xUztZ%x99#9g{z{Rw~Q&-2V06umhyMxV)l__^wF=oTI{-p|LQj^PdD zG+vIbn1elwcjWjo&o&4A7Vn4}XFo!l>ch~cVi#U8VBk9Wxwwim{mmHTS8tAa?vCl3 z6V0>gRMwz4LpSzZ4@3-AgCch1J=o!`a|3tuxM24>(teKL)61Z1*5&xDx#1ajp6(y= z*74E0gnF}%fh)ODkGig9%$tAf-}&4<)5vknzdS2zP<(qq4iIccQhBbDs$%6mFo_<8{O@AY9nB$0D>k@y@#F}ptTh{5S3FvM!me@63 zeOuO`0ekb==s(eeHIXron00Qz-quRdJK~FQLr#+qUQ^^Ag>|*ev*F5`Fk(+!&i##_ zfh|4l=(!BFPT28T#U#8s<8A!ak2;qVcWA;rF}cb!tQ+#d`wQd@y|=mX_cqjU=Zv&v z-K;%ruEWV0J%jNze%YHiXL!dDTjBEe#Pk8fnDb%LmizgrK^?p5QF(#%ICE3|eAb{C zPhC{~MUUh%+}H=Z7kEvU+zjXT=oMX%Gqpd#+|h-++Wb-D2Yl!veUcaqW5&Mpy|w?6 z{d~k+xT(d%I)(b&xQRUo_hqgD#_qipVu~*4+j2cy>lE*;po`Q^Y1OrkyrPbYn+1bw zxOCyX!jlGkO&9b)!x-3`E|>#(O&x`Q=D}R)rI-Ua7$;}jc&(XvKJz2~IljCva}Ms? z_&OJIPVwRXT$8S2j*nuTe!CshHJTgq-5nF=WqssljlYR`>@ib=n76Sd{@5d;M$OZ|>A**k{4(A8S5)@2+R(MAdNlRdCmIG1PFqKXN|Dm$~S@)H=9nx*F%1`>x6D zIL7?-40N+w-xJ@d`VM!_b>q&MN51pk^w~id#NBI(tU-M|wCWl@akF5^8qPDccVli= zeCgHHu^eB=95;D2+S~ZN$MuY(HI8ePQ})?C?A|}?dQWcRx#(hto7y)aXW#}OB<{Mm z_LRI{rC%rKG``}?zLz@2_+H+UGw^#f?#h{?H4f~m@#Jd9o!BDoz5e!Vh`ZM*e%DSD=kr5~-lFz?g_+-z!`<1THT)O>P-ClF(>(j$6L zfSwrcJnk{&$ubu`A6=0f+{=A6#vBws-_N}pUlRA!xYXB(Pxs^V$=_xS4+9(8+w(K{ zKibpkUi=eX8n>~F>)?|;KgPk%7(a|zXRgm42cO4cKJqKDd3=+b;?ConF}TzHyr1Xp z;lnGb6MJL)-Kn^P8Qx~>jxRaMv*+=cr(y;-j2j#G!HwsFmlHRS_c5+PSDjnm=iiKT zKkxV7_1~_M{qOoepYl31!MtW{#(8VxXTC8Z0BZ}r+SY*K8z(d zyr28`#`wEaaVK_;w|^TOzwzi}*va){ITPnX;uYP@x~O?7XWZAB+ZqF#a)#c<_YY%< Tow%ODek$Lk`E%zUdG>z+)|tMw diff --git a/fix/fix_upp/nam_micro_lookup.dat b/fix/fix_upp/nam_micro_lookup.dat deleted file mode 100755 index c18d5a71795634b7c335503fe4bdfac7ef940e7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30200 zcmXt(#L~+=`(%R z^u>MobZeL{-R@~ZcYuBL!_jSY*UU}ytHe`u&$U?kn`0;ayQoR7q;Dl3G{;)5e(a5W zu*G`0PSSO`fpU-BIR2*G+<3Em*nv-SYdr+H_m|h&)yTyRAkd`lf8X3N+(PGZD-nURl=Fk;4xW62Xn%$dO!-C)G58A?cE#Jm~C zLX#0QXL!{~jF>wEf6r#b>>0&x86)P;xDUF-53}g;E=KH#S?1}&h&?f34dsm36|-8=$cTM0 z>#iPQ#Lk#a^OrJWZ%kD5H%9D^iMemWi2X6~@?u8pkV(vqWyBttZGATwu}da3B#IIH zWYX{DFk+`nmhWIj?3Ky6{DKj?W%9jk8L?lc@a82(?3gJDYGuTpneCq_M(mo|5#Ps% zeKWgkrHt4)v**$oM(my0yX*)fcF$CsX)|K~%z@S`jK~0UXzN=>wl5=c!89xkW<)la3-Asj^1(Ek*D@j_Omp8mM&yLK+?~RRtT1iY z(-@H#=K6(ijK~ag>tq8Xa>Lv?_MQ>hVeX&Y%!vFjk1niWM246r?N=C)Bj(w&I7VcN zdGUJ>Bl5(&F|%hxrkMAF4kL2Ke4Ia>5!qtCWU4YEU(EMQMvTZ9^RqvR5jkV}o#!zB zW9{#z5?17mRq8HfMdnzQZQEIqJ62Ubi51yn)t=U~B7dw#`W04Wkkvw2tjHldxL2DM zS!9RQaIDB9s~cj>icGTlwiT?%C2R2PIV-Zs8tuBnihQyrOCnj3QPzyS&WfC}=D+W; zBCD)La|SE&%39|2vm&#s)e z6{u|rtVJvKIM4J-P`#+CA{=%A8#j{I-% zYa@g4N2mAW@BTc;``*V9YE9b--S9TTY^^yl;^8ntvb~jHF5V{;-nN7nPZHBpz7oNn zTEz0OsYIkw5D^=tO(cU_BFo_cQ8*=pD6f|hRntZjwd8o>_;?v{uJkF!^2@M!I1d->NYAgs)<_Zp+&77=0a^$noVu(JxaxF zzDC7sex(viU8!VnpGtjnjmk(OsO-_7sN6o5DmeF>Do&q4ZC@l%JH`#7cHv%BrPUH@ zpZRR6W*DSu?SD~qa4%IKFq=9NrA?i#?WP*uyreElda0(h;Z*BYf@*UTsOy<|)NSPj z)ZLAB)PsNVRA=gI>Y3dm>P2G=^(O2U)nogQ`qb4!ecQW}`Wfj;^-s^H{y}A#a^57_ zpzPr?wVXbgM)815t4d#{eZozq)1EKWdpjUA9Q;^jOf|?%XWf&Trv}R`E_{_)4w%TS z$IOx0#M;U1+O1{wR<$z6h&Y+#`VARQ?U#}H?`5>gV;K`+E#uz3lsPXBmBF{EGMAP1 zGW2(=%q=TJ<{`0_dA4TAyhD%4d`(kjlbgrLrf%FXo58)3`Tu+_o7M1GHYeqzEO<_` zY#|saTWnGzTiQ2O7W$$`7Jg@|Y*m}7Y)$KR+4`$FvW*?;vMt^HvZz01vY2hvvN($s zviO5;vcz$tWJynF$&xp1m8DwVk)@pvl4UF&B+JtOEXzLoQkEMwQkHL%Co8x=Q&yBs z$Vw*3W!v?3$;xieknJe;l~pWUAlof_C#zIxkX7A%B-?jzimW>6m+Zh|Mpo;YE<22G zl^rojmenhdl^y%+AUn}rAUkz`sqD9; zCbDbh2D0l^zU-z?sqA*BkL*rHi0t06p|S^EfwITC_Od66J+iKdY+3gKU)hVdQL@)g zL9(}@?_}?fn#n%=eJ%SuF-G>aJW2MwcdhKF??>71>UP6E0buY(2un8E;U-^ zkrJ(He2rF{Tu7^@JJTB1ZqizMGJ3GzT3Wl{Ha+CYA6nN@jn-RjOzWRFrVVwU(nfQS z(#Ca>w5i5y+AOG#Ha`|eTNqIEu;r&|%QiRK3cE#HXZX=0zTKy713hTFi-+k^I8WOb z-KHHi5$&|Tj+VTiMq_h7)A-$Jnw&I(rY_&3X^%u&-V{i)9z4xm)~9)2P1^a6F%9Q9 z)1%)`q+Qm=(MatP?OHI0c9T4z-OmTn9{vP9{;L)}Azg>|#vEv$wu!WF*j{?Fku5#t z3&{D97le?#YG45jmn7SIK||I&qr_t8b?D(K?& zCc5OQE?xRLoh}wvY=+WDyspwm*BqwnclOZ7u1}$l4}AW= zvqYkCDNAAu=SXZ4t0m;&6p714ZHe#2ddb`~jgpn8cuCBBe@W_UiKM{zoTS3XL~_t- zx8zh-vZQ7IO39tDgOcYjlqKKvdZfym?4(*Z|C1Uf-;@rko-7^3ewUJXtJFEKTk5`Y zopjQrcIm8)PtwH?kThbKu{7$}L}_C8d1;2>25J5_e`%TLGil{iE9t>~)zag>Go|O< zG^LlfrAcqwotJhRWl3KLK9zpy-y;3%m~ zYh$lhKf^w@pT&MmpN;+1oQkV_*TB{L&f(hTb-3QdpSV$pIc}~r9k<;44Yx5~jE`#6 z#U*KmI2qoFGoe>-=QtPKIC&C2Ptt*h*e2njygI(> zzqR=Kvpl{PzmCT|slXFBTYTI0B0SAR7tbuci|4X#c)=4pyrkeAUOxXmzRTq%UWK{f z)zX=G?PweP$Xq@Ac+Ow^^rImBJR68NR;c5bZO-D?j+WxL0w3V_jC1fu-P(B9r9AxQ z$>I3BOBVR2XBBv_@mstvh`|4y$|6+q;|aCE213)RjnE#{N$9-QCiEXHCyefB5~h!F zV(7_U$a_6H*fr$1u|e1~bT>JZTRDB*HTn;5%}BRrhs z#Dq64#KfbUi79DsiRlqniGZcnM9{LQL~!JIVo|{nV(GM)~^e>8tL$*Xh#(zZ8D<>kweLj)49}$^mjYM|p4iX>IhToRu`=Sup(x_^t53u|`_;t5aCf5f0!2KtTu8i#`boV0WJJ6VIY)eaeTn$G zY6bB_y_xvE`vo!Jb4k2s8X#3>zamu?Eu^|bGO1~tOAc0#Ahic}kvhNINWK2qq@nU1 z(pcvPX=-(YG-sER7E`38<*IPfs_+RpqVY3n`(rgZ3ZF$fEPX~gRlg*q-*QL-wUSiM zNs{iFN3vc=NO15fDVXmjM<=xKZ*tuLAMi0&sR=-H9p6{(~zY$7K=nnX^G zx=YT$0!aTSGs#)`PfvWNESvS>~Hg?l8SZ?(EJWchv!MPy7P1YIXp*kNZbf zo6IF^erAvdJHyCBEzV@!(R1X{N-24)WF>hbH@{`I$^2?%+EP>QhW)aT(@gbZr%#Y{SQZZ)Yej-A!?MD)eXw~p&vD|FqxVZ5J63`d_nm= zC#h*Q?$nHR4=I0-5Gv4Y8#U{F1{HJ>Qgci8Qo-xmsRc7Ss6~7#wRrgW|2s<@4-|iQ zJY&1w@oMT8$4Ac^9Y07*9RIBz<)k(5yOUAo87HfWy-rTsw>q(LE1bq^^f*nzr#sE= z8|3ugYAvV8vPDkusM;wl^P^M#*jA_V02`;h_cWa9&P6+&HHmX-d5oNHn|3-qX`Six z?)y}ypWClVR2CXZwBSsM{)`P0v*R`r>$&z4hsk3lWGX4)jo(O6kCMd8C{HpqEl3hH zYo=uJ)&-K4{ZW!lH&Y~W%FU8(m#<4QEU%y70-K;7tz=EVD)$P(9?iZxHe-=phH6D^4 zteGr5QfnkVam_~Bp#DO7Y4%HL>-8jQ`&?ydhjzF0!QE8p({lmRm(AtU_dQ>wU+FyQ zufh@1f5V?+D&4~{^>N2Aty4yrjv^Yn&BVJ|5GIv^sEG%|JDLqqVA6^ zcP_zJ#hPR5p4(!Z13qHWtDCVn4?8Sz&xhwW}v@Wh3k&F+z zt&6J*wz%fL)ws5eAFi`=KdvuH!wt`nxXFw?xY_T^xW%4F`0&7Q_=usVxNX-AeAJ<@ zxMT8BT)MmqCjujI+2kEKGkGZv0vd5)xg9XtynR(Sesf$o-eE1?BPdVCAG{00A3qv}KfUdVci$d? zzkHa3zj>#E_b6-NpR9l2Up=R#;8UT ziqZXqYvfGA?Mxftp*oK6oHC5?s@OsJ{7xn&P2WIFId+|xHherWBk3FA|N9#;YlSlr z^!^VqFZ3%h|Jy8L(N=F_iGDq?tSXsU?)HNSfBBJEmF7#V5%P(3AO0gE_xvO_FSH?| zjCG0V^}R$)*9jud+nk6$ahXVTT1X_7b`!})>xh&zeIiXOpGe=v5t-Weh^(wkBFADT zky|;Q$Y*6lLCX@NX!c>ExOXH`nt6^WBU6a-n>obJwbzJU)?xbZxRxb-TK=;(Py-2G`yJWx|69+`e1 zIfAZSsF-i9+zXuW)%IQ@F*BP~qatwYImKL)M#X~t7Zgie z@)e;s?G-EMk5{bus-lRDN>FUonW%_v3sA%v3|AyfcTgl11}Ksro>rt;+9@(-A6I0R zE>h$?(o^J{_b3XdA5|1*YYNZr*!EPsC2e$HZxh&xI|DuloWN-%ngq{Ad}j_|-8_(bpBN`15|h;%{#{ zQrhZ*lw-}1O2SGsXqz8WO-V;;X>z2V9)>hBY>{RLhqTf!qrqvNNITUF4M}!GI*I3z zZd@|bi+YaqHyuO<>pmmHReO<9=m0Vf*@;Z%UPh+=%aGaR4aj_aFB2^e3aX{43VMw<9B%%}cA$hn2F*7;Dy5u8n zR4D>OG!gjn0`d3!kn@?PNZ9cW!MI*DddYe;#(N2J!CR0*?>JI?p%A*|fL!Zh(Aew* zSxG}(6mO|jpJrVM;RejNwV)csv(TGS3Sefn=SLvjwy_@{zq-s(mEm3vXZhIAC@ zV}WK3e}-m#T90O*--Cj(Y|xxwTQrwSMRWfhLG#-EQE+K1n!jv2S^##Tg{qlo;f-#z zXuCcNS+X20maj*P|N5XMtx~i!8$-)xO+f$I{Xzfrj76bGZP4 zqZPS3(aL~(Xq8nuTGic#R#!Hmh-F%64X%UMd`d=Z4{t~7R{Ns$ObJ@wI|pqzW{)D* zEJ5O@_-Ny|cW6^xHrl*mJ=#Llp)KzppsjlgQ52nxqB2WS)W?M=+PfD;@0*Nb)HkA- z1(7J`yadHsR-xDpgHUY8cN9l`L~*I*DDI67ig#Op;>$u&{O<`UVQMc*I2eHvHA_(9 z{92TFW)(^@9g32|Q&3XtVYJPr8EuP9K-+E)LCMlslpMPQB|kccQpEjJQq)mO_X3pa zycMNphM?5f2&Ij=iqdj%l=f~KN=HQ~J%0g8?=eCduCXX1zaC}0FF=_n4Q1vLDD&-B zlr^RkWo2DQSuYQuZ08J=o!W@9yW}WGPNJLyb(C}eIm(sJLAjexqulFlD9`3S%3Ga< z@|sLhzUeBIzxW8sKXD2bXqBLXKnGN?e>W=VyN?RJ-l4+c*QoGa0V)zWRJ3g_D!N~f ziXBQ&@!AcjxbYtXQ>qU})>+TPZS%7#{; zvJfp)Ru_fJ{;osiURzOlK993hh|G3hlU*hj!}TLpuXv(9YdM(9VyssDeL_ zDq{Acinb!O%M_wrqNls|si0k7J9}KnQ2~u!r{}YdIDNYlCs8Rkl4xH)B{7LUC$T;?OCs4)CSf}QC9dZmNPH(; zm&{r-Te8&ilVsghS`r)eL6WlJvn1zsm83K)SF-20v7~lSII*q zd&$cumn2_Zc1Zq>#HH#J)=PE9Kb9J2OpsdIJd}=9z9PkBxRj}@l#WTlr5;DeOD8)o zlm-rcDqZOBBMtkhC*APti8SWWaA{J(b7^`#Db3SbCN0TpmR8Jam+lMFkRB?om7Xw7 zke<7FS=!RhNN?y!rS~(JN}mNxmA+fLQ~K?axpZJLh7GDdg=t>Z#B>cw%qYeI8#?R} zX4U10jlAB8NqY1#8G8%^2R36a(`vDC(!ZDwa~PW%9*YHbp1|fu>0rxdKEPHjdWJ<- zPs5^f%dq&*u2}NYg;<7?KbBM9gB2!E!?tgU!78%rv8tAP*a0hm)#ayPCu9lO*-xd| zrJFU_<$Le38-wOxcc;Z-kK0tS=gTUwchp_%i?u8Ei)+IEtyjVatvrltj2VP$TM@XP z$qwAe?lNxX*?M+y^}5pA8=Rq6=U3<~F`Tdl=Ya;}v07@JdfZe7`&$KPU^u>&6bjk1bk=pDH!Q8(s~^FS#AY zTk0viO}K~O=(vvGiH*P?jvt0UwZ4MC&{fCZ8r;V}N;l!(W@Y2QDlGAVf1ZT$$!mn_ z)+L0-}&k&Zu-Gp_1BVl|0I$`f>uxP7Lv({Rr`;NDH<3!aPm(J8Zj!3?>ZE$}aZ>Y1J2`m3 zht#n}q~65Kq`}q)q|u3F(&U#hY3|}eTBOjVowkNt`>2wP zq|cI@vyYHbo14iPu7iyIu204vlaPsZZ&loTkjb8Bi8G%qYvr$0;k-9?JSmC1taoq3pm! zYGmI?%Km&a<(Q&ONdhb>O!AQ;lu{`2!7EC3d^{yD458S~ODGT$OgT@bDCn+Cjp3hD z3RxNDN`z2uqzyHW(V@nVeoRf6@bUkjCAyEDFHV*@H-}$vzLIR>++Oz2`PRYR&Ua7R zJ3nk#=KQ1~*SY)TE$3HmI{Lx=Lkc_B?!7UD+Rs&NWtKCqF}VINif;sD40z?C=9hp5-dJv36^Jn z30B*xg%MMa3bvNCVE5cu7`1n~;1D`aa3XdKl263~R;w!z%dG^;>5d?K=_Sa^!v)sg zM*w=Q0^dvu!o~%{Xfi+;(+vbg&K1Gc-A@?%?XloqfeRj!wg}_<-v|?`TmyD0c@TTE||9zSAtklsO8qAxMZLC?T%5U5GzBPDqFg z781SPg(QRTLel+}!nU$%A$ehykRpi?Qa-B-sr3_uw8&5)U9nimP&E@WS~G>r)MrB0 zLJ89# zl>Fd@(&KT$_Vs&&GUpvaS>Jr2{M2V*$Hq`$Cp;$X>~9t-PM;QbZA=w*Lw#X)U!kz) zOIngV=AkJV-2iue8V;21Pg@|pDTou z)yIWXA*Y4YHig3J$DYEO{5!(gDK0{Tc7o8*bXqvK^@4ETdAD%>o40VG=7MlBWR!5p zdYy3Tey-4%RU$NbEfksuIS9?CD}~zxEVQ7xJ5+>w_a5Uw@Z_R4!=pl9gR=IowG^8 z-BovmdyX2yy-suCezt}1z@t}q&>tl{JftK%S~y2|Y#uK>ZYvWyqY{KC%v9mY8x7%U z$rho@_oDDj`HS$Z-caaXqANVNXcwMe8zQ{exnUDB)91sqoqDu<-d?p73Q? znDEuFPxz*iAbdM~U-%xZB=qX*2)zxR!jI)C!cR+o;pde`;nxOj;kUzB;rAUV^u@Xe z{nQPi|H&rdPs$x(z}ZC@c$F^v&50BKp#Kc!n`#Wz_PRo~fnccaCr;Hu zsQ$+bYD_VP8hc(tjlOcIIf;atyPBZpuNhFw=OWbFX#ll)7sA04%HZJb^>FZ)t5ADf z2h=WVh1wqq;SksV;E+554taAQ>Wp3ubuv|<&hs@;mwO9!lii?hXDrkcpEl8peG2vN zeunx^AE5rGhfx3eQD|VB3k}w|K!a8-XlRiE4VRlh!*hAi$lx6`S~v|F9oqqoHSa*< zzBA0Zj`hL({k4pc#yVW~o1+*^`yfoa}(+(T>pk z)(SY(t_lu~XoEwWZb1vvm(XHy7qmE01BYp)!C`?D;jsPHa9F=PwDj(TmZkHdWlt9z zK4uIYo|XrPciw|mgg&&|;s>qTeWA70d}tju5n4AOI6~JFjtF`KM;s`DBL>Dp8=pRC zQyL9zdd#3LjDWVuPoV8XZ)oSV0otuEf_5!e;YicZaAb%c9C`Eu95v`R9OZWkj@nrY zM|}>4_6l8SpH>g;A5Vu4k`K^fLlAUmsfUiHM$mEL9Ozhg2|6i#f=-iEpwo6k==9zW zN}R_+Nun;4+);s2+YTsQu>(pQrbA4-4`KlY5UX;4*!KevA8QHmjAV#E?t+BG782{$ zLZYz-k_HzcIp-E6tM5bdw>hN7U4vA19i*NXKp7SeWgCV;S<^#E8%9HVt{$YT;~@RZ z6w2M>pgi*_ly}mQaoP`=HEoc&@DZ}QCXfvjAX~W*vS0ln=Mn_DWEte{8bDyv1;O%t z5S;XdyqY%TCl^A#)DQBn+n}?29CY5Y4?16QhJr~16y`NTp++4FKLa2fn-5`{IQOr^ z(RPh+bl534`s8&uMs*(?Gbt2~DOSKSFNZ)E@*Z@FOolE^22i1Q7AgYgLdEV^Q1NL3 zM9!BXien&Z-w9pKKS9?8Jajz}2wi_h!m+N`;MkNFIQC8xbhEw=-IhLuZbzO&w}B(j zeS9`_&sq-MAK`G^$N@Mm>^vNI!V`KZ_d*ZvD(I0n5_&v|hvOZG!|^LO!11SkLr+x> zdQMD+p82n!XO|kB;4~dhSd|4QoX&+_st2Ig#CGVFUk|;WzJuP5`=R&BZP5EvCiEHP z0eyTV&?omX^y#dC6YXciiDB>H#N%1eSIGvGZgElzH)(%cuRsbi}{e+YH zm%zzxm2h%O9h}@@2B%p52d6CD0;kmMhEqgG{6>F-esR6fuk9V2YAnv|%W&$hZ*c1S zPjH(2Dx9`)1DtlrA5Pacg46vP;q>C|aC)~1oZ)l~&RDqu&N%T9&Qw|eXL?$}nHgK) z%)57?zZHW1i^`$@fx*!KyC)2QX)qwB69!ySfq@192KooX!18<;_-Z|zh2Mg+A|At8 zr!T|VDv#mp2{+;F%r-dt-VPXKl?a0txxt_s1_piY7a!dzhjXH0;hYw8I9KNeoI5QZ z&Ml$g+-G~?JjZcxUict5uRavc>+goaW5Z!^(m5D>eH5H;QVHkJdIaZJ&~W~n{cr)% z3m2?Wg9}bCh6|OW;KK2{;KH$n8}v!LLAb1UJ0dnUmD-nGL}$`OXHX@Q}qNw{2TC0su4A6%ZY87{w(0mDqyVc0Bx z7`9^*414(lhD#+de8p%OUjH8q?>h-sDDJ}*aj)Tu%YAUA9tKxV^MEUh{Nc(c9&nYN zCtS5;30!qRyngkCtAQb0y=e$seL)RIsJ(;{UZpT1V;hX+?$C`iB;9gH;vWus{Yk zRIP*?dh}o<6%8XJ9>BVMh-BR)q}A!KEc@a2Vrb+28=y38^%7dfwBL-!#JBW zFwQLx#x3%Laf#|MZtq{ zgbBkA!-O&6Fk!CvI;sgKRBV9>jiX?~%X*loF$*R->B2;>a+nx84ko6(go(8qVdBl< zF!AdNm}Kk)lh~&)Y34eZw7wrE74LybXIPljc>pH;8xOaQXolOy2Ec6#9>Z<%)8V$t zPPnZ#0&aWz5+-Yh!DQ?+O!l1*lf!#pa+Y|lYlO)iGhlM>6_{cMVG4f?rUaV8l#MAc zrSuz2X;=nRp0>bLWp|irTM1L$4Pfe`7?_&y1g7ors3yc+9U#| zt=I(9vN~bf5do%kB*3)ZPMB`Sz;r$jrU$%-=^GtjdTAm|KYJUdKQ)0FN^4<;m}kb= z?=V9=yEEe6z>G>$n9;HdX1pnbnOd)4rc@3yeOAHD<)tt)y$fa@;$Y^@5SaOO2h1|M z4YODSm^H&2X01zwS%uXw>*PC_^~e!s{h0!@hsVHdmpYg|_dd*y9s;u~NSJ*o1ZKY| zf;no{FvtD@%o*PYbCwQ;ImzQ;PW4)t)0PHvJ{*C$y7yr&`2yyO_c^(%a6BXYF9#lhH8m-x!!b!Vl)Vu7>&ZBVc}P zJj~yn3iF%tVE(J!ut4K7EO0yz3nmB0SK6b!Dy_c|%>W76> zp25OZ;^e%Cg-6A|-4W-Xpuvz%dR9S=)yo5IrXs&KpU2e_TR3b)Tlh1=Ja!R>{?aQjJbxc#96 z+}^JQ%Z5FKWuseQSd?$9h!Qqq0=zmZpdT_LaUDwQ`S@0H*A+#-K%gvoz>@nh7QW-)rZ6En_fIy3p#J|@U!Dzmg=9rZepf^Gddh`Pf&>{CtzdDs7&@s+qg9 zT8)2L-B^q@^4r0h%jN9wk;hnD`%c!uc>{~h4q#;&VJvqmi5)#^0_&Q%hV}R@us)HN ztl!|F?96>?Y|xBN>;l6wc1h=0Htd)h8&P_fjm$d4MtPaDv3{OxLhvYd+uBApHTw^n zQGbNZe$vn8>(;VG?oDiIv<+K+sg2z=q@1msRnP7_)WROnZe$OIzGaWx{>UCjP3);7 z8`uVEAA4cHlx-rk*w*72Y@0_Od;O7uy}c%cy=VNFeRxWfeX?*i+ih&dzHI%-zK!)_ zKa4%je$fbKzu)v`f9)8_{)vE`l6@klVv^3OYFKh={Sr>&%SKM?-EvO*0WP|BfMa&BzqS3p#p%o2UAmn?K_px3F4=TdXv| zE%pD&{a5#j3)4Nptq7gRt!gvm*5K>7b(z1o4L{tuO+m%nmge(ZRAC1fechXjRX@zd zxqRc|*V}Rlb>q3j4?f&BCwDG6WH^_y>lK&UUCE`}l3d38om}SbL0r}=V=l)DaJkFJ zb9r^+xcr~Lxk8r{Tv38OSKOY@m6|=^w$C5Jl^xLK%74A#c8=T0RpczN#{?iRP6yS>wuyECMfySu@GyZ34m_h1^%J-qmadrae8 zXT@gjsnKGtE8d8E_HzyQe3?J@;>lR<)l>uSb!!^;)}@(ySHFwv!KZN__I%|&Su1m& zi-vMvjmo%h8KzvXwi)*$ae(`!c8U8P`Ku>edKHUd*J7nt_l2WHK) zfqAw!7&>PQu#lPoi=Y3%uqGd1nf(I{pVtMfNJn5b@Bmo1-2x*@b%4!(r+_W226jUR z0lUZNz{mqdVANJsU_W^$aInn=4&Pq_$Ch~DRJ;dBmOlYf*BpSEtOeNH8vt+E42Yan zfLwAHP-FUl%vcl1-njt!{CglTxD1$Zd%$`$0?sNEa6g^_a6J_8dwqd(^jaVU{s55a z2BY=#!05MyU`%5ia4Am%ij6h^&FBWM^eZq{F9?k7;egxa$-uqxI2aeV5O~aA3dW?aSjH2UH*beBgTWt$_K&Z=fz-3Qzr1+YX_z# zcYtYOW?=f1rCeGsPtK-?yO5ci`2#IHmk{{2Ug5K;>go>hRv+5RB$-ae4z*9(%`^T9SR0c>m5 z2FYV>L2?5JQiK?ga;yua%C~{kLz6)oZVuA++k$ilACSI#FUYV}0~zJ}K<02ikXhme zvW9wstb$CCZE_Q2=Pm&`hQB~g)_IVtUjcG64uCw}M<6d9f_$CbAV19o6zB{C1*xAv zq0R_Um^L32=~RNEbURS2djk|_#DEh0b)Y0G8bzm3$5$rlP4eWM)0d}8_0DD{=z@8=t zP$~X^t@7G(P&MTqsJa^r_6Gg|d!L>L`xfp1``+#a`@`;l{olue>J8^X^}nT{CSC## zXq$ioS-Rk$nIAZ~JrC55#6j);i{OxKJvek?4mhk>2@W^MgSv^2K;0by9GQI!9C=X( zj)ta#qu(w@dr5NBLk=ITn4A- zCV|s${{v@M&j)7)!ok_ZU7*2G8#I(AfO8HW;9T7haDMbFaK2RqT$oCL3s2I(#bu+w z#oh{VDS91f)Zsv5ksD|l6$Y9PKLE`xo}l^4UC=T!1GKzY30hYMgVw(bz~z*q;L1>M zaHaA*xXMfiS1&q(w#hhXdm;nZLRW)peOEyHwz1&4*%xrV@))=w`gx;K72KRU0^IDL z4sNY{0B$R<0JpR3K*xyppySXlaL08JxN|cY+zq}4?tb+J_hL1`eWSbJ{_exz0ec!e zXwe1_{TG3UZ;yaS8^gh49R+w?t^qn_0CZlO3Z6`l22Wmhfv1t-pi5^4=-Ockp3&Xl zSu+8;17x7Prye|y!odrp%iu*-0eA^lfS1?jf>#TQ!Kfn>jckt;%1o-TG5qy3*34Gb4 z1HKxzgRlFZfN$s#_;!B^_#VCm^s4^>y=CR#2R9D{%iyAM>+=lX&eOxf=a-^k8j{_<`wWy5&-@+QoIsr#Vc*{=9Ml_;+0J| z^U4dZ@XCjcc;&zAcopyGyh_m;UgfnRKZrTW4~hxo2i+LUt6B}>RsZ|StDbzyt7)q7 zYBNUgYP-dciN3Dm)ln<2o?*+Ycc$_hm<6v9xs%tptl%}xx_HfyL%e4FW?oBm1+O)A z4zE=)o7egh$qz=w{NRjse(+OUUYl6KYj1wYYhQEYhgi1qLqb>bL(W+8I@phXzEm_O!zK`ei;2B;oRhid&40(O5ir3$)&g);R;0>&-c!RK;yurCh z-cWxGZy2n>8y^0|8>!skjix@~jdu6*Mn7zL@g zyhY7T-s0bMe%O@H{IK1*{IH)JcuOxe-m>%uZ~5sfKYZ+Wet2FlKm4saZ#8-Xuu>33U za7mwcG}q!Cms{|T7iaQLW>vgX=wIIHqAxEoYv3iz?Rm+?=e*Q>3NH<#dFiFAJT~+s zkA=taSkqP>9~QymD`R=QrPPhPvqQzOUlROCaRx|zVs z9DR7%R&8E(SC^-;S3Dj2ou?l@=H>KYUcSwdmv;s83^>U%8CE>=Y6;Jd8Q|Hx8lL?y zjOX0%@LXvT&wY>Jfe+4u-6MGLhvxZd7Cc`=@Xo5!dFR=OdFP`Kc|k|ug+-@%p+VrG zX$%j;#cRuZe)NbF{OAqA{ODVw`7u&!eoP$AkLlFsUAR%aONI~c@@6})a6QK>O3Zl0 z_c$K;n((MucL-aN9(xRk7 zDYOWY7JX;#om-P?&b04~_I=;?&6*{VB~hVBN`(^HQVQ83A$zifkR_tXmMy*C-}^ql zf8RgObIx66o_X$^XJ*cwb3P0Au@<)*SxfEbtmWF7tYwcCYsKcWR$B*HtASM3+Gc>Y zu8Lr-|Ndodyl=2J^~+dW*?FvO^ayL)`kJ*v`f3>ouW?^-3DgdUZIm-g6JK-Z}4B?^ltm58uW5lrLm`{sQak+rs)b#j}2s z^;o}j%=+C`Wc~Gju>N^3SpN??Y=E5x8&H$X21?vw10$5#z*a{#NaHjcw91POdN#ra zo8+^>r7CRjuK_m1=Q118w2=)}%4I_rma(Dt^Vl%FoekUC%7zX7Wy2SEvf;<-*@y|^ zY(#P<8*%F`8>yecMs6`+BL{lfD5uM8)ZrjDT2_~hPMpm~-_&7a<{7auo88!$femb| zQzaXFM1+l#b7JF?jVQJs9XufBU$J{W8p=mXwMl4N@_D3g>4Ro!6`(m&jgijOJxG7<4q=_98!|{6Li3M!AnxZ?WZ^ae z*_>X19MM?h+T4yjom-LbH$@b5paF#^)FWZ$B}$wniP9$5p~cEi&~oh`C~N;sw1(S? za-P#@!}^bC6T1~{9@0hy#~-3?%L-7jgEuPCWYKO3Z&W_G0aZSKg!Vo5Ks8Tjbnwl5 zba;3pIzDL}YG8h$rVv1?8=Z(m0j6%EnlkRH^2QWAA2oI|&kcA~rQmZPrV>*&$* z6!bK@9zFlL4!tVuKz+Ci_4jNuajkIg9aiJbI9kIoH;x%mkN(5U4 zG-8|XKiEF-CU$%?3A?0>VmHww>`|PHy{W0#_m%+;NR`CFQ(SQ9WiK3&aUDl%58>EX zTX90=eViQ8fz$L1aK_Jcy!e_tURIusS1ifIS-K1H>M|v~X5v`9c0G-AM%Ux@%R=ym z;e4FCcs$Y>RA{*Q}rC5jXQ|XGtcow(PZ3uClX(-T!XJHoQbbGNZ{+U5^%>q5qz`z z2flsU3EwUKi91*Q#9dJl_@Rpmemvh4KhZjipDEA5&!wm17b6dG@3%Vqdf*v;`+fs{ z*B6WX`!3>-{TX=hQwaY2qX&N#DZ$^zpTWZ_X84!hSo{Z+@QBA%JeshZ5xKOS5xx6} z8S~PP5gYo-NQiYZl1iVMvAVj96kp9qdvnaVq+v#8{e5P9l@cR+Hj$C*7H8y#Pcjpg zYM4m|dl&`p7mVVvSY~qBD5KQ+fKh(e$xNM~!c1dh8I{mKjA~vRqt@KQsK4oDG!!v2 z!=j#3do80Hzr7-+m>3?tt&?4ciw(N|l>*!Tfsl9S1p-pODv>YFiyv!8JBSljB8XPv*3~i<3599JhHYj zo-cYCZ}U9HXMZ5$CmqH3CoN|Jx@4FjlO`s3|6(RoK9C7pwv`F*lVc)1YMH1@0Za^D z!o=le};*lk)K;lNL!a={+ONLf`w$qOL|}iMtH5^zI5KbAdXu z{N7Y%rH3W6>fr_^>+ol0b;?a9o3UrIe?~HET85dm*=9_RtuC`pu7+9Hb&6SE7RGFd zJi=_$FJLzQ9LMCgYB8Jg-ZObVCd_6{n%VrhkrD1`Gx?h~G6lYWnZmjKOySQAX6scU zho)pKvpvq2DKc5i6w6C6#l5!7j*}Y9&fFzTN$`4R7tvx$W!#z4URP%KsTQWJ@D@`Z zx0%^v@r|iaJIz%5Nj~ZC(ckQA)aX! z-jhrE9n9q!4AZ7aGgrobVXpk;nD!x>x%zgHx%Nzzx!&2$baVtTH!dYHH(RDNw;H3F z+egiqJGI@+-Tjixy^0Q|vrM14zsrZ|+VPcnQ0&P(EYe~gZQsQ_-hQ0vE?U7nDgMqp z-8srUD=lSu%KMq;RVSGjHLlFdx*VprUY~i@e2jU0elzo?-Gh01JD2Huw2685@;&qZ z;|!+%#}nq`m{?{&&XyTenaF(7TE%=ONz9O?9P`C}GV?X;JM%3)f%(361M{O;iy1!P z!Tdav&HTF6$NYZ9Fn@-JnGxAC=HILh%;H9^* z7UmIgv0NfvSWYA~jEKZhRU*mFCz3ahk+Fd*$=HGYL~7+2A}x1;Nbh+_#?kg zLuqkhSg%W1{}y5-v5y!X{Y2*b#S>!*XJULTlb8g^5!10>h-rg3;X*bNkWD3Ux`OaA zO2lmPAThgSN6b@i6AO)P#NzfXV!4VUR)TTF>iG;}oxhXV@V>-msDRj3^%Faf9mHO; zjo6=ZArA4Mh~sp9;&?BUIIXiF&hvwbvv56J_O2zaKI_N=IWe-}(s|;xw41n7y2SnM zZ{kt*hIo4V5HDG6;?)Mkd&LgoV_-#mK6w$}1AW9VY%%dy-Aw!+ydeRFr%9k=8wrvc zOM))lA;GIUNr*`h3Hc>QLL2)?Sb8D}r!`6Vr}-q}@D380;6$QyH;}0Q9uj@9ip0ca zlUQ9%68qsAiK}}{;*&H;0yT~#d{HKe4a-T=;&~)_z86UzsUs;DQ%Gvg36f?%hNR1# zCh47>B%{QaEDWAV7R{bP7JX2;EI+k42mzaPl@NDH$5W-HlX;6pa-F(wO1&q(E(ZKU!? z38{)bO{$*Bk-e@(Wbb8$>|?dbzB(1MU&EH{-+qu(OWTp^74J#)mp)Px{fX2(n@bM3 z?H~uPGNjh@AE`ZYpB&UtBnK;;$swiPN06k_a&Gdj%_7}Ut)5^XMh~J zbAcSS?IuSrs*z(x>&UU=BjmWwU2=TyT~e>wN$QKG$O-v0a$=(-X&Cd7G%SBf8iv(K zV`?O6{Ln{EMirBjFB3^qz(UgWu$DBtPa@5?4w6&$w&c_mhMYDJBB#%lkTb@zUDCpT!CDh9zd>D z{3X|Cc9ZM-Zj+8V4@gJtJaR*KKe=(lpWLJ|x!Ev}2zPOeX}T}kKLjpTm(Q*wVOjC3uQCtV|o6& z3<~}CQ=kI*^x-7=yexqXN&AqYok`@2)*14p$%cHjeoekUC?nsZj*xFZ{*mwNQ^*hH z8|24TP z#1-VYu3`tAA2fB1v?h|2uiI~1$$=Dg1s{J zf*SDyfz0Z;P;tAYh)OoTQggu4@V@56Qoj_qGarM0Fokp`I-|OTDldqFyN#QEvvHQ15PBq&^(|M-7%JQbX%&sc)GN zso{kk)bE7})X1_$w1{~%EqeV0E#~=y7Jv1Nmdt3TrKCb>>GEf^4693zzrTc*OV6Vx zOkPhnncgMHcD%5sio(5 zh0$|0MriH9&9v^hpY*(~VYDD-7fqWD(O6xYW=4!?gXbnRd)bhlUpJ37*`ZEzYlmrm zVL5Fc8$nx!sL|HGwY065D{b%DO*{Go(9VJ9XxAt?+ATGk_E`0p_9~o2`|P)%{aTjL z0S|W2L0?HL@-bV20{y6|Z=y=}@@db?K%T~u_2E`AU}@0_xPF7Y3scU6kgrG1O( zGC>SozT_gk=h7;=QofC@3fx8Stvg5W8*!tnT|()asz3CB;Q{)fvl)G;TAr>O4W*Cx zO`?yU)TNIryrJvU?$akaP3cB5k3P9`72PB}?o@aneY#^T-GaZpP_r!DP&b4Fd zF7aRVgY|**Bbn*+;{uL;qO^~GTAoPvX#J+2*RQ8va^ZAu#~u2$-!}S9{~5Y(xj+40 zeiGfkH;(?u_R|A*MCng4w)BwbYx+x>82!y?8U6jC4n4fcgZ`y-iT>TZp8o59i~c8~ zO^@z>jYO)~BGF~n&={9yBsSXuiT%k%;`bIKiP{k)nJr|V`70qQrW#4h^&#o^?Py$^ z3zDf!L*rMPBU%4eBxm#r$xqpj&B{-P;ekI~c?XEbf^Vx+Rk2&twYKxzR;kh=94G@Xh@8YV;{?mjo!}{znwrCx*g)-9!=NAEQW(TPTXiqG-E!C??ny#V(9Oad{#r zey=J@INgjA?>$9HA6ik0ggi=Be}U4B>`=Og0m?`&K?^r^p+yHUTHF?cmh^r>%S0Ve z=Ja=HIbgIR=r>xqil9|{)}gErKa@4(fL3R3N7;&MD0}|{w8rojT60|utqnMj)_#gX zIoZq6y2&?%<>jepy=f3ye>VYbh`fL{{9b}K=6j%A&4noU)N8cKWeeK$CI;nY9z&Za z3fasD&Y&%D1#Nlo73C)dpaRL6sGwX56&l#0!drD{Yjil;Cb9-?E7^v&V+pkV#tl>y z)rN{i#ZYnSdbGnpfOg!qKsyt{QOVdLRI)b*?Sds}*ONL_x?~F4t@r`$K7JRKIe$Q9 zA5&5J#_wp)+(~H96(dv;u?|&=v8b|28C97XpsE)IXm6Go+NUuI?Ykh4_J<^(YEcD%1UeYM3muZ9(V=65sLuTcsv8zThj%5SBitBt(WQse(dF!H)TTckwLN}^uH^hh?Z^SO_nbplH?2X}*dTQ6%~EuI z>l4($r=pI5d~~C<6y3DDk8b|7Lbs~>&~49~=#Ka(y3=5R?uI`?_Y?}yy-OLWGyMX( zuc?ae-|s+OIS0`LgG1;+Umto{5`Z2FefZIc1bTc_40VTQq9+Oi=*gA+=;_i%^h~cF zJ$qq?dbV9h&u#M1^FN!>i=&(n-YiA0viG6atU7u_%rs4@p9^eU2j^K%0Ii6U#4NnrU$CIM( z<4GL^E9mE7g~IPx;rlwQ=xc%%TmIn58Vz{z+GBX~yAxQ+@g7z>J_ajK_Q%Rg>#%Z< zHJ)Pr08goj##6`7#Zyyd@YJqhJZ=6Eo>nmnt4O$EmAD$Laz_oTl3c7>s)E%-IR z4y<+~0;?lytiDsI|1HMTBM#x|*S}*8+6HUvc!V|n1>zZzQ}K+BF?c5Z9?#r)AI}_p zjAum+<5{<6VNJ3EYwkXYXN&9M+41-A?9O#~j`4Inr|KKl8rOrh(mrA>;lBS|i#d4i zp>V9N@BnKs*T>qgk7FGtC#-W)3hS!h!Mf{fvF_&*tmj*Y^;)0dd3xjVyrM;T-oFP} zKgJg8-)+YN<47#nKLb;8A2GG$3#ML)W7+QyWG<+%XQhf^kPCW(=lb zrs5(dGP^NZl#R*Da%|w(h7Fp&V8dC~*l7*mN9^O&2}Frms>l=SpF&|wx z7f0+A`UgAR-GiOYR$=GkPS|CJF?K0*!>*zU*fn(nc754}7r4#93tG2gH#`Ts?QO;G ziW%5FM;*KWki;HQ->}ES7ueHI6?>j$u$OKK_S)Tnz2&B0?^Qdo_YjMH!aA_e{bKBE z?Tme!8SJNHi2ZguVt=_%?4MPF{l9eMfJi4C@NfqXwAaOfEpKp;U=l`v)o}2J zaX9$TI2z_FFtO!oSS~#uN z6Q@rP zTezsu-(2j6XIx^cIhXP!hRaBv%`NWB;4=N!a4S0)ZncUQmwl^S7+s4(+RpAcrTgM%pZp0niDazH$ z-Q!NIRpT0l7jP$I1zgkPG2AKZpWNvaQCy3od9cr|)t719P~KYTev`Q!qEUY>4|*{| zX2T6Pp5cBz@Zf%Z@8$j|3~_&{W!#8EGxsktoEu%y0V4K6Akt+BqQNF0`mP+tq`JbG zUnU@yl?~#OpFuqD8Awdh0*T`DAUQ1@B+ItISPcajTloy6W?l!Wy(~!2`~=dKuVI{q zBaAD14>HsGL1qU7<0rj`@tg00tkhJHU40m2e;)?9^f4gUzYpX?i$MP2bC}??3nsLd z!$gD6F!5k9Oj0`xlL{t+g6LaNNS^=-uM9xZT@Dmmd6-N+fyw1BKxw=VC@m4{*ZrXE zx)+qsgu#^ASuiDE2d4ZqhN&SZVCq$Um?nsXX+?uD?av^ngz}(rMG;hWv_N(9BT)T( z8`Rv*K&??0)RnwIebFyae>fec8yth_MU621n-pj)cmWzmXTl7bL6{LkV8*5EFjKt; zW-i?XGdmZ;EWIX}m9q_I^-Kay0|n6BYzdmLbz%1W9GG3;0<+(2hB@;+V9u5eFsC;g zw8&x5+K>-g-FIQGUMb97(G7ENeE{w0R-m1%2-@e8Ku0zMbo{$Pr}iP}47-4?Wg_Sn zJOSNj^FeQJ8|bC~1-*0UV4k!l%oDE5yxmJ--kWmJ*Pjmhi|j%F+;|X3M1#Q58U$NU zfZ$OBQ0mKo3O@_ffn1;lWPqk;0i6*BbklC2f2RX76$7+N0O-Oqz++SZTWA7aa}Mxj z31Gx_0AnEvOtw8R7pDU=nhnG>7f7ZWkY+z1-?xGR(g%a2STH!a91Pxcg5eBLFbtRl zhQ)ngcvlNp8BJg<9{{^@46sd6zhn>a>7+`V2r;8o*QnAmJjwZfAgwodCZZfY(j|-bWMobxFWC z>;b+v6wD?_fSKufFpFyevmFP)>~a*Cef|#SYA#@I7YgPJHNm{%ADG`T0`uWKu$Y+% z7EX3xu|xqZs=~nH#ul*nu?s9UJiyX^Hdv;og5~Zquxx7r%fTgJrK}HDP!3kn_rNOu zFIY8w0juZ5U_Dj^to4_JwU-=NFaHkKdmn=JbzysG4A>~sU}NeAHsRi2vrz?XjvNP@ z`yAN(N(5W=m0)X83AQnjV4F7pw#S9-t}?Lwbsy~1u7I7{bFhod0=o^PU{|*W>~3EM zyDzuFe)3naXG_4|AHaS^0NC$o2K&~rVE^hXI7m(e2dx2cu!{kQcnfgI+W`)TUx34{ zyWsGt9~>v#1xI=}IJ!lHW7#~GYHNr1DQ960NJ1ZRgXaE?m^=MC-PTq6U{Z9(Atst8;}v%zKhE^skb2N(ab z;IbqVT#6OJ<%AKq+&KU)18=}}+zW8k8U|O(8gLC=2d*m(z;)LkxHcJrYiAX>e)=cj?^!$|P_bP&A8_JEg$GI$yO0WVj1@QQv5UaR`SYeyk?9bFGz?MmR) z(+FNa7J|3zIq;sX0Ny6cz}vkUyyMNlJ9`>%Mi#j5a|9K0;Ag?Fw+nMx7>rkDklhRJPU!>CQB&7A+9! zxdlR_gCTUOEQIDJLFn#82t9ljLeED+=-n|8+ItE@zsW$D#2yG!wui8}D)R0iT@@lE1|dSJ2_m$3h+yYJ zgl!%~_?kjQ>w9U}F& zLL^LpNS8o}3{Hf|LWzvzlX?*$q;!g79uY!fXF*O5cy&mM1H;iQ6h^VYCfwF#p5NQiPZgs2b#QOUm{YSjQl~O5S{A)(Irl12KD|A?8RH#GJhW zF*kle%u`8-`JfIlzkMK9+8AP|1VOBpCBzyCwN)s@dIUmjxIVV$ak<>~%+oeT*UYoi@b&7=Sp5UWijHhPYYFAP&hw9KQ$RT(&`6kS@d}{D8R3 zT8PV?1#vrtc10i>^WBg*PymU4C`giafh46%kfhlKNhlJMcxy;F{kxIwQ2N&48o_`yuJI4}NS2)j$~{@$#qD!5Vl?0 zAvwq%lH=PTd1*2vuiFL5+vh=Y<$Xv#IsuYfQX%=;JxG2S3dye@L-H3{NFH4dDdV3* z$~1jQ(JF=%<|U+ir0km|h;QX`rnHMIp&SN?|7yjhUC zQ>d#|AoYZB{)MrSdQ%NjyFDPaPZ3hTsX&_OWJr_Kg)|jeNSo^nY0OthGaH07=kJi_ ze+bfIc0$_1Qb@}_3~Bicr0ph!d$j3F+^(ApLs{WQ?(d47pLrP!Za5)gXhZ_`eueLIbiyME+mN(T;;0%?k4r~7z!`eUgu=eM1$j!L}xgjHv>+lnDISs}@_U4A z+_SqO|G)~!FL8kU&2f;wRu=LzPeIXh8z?IH0!0xA$=XmP-2|mC zf}k`r97@eDLaC|~l!~r^T_2agt|tSq>m~(Ns;i-LPa#zLm_eoXAXG|Shl;^lP|@uR z6<6oLfueq>87+pI+6PdRrVcgs9#EsJ2sM+ILiOMMaMbx094V`ZBkVyqJS+o;uL|Js z-V`{z&I=AFyn&N8M$nj<2#u1>&~UmF8rEh*gP#I4u*T3Z?HioU+6^tc9zlze4xBl^ z8_ulW0cRGN!Wo@dI3ukJm;W7tOaI#7QfxU~8ao257oS1vCVOZNHiK59X1H<56*_9y zLx%1g_5@KWbpd8zE@ywrlRywn_5 zUcQa+@?;$^clZM@XZ?wn9ggB{MRX;}owr;>0WNe84MCIl(I&pT{c%&*c?V zXYrF>JMoiFH1X5SRQPG?-Tc%e%lN5wU->D+n*5Y{QGUweoBR~ZJ^b|5HT?7or}*g! z3_pE>Jg1pqI>irg; zYMRYcIo3Q<%i_s!4R5GAz#AsW^M)xic|)%z-Vkl#4W+AvjN;Y&{F>Xm$^Kg2G`^8H zZIt9qulVz(XSeaDHNyEGRXi82$eS%TIY?Yv$03*Me8=h-8OH~Tt)w=o&u?X%T+$9;!*XQfTNi*h;da?_bN z8Z(8rP(H}pg(ve)B~N+R4e7jF#USr7H;nhRKg1iEUgs@EH}MX}0laH)1@EEJ%6s)c z=6xjuykA8+Zxk)VTQic?+sKEBd-4$tV|b(On|Z54{k)5+J@0kxA|EJL$A^tu%tuYR&&P(A@@vHdo0RGrLQ>we{3w+XWYON{wY_Y6Mz@m4<3 z_1ze&N185fKRu5fPC*q+%h8+DfNl zE1`5YFCr7S++~g>%QEWMeHh^wGokJ;GyCya#=UtFvlp);X*=r;X2+-+7%%+yA5EU- q-XW8R|NUo-NfP8RMrJV#B|Khh_lf^K$A9#H?f;zf|B?S(&;I~;%AU^v diff --git a/fix/fix_upp/params_grib2_tbl_new b/fix/fix_upp/params_grib2_tbl_new deleted file mode 100755 index 81b86e105..000000000 --- a/fix/fix_upp/params_grib2_tbl_new +++ /dev/null @@ -1,1244 +0,0 @@ - 0 7 11 0 4LFTX - 0 7 193 1 4LFTX - 0 3 19 0 5WAVA - 0 3 197 1 5WAVA - 0 3 15 0 5WAVH - 0 3 193 1 5WAVH - 0 20 106 0 AACOEF - 0 2 11 0 ABSD - 4 2 5 0 ABSFRQ - 0 1 18 0 ABSH - 4 2 6 0 ABSRB - 0 2 10 0 ABSV - 0 18 0 0 ACCES - 0 18 1 0 ACIOD - 2 0 228 1 ACOND - 0 1 224 1 ACPCPN - 0 1 10 0 ACPCP - 0 18 2 0 ACRADP - 10 4 13 0 ACWSRD - 1 2 11 0 ACWSR - 0 20 105 0 AECOEF - 0 20 3 0 AEMFLX - 0 13 0 0 AEROT - 0 2 36 0 AFRWE - 0 20 50 0 AIA - 0 18 10 0 AIRCON - 2 0 208 1 AKHS - 2 0 209 1 AKMS - 0 19 1 0 ALBDO - 0 20 108 0 ALBGRD - 0 20 107 0 ALBSAT - 10 0 38 0 ALCWH - 0 20 110 0 ALEGRD - 0 20 109 0 ALESAT - 10 0 39 0 ALRRC - 0 3 11 0 ALTS - 10 0 37 0 ALTWH - 2 0 219 1 AMIXL - 3 192 11 0 AMSRE10 - 3 192 12 0 AMSRE11 - 3 192 13 0 AMSRE12 - 3 192 10 0 AMSRE9 - 0 20 59 0 ANCON - 3 1 23 0 ANGCOE - 0 20 111 0 ANGSTEXP - 0 20 5 0 ANPEMFLX - 0 20 4 0 ANPMFLX - 10 3 197 1 AOHFLX - 3 1 20 0 AOT06 - 3 1 21 0 AOT08 - 3 1 22 0 AOT16 - 0 20 102 0 AOTK - 0 1 223 1 APCPN - 0 1 8 0 APCP - 0 0 21 0 APTMP - 0 1 221 1 ARAIN - 0 20 8 0 AREMFLX - 0 3 21 0 ASGSO - 0 3 24 0 ASGSO - 10 3 198 1 ASHFL - 0 20 60 0 ASNCON - 0 1 29 0 ASNOW - 0 20 104 0 ASYSFK - 0 190 0 0 ATEXT - 3 1 13 0 ATMDIV - 0 20 101 0 ATMTK - 2 3 201 1 AVSFT - 2 3 200 1 BARET - 10 4 7 0 BATHY - 10 0 44 0 BENINX - 1 0 5 0 BGRUN - 1 0 192 1 BGRUN - 10 4 194 1 BKENG - 0 7 1 0 BLI - 0 7 16 0 BLKRN - 0 2 20 0 BLYDP - 2 0 14 0 BMIXL - 2 0 197 1 BMIXL - 0 7 201 1 BNEGELAY - 2 3 4 0 BOTLST - 0 7 202 1 BPOSELAY - 0 15 1 0 BREF - 3 1 27 0 BRFLF - 0 5 7 0 BRTEMP - 0 4 4 0 BRTMP - 0 15 2 0 BRVEL - 0 15 0 0 BSWID - 4 3 0 0 BTOT - 4 3 1 0 BVEC1 - 4 3 2 0 BVEC2 - 4 3 3 0 BVEC3 - 0 18 18 0 CAACL - 4 8 4 0 CAIIRAD - 0 7 206 1 CANGLE - 2 1 192 1 CANL - 0 7 6 0 CAPE - 0 1 88 0 CATCP - 0 19 29 0 CATEDR - 0 19 22 0 CAT - 0 20 63 0 CAVEMDL - 0 20 70 0 CBECSLSP - 0 6 25 0 CBHE - 0 20 67 0 CBLCLDSP - 0 20 73 0 CBLCSRCP - 3 1 14 0 CBTMP - 3 1 98 0 CCMPEMRR - 2 0 15 0 CCOND - 2 0 199 1 CCOND - 0 6 7 0 CDCA - 0 6 11 0 CDCB - 0 6 22 0 CDCC - 0 17 3 0 CDCDLTFD - 0 6 23 0 CDCIMR - 0 6 2 0 CDCON - 0 6 12 0 CDCTOP - 0 6 8 0 CDCT - 0 17 2 0 CDGDLTFD - 0 6 14 0 CDLYR - 0 6 192 1 CDLYR - 0 4 195 1 CDUVB - 10 0 16 0 CDWW - 0 2 29 0 CD - 0 2 196 1 CD - 0 6 13 0 CEIL - 0 5 197 1 CFNLF - 0 4 199 1 CFNSF - 0 1 34 0 CFRZR - 0 1 193 1 CFRZR - 0 20 54 0 CGDRC - 0 20 53 0 CGPRC - 10 3 2 0 CH - 0 18 17 0 CIAIRC - 0 19 206 1 CICEL - 0 1 35 0 CICEP - 0 1 194 1 CICEP - 10 2 12 0 CICES - 0 6 0 0 CICE - 0 19 208 1 CIFLT - 0 1 82 0 CIMIXR - 0 20 66 0 CINCLDSP - 0 20 69 0 CINCSLSP - 0 20 72 0 CINCSRCP - 0 7 7 0 CIN - 0 20 68 0 CIRELREP - 0 20 74 0 CIRERECP - 2 3 22 0 CISICE - 2 3 20 0 CISOILM - 2 0 23 0 CISOILW - 0 19 207 1 CIVIS - 3 2 9 0 CLDALB - 3 2 10 0 CLDEMISS - 3 2 8 0 CLDIWP - 3 2 7 0 CLDLWP - 3 2 5 0 CLDODEP - 3 2 6 0 CLDPER - 3 2 4 0 CLDPHAS - 3 1 16 0 CLDRAD - 3 2 3 0 CLDTYPE - 0 1 235 1 CLLMR - 3 0 7 0 CLOUDM - 0 1 22 0 CLWMR - 0 2 216 1 CNGWDU - 0 2 217 1 CNGWDV - 0 3 209 1 CNVDEMF - 0 3 208 1 CNVDMF - 0 0 196 1 CNVHR - 0 1 213 1 CNVMR - 0 3 207 1 CNVUMF - 0 2 212 1 CNVU - 0 2 213 1 CNVV - 2 0 13 0 CNWAT - 2 0 196 1 CNWAT - 0 20 56 0 COAIA - 0 20 1 0 COLMD - 0 20 51 0 CONAIR - 0 7 19 0 CONAPES - 0 1 216 1 CONDP - 0 19 16 0 CONTB - 0 19 14 0 CONTET - 0 19 13 0 CONTI - 0 19 24 0 CONTKE - 0 19 15 0 CONTT - 0 19 26 0 CONVO - 0 19 222 1 CONVP - 0 192 6 0 COVMM - 0 192 1 0 COVMZ - 0 2 205 1 COVMZ - 0 192 11 0 COVPSPS - 0 192 8 0 COVQM - 0 192 12 0 COVQQ - 0 192 10 0 COVQVV - 0 192 7 0 COVQZ - 0 192 3 0 COVTM - 0 2 207 1 COVTM - 0 192 14 0 COVTT - 0 192 9 0 COVTVV - 0 192 4 0 COVTW - 0 192 2 0 COVTZ - 0 2 206 1 COVTZ - 0 192 13 0 COVVVVV - 0 192 5 0 COVZZ - 0 1 39 0 CPOFP - 1 1 193 1 CPOFP - 1 1 192 1 CPOZP - 1 1 0 0 CPPOP - 0 1 37 0 CPRAT - 0 1 196 1 CPRAT - 0 1 33 0 CRAIN - 0 1 192 1 CRAIN - 0 20 71 0 CRERELSP - 0 1 76 0 CRRATE - 4 2 9 0 CRTFRQ - 1 2 13 0 CSAFC - 3 1 15 0 CSBTMP - 0 5 196 1 CSDLF - 0 4 196 1 CSDSF - 3 2 0 0 CSKPROB - 3 1 17 0 CSKYRAD - 0 1 36 0 CSNOW - 0 1 195 1 CSNOW - 0 1 58 0 CSRATE - 0 1 55 0 CSRWE - 0 5 195 1 CSULF - 0 4 198 1 CSUSF - 3 1 3 0 CTOPHQI - 3 1 2 0 CTOPH - 3 2 2 0 CTOPRES - 3 2 1 0 CTOPTMP - 0 19 21 0 CTP - 0 6 16 0 CUEFI - 0 6 194 1 CUEFI - 0 6 6 0 CWAT - 0 7 195 1 CWDI - 0 6 15 0 CWORK - 0 6 193 1 CWORK - 0 1 48 0 CWP - 1 1 195 1 CWR - 10 4 195 1 DBSS - 0 7 203 1 DCAPE - 0 20 12 0 DDMFLX - 0 3 30 0 DDRATE - 0 20 15 0 DDVEL - 2 0 30 0 DECF - 0 3 14 0 DENALT - 0 3 10 0 DEN - 0 0 7 0 DEPR - 1 0 13 0 DEPWSS - 10 2 2 0 DICED - 4 4 2 0 DIFEFLUX - 4 4 4 0 DIFIFLUX - 4 4 0 0 DIFPFLUX - 3 6 5 0 DIFSOLEX - 3 6 4 0 DIFSOLIR - 0 4 14 0 DIFSWRF - 10 1 0 0 DIRC - 2 3 14 0 DIREC - 10 0 10 0 DIRPW - 3 6 3 0 DIRSOLEX - 3 6 2 0 DIRSOLIR - 10 0 12 0 DIRSW - 10 0 33 0 DIRWTS - 10 0 32 0 DIRWWW - 1 0 7 0 DISRS - 0 3 6 0 DIST - 0 5 8 0 DLWRFCS - 0 5 3 0 DLWRF - 0 5 192 1 DLWRF - 0 3 28 0 DMFLX - 0 0 6 0 DPT - 2 4 8 0 DRTCODE - 0 18 12 0 DRYDEP - 0 19 237 1 DRYTPROB - 4 7 2 0 DSKDAY - 4 7 1 0 DSKINT - 4 7 3 0 DSKNGT - 10 3 1 0 DSLM - 10 191 3 0 DSLOBSO - 0 191 3 0 DSLOBS - 0 4 52 0 DSWRFCS - 0 4 13 0 DSWRFLX - 0 4 7 0 DSWRF - 0 4 192 1 DSWRF - 0 4 204 1 DTRF - 2 4 7 0 DUFMCODE - 0 4 194 1 DUVB - 0 4 12 0 DWUVR - 0 2 9 0 DZDT - 3 2 11 0 EAODR - 3 5 5 0 EBSDSSTS - 3 5 4 0 EBSSTSTD - 0 19 30 0 EDPARM - 0 7 204 1 EFHL - 0 7 9 0 EHLX - 4 2 1 0 ELCDEN - 4 0 1 0 ELECTMP - 10 3 194 1 ELEV - 0 19 238 1 ELLINX - 0 191 197 1 ELONN - 0 191 193 1 ELON - 0 1 211 1 EMNP - 0 0 3 0 EPOT - 0 19 218 1 EPSR - 10 3 252 1 EROSNP - 1 0 3 0 ESCT - 0 7 205 1 ESP - 3 1 0 0 ESTP - 3 1 4 0 ESTUGRD - 3 1 5 0 ESTVGRD - 0 2 32 0 ETACVV - 10 3 250 1 ETCWL - 4 3 4 0 ETOT - 10 3 193 1 ETSRG - 0 2 38 0 ETSS - 4 6 3 0 EUVIRR - 4 8 1 0 EUVRAD - 2 0 6 0 EVAPT - 0 1 79 0 EVARATE - 2 3 198 1 EVBS - 2 0 229 1 EVCW - 4 3 5 0 EVEC1 - 4 3 6 0 EVEC2 - 4 3 7 0 EVEC3 - 2 0 29 0 EVERF - 0 1 6 0 EVP - 2 0 213 1 EWATR - 0 2 39 0 EWTPARM - 4 6 5 0 F107 - 2 4 3 0 FBAREA - 2 4 10 0 FBUPINX - 0 6 37 0 FCONPC - 3 5 3 0 FDNSSTMP - 2 4 11 0 FDSRTE - 1 0 0 0 FFLDG - 1 0 1 0 FFLDRO - 2 4 6 0 FFMCODE - 0 1 228 1 FICEAC - 0 6 21 0 FICE - 0 6 199 1 FICE - 3 0 9 0 FIREDI - 2 4 1 0 FIREODT - 2 4 0 0 FIREOLK - 2 3 203 1 FLDCP - 1 0 12 0 FLDPSW - 0 19 205 1 FLGHT - 0 7 18 0 FLXRN - 2 4 4 0 FOSINDX - 0 1 67 0 FPRATE - 0 6 32 0 FRACCC - 0 1 43 0 FRAIN - 0 1 202 1 FRAIN - 10 0 63 0 FREWWW - 0 2 30 0 FRICV - 10 0 17 0 FRICV - 0 2 197 1 FRICV - 0 1 227 1 FROZR - 2 3 24 0 FRSTINX - 10 0 64 0 FRWWTSW - 0 1 225 1 FRZR - 10 3 204 1 FRZSPR - 0 1 121 0 FSNOWC - 0 6 36 0 FSTRPC - 2 4 5 0 FWINX - 0 1 95 0 FZPRATE - 0 18 3 0 GDCES - 0 18 4 0 GDIOD - 0 18 5 0 GDRADP - 0 191 1 0 GEOLAT - 0 191 2 0 GEOLON - 0 2 43 0 GEOWD - 0 2 44 0 GEOWS - 2 0 10 0 GFLUX - 2 0 193 1 GFLUX - 2 5 1 0 GLACTMP - 0 3 9 0 GPA - 0 1 75 0 GPRATE - 0 3 4 0 GP - 0 4 3 0 GRAD - 0 7 17 0 GRDRN - 0 1 32 0 GRLE - 3 6 1 0 GSOLEXP - 3 6 0 0 GSOLIRR - 0 2 22 0 GUST - 0 2 210 1 GWDU - 0 2 211 1 GWDV - 0 3 23 0 GWD - 1 0 9 0 GWLOWS - 2 0 214 1 GWREC - 1 0 8 0 GWUPS - 0 1 71 0 HAILMXR - 0 19 198 1 HAILPROB - 0 1 73 0 HAILPR - 0 1 31 0 HAIL - 4 8 2 0 HARAD - 0 19 210 1 HAVNI - 0 6 5 0 HCDC - 0 6 26 0 HCONCB - 0 6 27 0 HCONCT - 0 0 12 0 HEATX - 4 8 6 0 HELCOR - 2 0 24 0 HFLUX - 0 20 62 0 HGTMD - 0 3 211 1 HGTN - 0 3 203 1 HGTX - 0 3 204 1 HGTY - 0 3 5 0 HGT - 0 19 32 0 HIFREL - 2 4 2 0 HINDEX - 0 7 8 0 HLCY - 0 18 16 0 HMXACON - 0 3 18 0 HPBL - 0 3 196 1 HPBL - 4 2 8 0 HPRIMF - 0 19 196 1 HRCONO - 0 15 16 0 HSRHT - 0 15 15 0 HSR - 0 3 7 0 HSTDV - 10 0 3 0 HTSGW - 0 3 3 0 ICAHT - 1 2 7 0 ICECIL - 10 2 0 0 ICEC - 10 2 7 0 ICED - 10 2 6 0 ICEG - 10 2 9 0 ICEPRS - 0 19 27 0 ICESC - 0 19 37 0 ICESEV - 1 2 6 0 ICETIL - 10 2 1 0 ICETK - 10 2 8 0 ICETMP - 0 19 6 0 ICIB - 0 19 20 0 ICIP - 0 19 5 0 ICIT - 0 19 7 0 ICI - 0 1 23 0 ICMR - 0 19 233 1 ICPRB - 0 19 234 1 ICSEV - 1 2 5 0 ICTKIL - 2 0 207 1 ICWAT - 0 1 20 0 ILIQW - 10 0 27 0 IMFTSW - 10 0 26 0 IMFWW - 10 0 25 0 IMWF - 2 4 9 0 INFSINX - 4 4 3 0 INTEFLUX - 10 4 196 1 INTFD - 4 4 5 0 INTIFLUX - 4 4 1 0 INTPFLUX - 4 2 3 0 IONDEN - 4 0 3 0 IONTMP - 0 1 68 0 IPRATE - 3 1 1 0 IRRATE - 10 191 0 0 IRTSEC - 3 5 0 0 ISSTMP - 0 19 235 1 JFWPRB - 10 3 201 1 KENG - 0 7 3 0 KOX - 10 0 43 0 KSSEDW - 0 7 2 0 KX - 0 7 198 1 LAI - 1 2 8 0 LANDIL - 2 0 218 1 LANDN - 2 0 8 0 LANDU - 2 0 0 0 LAND - 0 2 202 1 LAPP - 0 0 8 0 LAPR - 0 2 198 1 LAUV - 0 19 209 1 LAVNI - 0 2 200 1 LAVV - 0 3 205 1 LAYTH - 0 6 3 0 LCDC - 10 3 203 1 LCH - 2 0 28 0 LEAINX - 0 7 10 0 LFTX - 0 7 192 1 LFTX - 0 0 10 0 LHTFL - 0 1 229 1 LICEAC - 0 13 195 1 LIPMF - 2 3 10 0 LIQVSM - 0 15 4 0 LMAXBR - 4 7 0 0 LMBINT - 0 3 210 1 LMH - 0 2 218 1 LMV - 0 2 203 1 LOPP - 0 2 199 1 LOUV - 0 2 201 1 LOVV - 2 3 3 0 LOWLSM - 0 13 194 1 LPMTF - 0 3 201 1 LPSX - 0 3 202 1 LPSY - 0 0 195 1 LRGHR - 0 1 217 1 LRGMR - 2 0 212 1 LSOIL - 2 3 199 1 LSPA - 0 1 54 0 LSPRATE - 0 1 77 0 LSRRATE - 0 1 59 0 LSSRATE - 0 1 56 0 LSSRWE - 0 1 47 0 LSWP - 0 17 0 0 LTNGSD - 0 17 192 1 LTNG - 0 17 1 0 LTPINX - 0 5 2 0 LWAVR - 0 5 194 1 LWHR - 0 4 5 0 LWRAD - 2 3 23 0 LWSNWP - 4 8 7 0 MASK - 0 6 38 0 MASSDCD - 0 6 39 0 MASSDCI - 0 20 0 0 MASSDEN - 0 1 98 0 MASSDG - 0 1 99 0 MASSDH - 0 1 96 0 MASSDR - 0 1 97 0 MASSDS - 0 20 2 0 MASSMR - 0 18 15 0 MAXACON - 0 1 28 0 MAXAH - 0 2 221 1 MAXDVV - 0 2 21 0 MAXGUST - 0 16 198 1 MAXREF - 0 1 27 0 MAXRH - 0 2 220 1 MAXUVV - 0 2 222 1 MAXUW - 0 2 223 1 MAXVW - 10 0 24 0 MAXWH - 0 6 4 0 MCDC - 0 1 26 0 MCONV - 0 1 197 1 MCONV - 0 6 40 0 MDCCWD - 0 1 38 0 MDIVER - 0 1 112 0 MDLWGVA - 0 1 109 0 MDLWHVA - 0 1 115 0 MDLWSVA - 3 2 30 0 MEACST - 0 6 200 1 MFLUX - 0 2 26 0 MFLX - 0 2 193 1 MFLX - 0 0 14 0 MINDPD - 0 1 198 1 MINRH - 0 19 3 0 MIXHT - 0 19 204 1 MIXLY - 0 1 2 0 MIXR - 0 191 195 1 MLYNO - 0 1 114 0 MMLWGDA - 0 1 111 0 MMLWHDA - 0 1 117 0 MMLWSDA - 0 2 6 0 MNTSF - 0 7 200 1 MNUPHL - 10 0 40 0 MNWSOW - 0 20 64 0 MOLRDRYA - 0 20 65 0 MOLRWETA - 10 191 1 0 MOSF - 0 19 195 1 MRCONO - 0 3 192 1 MSLET - 0 3 198 1 MSLMA - 0 20 16 0 MSSRDRYA - 0 20 17 0 MSSRWETA - 10 0 20 0 MSSW - 2 0 11 0 MSTAV - 2 0 194 1 MSTAV - 2 0 7 0 MTERH - 10 4 1 0 MTHA - 10 4 0 0 MTHD - 10 2 11 0 MVCICEP - 10 0 53 0 MWDFSWEL - 10 0 41 0 MWDIRW - 10 0 54 0 MWDSSWEL - 10 0 55 0 MWDTSWEL - 10 0 50 0 MWPFSWEL - 10 0 51 0 MWPSSWEL - 10 0 52 0 MWPTSWEL - 10 0 15 0 MWSPER - 0 19 28 0 MWTURB - 0 19 31 0 MXEDPRM - 0 20 61 0 MXMASSD - 0 19 17 0 MXSALB - 0 19 192 1 MXSALB - 0 7 199 1 MXUPHL - 10 0 30 0 MZPTSW - 10 0 29 0 MZPWW - 10 0 28 0 MZWPER - 0 4 202 1 NBDSF - 0 19 213 1 NBSALB - 0 6 29 0 NCCICE - 0 1 207 1 NCIP - 0 6 28 0 NCONCD - 0 1 9 0 NCPCP - 0 6 31 0 NDCICE - 0 4 203 1 NDDSF - 0 6 30 0 NDENCD - 2 0 31 0 NDVINX - 2 0 217 1 NDVI - 0 191 196 1 NLATN - 0 191 192 1 NLAT - 0 3 206 1 NLGSP - 0 3 25 0 NLPRES - 0 5 6 0 NLWRCS - 0 5 5 0 NLWRF - 0 5 0 0 NLWRS - 0 5 1 0 NLWRT - 3 1 6 0 NPIXU - 0 4 11 0 NSWRFCS - 0 4 9 0 NSWRF - 0 4 0 0 NSWRS - 0 4 1 0 NSWRT - 4 4 6 0 NTRNFLUX - 0 2 37 0 NTSS - 0 1 106 0 NUMDG - 0 1 107 0 NUMDH - 0 1 104 0 NUMDR - 0 1 105 0 NUMDS - 0 2 34 0 NWIND - 0 19 214 1 NWSALB - 10 0 19 0 NWSTR - 0 2 40 0 NWTPARM - 0 14 1 0 O3MR - 0 14 192 1 O3MR - 10 4 197 1 OHC - 0 2 215 1 OMGALF - 10 1 192 1 OMLU - 10 1 193 1 OMLV - 0 3 217 1 ORASNW - 0 3 216 1 ORASSW - 0 3 215 1 ORASS - 0 3 214 1 ORASW - 0 3 213 1 ORCONV - 0 3 221 1 ORLSNW - 0 3 220 1 ORLSSW - 0 3 219 1 ORLSS - 0 3 218 1 ORLSW - 10 4 4 0 OVHD - 10 4 6 0 OVMD - 10 4 5 0 OVSD - 10 3 253 1 OWASHP - 0 14 194 1 OZCAT - 0 14 193 1 OZCON - 0 14 200 1 OZMAX1 - 0 14 201 1 OZMAX8 - 10 3 196 1 P2OMLT - 3 3 2 0 PBINFRC - 3 3 1 0 PBLIFRC - 0 19 12 0 PBLREG - 3 3 0 0 PBMVFRC - 0 1 234 1 PCPDUR - 0 14 202 1 PDMAX1 - 0 14 203 1 PDMAX24 - 10 0 11 0 PERPW - 1 0 16 0 PERRATE - 10 0 13 0 PERSW - 0 1 40 0 PEVAP - 0 1 199 1 PEVAP - 0 1 41 0 PEVPR - 0 1 200 1 PEVPR - 0 4 10 0 PHOTAR - 3 0 8 0 PIXST - 0 7 0 0 PLI - 0 3 200 1 PLPL - 4 2 0 0 PLSMDEN - 10 0 23 0 PMAXWH - 0 13 192 1 PMTC - 0 13 193 1 PMTF - 1 1 2 0 POP - 2 3 9 0 POROS - 2 3 197 1 POROS - 0 0 2 0 POT - 0 14 199 1 POZO - 0 14 198 1 POZT - 0 14 196 1 POZ - 10 0 36 0 PPERTS - 10 0 35 0 PPERWW - 1 1 194 1 PPFFG - 0 1 231 1 PPINDX - 1 1 1 0 PPOSP - 0 1 7 0 PRATE - 4 0 4 0 PRATMP - 0 15 5 0 PREC - 0 3 13 0 PRESALT - 0 3 8 0 PRESA - 0 3 212 1 PRESN - 0 3 0 0 PRES - 0 3 1 0 PRMSL - 0 1 232 1 PROBCIP - 0 19 221 1 PROCON - 4 2 2 0 PROTDEN - 4 0 2 0 PROTTMP - 4 0 5 0 PRPTMP - 0 19 216 1 PRSIGSVR - 0 19 215 1 PRSVR - 10 4 21 0 PRTSAL - 0 19 36 0 PSNOWS - 0 3 2 0 PTEND - 0 1 19 0 PTYPE - 0 2 219 1 PVMWW - 0 2 14 0 PVORT - 0 1 3 0 PWAT - 10 0 46 0 PWAVEDIR - 0 1 30 0 PWCAT - 10 0 34 0 PWPER - 0 1 226 1 PWTHER - 0 1 219 1 QMAX - 0 1 220 1 QMIN - 2 0 215 1 QREC - 0 1 218 1 QZ0 - 2 3 202 1 RADT - 3 1 8 0 RAZA - 2 0 21 0 RCQ - 2 0 204 1 RCQ - 2 0 20 0 RCSOL - 2 0 205 1 RCSOL - 2 0 18 0 RCS - 2 0 202 1 RCS - 2 0 19 0 RCT - 2 0 203 1 RCT - 2 0 206 1 RDRIP - 0 15 6 0 RDSP1 - 0 15 7 0 RDSP2 - 0 15 8 0 RDSP3 - 2 0 32 0 RDVEG - 0 16 5 0 REFC - 0 16 196 1 REFC - 0 16 4 0 REFD - 0 16 195 1 REFD - 0 16 2 0 REFZC - 0 16 194 1 REFZC - 0 16 1 0 REFZI - 0 16 193 1 REFZI - 0 16 0 0 REFZR - 0 16 192 1 REFZR - 0 2 13 0 RELD - 0 2 12 0 RELV - 0 16 3 0 RETOP - 0 16 197 1 RETOP - 0 0 194 1 REV - 0 15 9 0 RFCD - 0 15 10 0 RFCI - 0 15 13 0 RFGRPL - 0 15 14 0 RFHAIL - 3 1 9 0 RFL06 - 3 1 10 0 RFL08 - 3 1 11 0 RFL16 - 3 1 12 0 RFL39 - 0 15 12 0 RFRAIN - 0 15 11 0 RFSNOW - 0 1 94 0 RHICE - 0 1 242 1 RHPW - 0 1 93 0 RHWATER - 0 1 1 0 RH - 0 1 44 0 RIME - 0 1 203 1 RIME - 10 1 4 0 RIPCOP - 0 7 12 0 RI - 0 7 194 1 RI - 2 3 6 0 RLYRS - 2 3 193 1 RLYRS - 0 1 65 0 RPRATE - 2 0 16 0 RSMIN - 2 0 200 1 RSMIN - 1 0 2 0 RSSC - 0 191 194 1 RTSEC - 10 3 206 1 RUNUP - 1 0 11 0 RVERSW - 0 1 24 0 RWMR - 0 18 14 0 SACON - 0 20 100 0 SADEN - 0 19 19 0 SALBD - 3 0 1 0 SALBEDO - 10 4 193 1 SALIN - 1 2 12 0 SALTIL - 10 4 3 0 SALTY - 0 1 5 0 SATD - 2 3 17 0 SATOSM - 3 192 4 0 SBC123 - 3 192 5 0 SBC124 - 0 19 211 1 SBSALB - 0 1 212 1 SBSNO - 3 192 6 0 SBT112 - 3 192 7 0 SBT113 - 3 192 8 0 SBT114 - 3 192 9 0 SBT115 - 3 192 0 0 SBT122 - 3 192 1 0 SBT123 - 3 192 2 0 SBT124 - 3 192 3 0 SBT126 - 3 192 23 0 SBTA1610 - 3 192 24 0 SBTA1611 - 3 192 25 0 SBTA1612 - 3 192 26 0 SBTA1613 - 3 192 27 0 SBTA1614 - 3 192 28 0 SBTA1615 - 3 192 29 0 SBTA1616 - 3 192 20 0 SBTA167 - 3 192 21 0 SBTA168 - 3 192 22 0 SBTA169 - 3 192 39 0 SBTA1710 - 3 192 40 0 SBTA1711 - 3 192 41 0 SBTA1712 - 3 192 42 0 SBTA1713 - 3 192 43 0 SBTA1714 - 3 192 44 0 SBTA1715 - 3 192 45 0 SBTA1716 - 3 192 36 0 SBTA177 - 3 192 37 0 SBTA178 - 3 192 38 0 SBTA179 - 3 192 55 0 SBTAGR10 - 3 192 56 0 SBTAGR11 - 3 192 57 0 SBTAGR12 - 3 192 58 0 SBTAGR13 - 3 192 59 0 SBTAGR14 - 3 192 60 0 SBTAGR15 - 3 192 61 0 SBTAGR16 - 3 192 52 0 SBTAGR7 - 3 192 53 0 SBTAGR8 - 3 192 54 0 SBTAGR9 - 3 0 2 0 SBTMP - 4 2 10 0 SCINT - 0 1 84 0 SCLIWC - 0 1 83 0 SCLLWC - 3 1 29 0 SCRAD - 0 20 112 0 SCTAOTK - 3 0 5 0 SCTPRES - 0 20 6 0 SDDMFLX - 0 1 61 0 SDEN - 3 1 99 0 SDMPEMRR - 0 3 20 0 SDSGSO - 0 1 60 0 SDWE - 0 20 11 0 SEDMFLX - 1 2 3 0 SEDTK - 1 2 4 0 SEDTMP - 10 3 207 1 SETUP - 0 1 62 0 SEVAP - 2 0 216 1 SFCRH - 2 0 1 0 SFCR - 2 0 34 0 SFCWRO - 2 0 12 0 SFEXC - 2 0 195 1 SFEXC - 1 0 10 0 SFLORC - 0 20 55 0 SFLUX - 3 192 14 0 SFRA161 - 3 192 15 0 SFRA162 - 3 192 16 0 SFRA163 - 3 192 17 0 SFRA164 - 3 192 18 0 SFRA165 - 3 192 19 0 SFRA166 - 3 192 30 0 SFRA171 - 3 192 31 0 SFRA172 - 3 192 32 0 SFRA173 - 3 192 33 0 SFRA174 - 3 192 34 0 SFRA175 - 3 192 35 0 SFRA176 - 10 4 11 0 SFSALP - 1 2 9 0 SFSAL - 10 4 12 0 SFTMPP - 1 2 10 0 SFTMP - 0 2 7 0 SGCVV - 0 0 201 1 SHAHR - 0 19 201 1 SHAILPRO - 0 1 214 1 SHAMR - 2 3 26 0 SHFLX - 0 0 11 0 SHTFL - 0 1 108 0 SHTPRM - 0 7 13 0 SHWINX - 10 2 3 0 SICED - 4 9 1 0 SIGHAL - 4 9 2 0 SIGPAR - 4 9 0 0 SIGPED - 0 19 217 1 SIPD - 0 0 17 0 SKINT - 3 5 1 0 SKSSTMP - 0 1 230 1 SLACC - 0 19 23 0 SLDP - 3 0 4 0 SLFTI - 10 3 202 1 SLTFL - 2 3 194 1 SLTYP - 0 6 34 0 SLWTC - 2 3 8 0 SMDRY - 2 3 196 1 SMDRY - 0 1 113 0 SMLWGMA - 0 1 110 0 SMLWHMA - 0 1 116 0 SMLWSMA - 2 3 7 0 SMREF - 2 3 195 1 SMREF - 0 19 18 0 SNFALB - 0 19 193 1 SNFALB - 0 1 25 0 SNMR - 0 1 17 0 SNOAG - 0 1 14 0 SNOC - 0 1 11 0 SNOD - 0 0 16 0 SNOHF - 0 0 192 1 SNOHF - 0 1 15 0 SNOL - 0 1 16 0 SNOM - 0 0 18 0 SNOT - 0 1 208 1 SNOT - 0 1 42 0 SNOWC - 0 1 201 1 SNOWC - 0 1 233 1 SNOWLR - 0 19 236 1 SNOWLVL - 0 1 222 1 SNOWT - 2 3 25 0 SNWDEB - 2 3 27 0 SOILDEP - 2 3 21 0 SOILICE - 2 3 5 0 SOILL - 2 3 192 1 SOILL - 2 3 19 0 SOILMOI - 2 0 3 0 SOILM - 2 0 22 0 SOILM - 2 3 15 0 SOILP - 2 3 18 0 SOILTMP - 2 0 38 0 SOILVIC - 2 0 192 1 SOILW - 4 6 6 0 SOLRF - 3 1 7 0 SOLZA - 2 3 0 0 SOTYP - 3 1 28 0 SPBRT - 10 1 1 0 SPC - 4 6 4 0 SPECIRR - 4 1 0 0 SPEED - 0 1 0 0 SPFH - 10 0 45 0 SPFTR - 0 1 102 0 SPNCG - 0 1 103 0 SPNCH - 0 1 100 0 SPNCR - 0 1 101 0 SPNCS - 0 1 66 0 SPRATE - 4 2 7 0 SPRDF - 3 0 3 0 SPWAT - 3 0 0 0 SRAD - 0 1 85 0 SRAINC - 0 19 194 1 SRCONO - 3 192 46 0 SRFAGR1 - 3 192 47 0 SRFAGR2 - 3 192 48 0 SRFAGR3 - 3 192 49 0 SRFAGR4 - 3 192 50 0 SRFAGR5 - 3 192 51 0 SRFAGR6 - 0 1 12 0 SRWEQ - 0 20 103 0 SSALBK - 0 3 22 0 SSGSO - 10 3 195 1 SSHG - 3 5 2 0 SSKSSTMP - 0 1 86 0 SSNOWW - 1 0 6 0 SSRUN - 1 0 193 1 SSRUN - 10 3 200 1 SSST - 3 0 6 0 SSTMP - 2 0 211 1 SSTOR - 10 3 199 1 SSTT - 0 6 35 0 SSWTC - 0 19 200 1 STORPROB - 0 2 4 0 STRM - 0 1 87 0 STRPRATE - 0 6 33 0 SUNSD - 0 6 201 1 SUNSD - 0 6 24 0 SUNS - 10 3 192 1 SURGE - 0 19 220 1 SVRTS - 10 3 208 1 SWASH - 0 4 2 0 SWAVR - 10 0 7 0 SWDIR - 0 20 7 0 SWDMFLX - 0 7 5 0 SWEATX - 10 0 8 0 SWELL - 1 0 4 0 SWEPON - 10 0 47 0 SWHFSWEL - 0 4 197 1 SWHR - 10 0 48 0 SWHSSWEL - 10 0 49 0 SWHTSWEL - 0 19 202 1 SWINDPRO - 10 0 9 0 SWPER - 3 1 194 1 SWQI - 0 4 6 0 SWRAD - 0 19 212 1 SWSALB - 0 6 1 0 TCDC - 0 0 204 1 TCHP - 0 1 81 0 TCICON - 0 14 2 0 TCIOZ - 0 1 64 0 TCIWV - 2 0 35 0 TCLASS - 0 1 209 1 TCLSW - 0 6 20 0 TCOLC - 0 6 198 1 TCOLC - 0 1 74 0 TCOLG - 0 1 72 0 TCOLH - 0 6 19 0 TCOLIO - 0 1 70 0 TCOLI - 0 6 197 1 TCOLI - 0 1 210 1 TCOLM - 0 1 45 0 TCOLR - 0 1 204 1 TCOLR - 0 1 46 0 TCOLS - 0 1 205 1 TCOLS - 0 1 78 0 TCOLWA - 0 6 18 0 TCOLWO - 0 1 69 0 TCOLW - 0 6 196 1 TCOLW - 0 6 17 0 TCONDO - 0 1 21 0 TCOND - 0 6 195 1 TCOND - 10 3 242 1 TCSRG20 - 10 3 243 1 TCSRG30 - 10 3 244 1 TCSRG40 - 10 3 245 1 TCSRG50 - 10 3 246 1 TCSRG60 - 10 3 247 1 TCSRG70 - 10 3 248 1 TCSRG80 - 10 3 249 1 TCSRG90 - 0 1 51 0 TCWAT - 0 0 20 0 TDCHT - 0 2 31 0 TDCMOM - 2 0 36 0 TFRCT - 0 0 197 1 THFLX - 0 3 12 0 THICK - 0 6 10 0 THUNC - 0 0 203 1 THZ0 - 0 18 6 0 TIACCP - 0 18 7 0 TIACIP - 0 18 8 0 TIACRP - 10 3 251 1 TIDE - 0 1 206 1 TIPD - 0 19 11 0 TKE - 0 1 90 0 TKMFLX - 0 17 4 0 TLGTFD - 0 6 9 0 TMAXT - 0 0 4 0 TMAX - 0 0 5 0 TMIN - 0 0 29 0 TMPADV - 0 0 9 0 TMPA - 4 0 0 0 TMPSWP - 0 0 0 0 TMP - 0 2 227 1 TOA10 - 0 2 228 1 TOA50 - 0 2 229 1 TOD50 - 0 2 230 1 TOD90 - 0 19 197 1 TORPROB - 0 7 4 0 TOTALX - 0 1 80 0 TOTCON - 0 18 13 0 TOTLWD - 0 14 0 0 TOZNE - 0 14 197 1 TOZ - 2 0 37 0 TPERCT - 0 19 219 1 TPFI - 0 1 52 0 TPRATE - 0 20 13 0 TRANHH - 2 3 12 0 TRANSO - 2 0 230 1 TRANS - 0 20 14 0 TRSDS - 0 2 226 1 TRWDIR - 0 2 225 1 TRWSPD - 0 0 200 1 TSD1D - 0 191 0 0 TSEC - 4 6 0 0 TSI - 0 3 199 1 TSLSA - 0 1 50 0 TSNOWP - 0 1 241 1 TSNOW - 2 0 2 0 TSOIL - 0 1 57 0 TSRATE - 0 1 53 0 TSRWE - 0 19 203 1 TSTMC - 0 19 2 0 TSTM - 0 0 19 0 TTCHT - 0 0 198 1 TTDIA - 10 4 2 0 TTHDP - 0 0 25 0 TTLWRCS - 0 0 23 0 TTLWR - 0 0 26 0 TTPARM - 0 0 199 1 TTPHY - 0 0 193 1 TTRAD - 0 0 24 0 TTSWRCS - 0 0 22 0 TTSWR - 0 19 9 0 TURBB - 0 19 8 0 TURBT - 0 19 10 0 TURB - 0 1 49 0 TWATP - 0 2 35 0 TWIND - 10 3 210 1 TWLDC - 10 3 209 1 TWLDT - 10 3 205 1 TWLWAV - 0 20 58 0 TYAAL - 0 20 57 0 TYABA - 0 3 16 0 U-GWD - 0 3 194 1 U-GWD - 10 1 194 1 UBARO - 0 3 31 0 UCLSPRS - 0 1 120 0 UCSCIW - 0 1 119 0 UCSCLW - 0 0 28 0 UCTMP - 0 3 29 0 UDRATE - 0 2 17 0 UFLX - 0 2 2 0 UGRD - 0 2 23 0 UGUST - 0 2 41 0 UGWIND - 10 2 4 0 UICE - 0 1 91 0 UKMFLX - 0 5 4 0 ULWRF - 0 5 193 1 ULWRF - 0 3 27 0 UMFLX - 0 1 118 0 UNCSH - 0 2 45 0 UNDIV - 10 1 2 0 UOGRD - 1 0 14 0 UPAPCP - 1 0 15 0 UPASM - 0 7 15 0 UPHL - 0 7 197 1 UPHL - 2 3 2 0 UPLSM - 2 3 1 0 UPLST - 3 1 192 1 USCT - 10 0 21 0 USSD - 0 2 27 0 USTM - 0 2 194 1 USTM - 0 4 53 0 USWRFCS - 0 4 8 0 USWRF - 0 4 193 1 USWRF - 0 4 205 1 UTRF - 0 4 50 0 UVIUCS - 0 4 51 0 UVI - 0 7 196 1 UVI - 0 3 17 0 V-GWD - 0 3 195 1 V-GWD - 0 19 232 1 VAFTD - 0 1 4 0 VAPP - 10 1 195 1 VBARO - 0 4 200 1 VBDSF - 0 4 201 1 VDDSF - 0 0 202 1 VDFHR - 0 1 215 1 VDFMR - 0 14 195 1 VDFOZ - 0 2 208 1 VDFUA - 0 2 209 1 VDFVA - 0 2 204 1 VEDH - 2 0 210 1 VEGT - 2 0 4 0 VEG - 4 1 1 0 VEL1 - 4 1 2 0 VEL2 - 4 1 3 0 VEL3 - 0 2 18 0 VFLX - 0 6 48 0 VFRCICE - 0 6 49 0 VFRCIW - 0 6 47 0 VFRCWD - 0 2 3 0 VGRD - 2 0 198 1 VGTYP - 0 2 24 0 VGUST - 0 2 42 0 VGWIND - 10 2 5 0 VICE - 0 15 3 0 VIL - 0 19 35 0 VISBSN - 0 19 34 0 VISIFOG - 0 19 33 0 VISLFOG - 0 19 0 0 VIS - 0 1 92 0 VKMFLX - 0 20 52 0 VMXR - 10 1 3 0 VOGRD - 3 4 4 0 VOLACDEM - 3 4 7 0 VOLACDEN - 3 4 6 0 VOLACDOD - 3 4 3 0 VOLACDTH - 3 4 2 0 VOLACDTP - 3 4 1 0 VOLACDTT - 3 4 5 0 VOLAEADR - 3 4 8 0 VOLAPER - 3 4 0 0 VOLAPROB - 0 19 4 0 VOLASH - 2 3 13 0 VOLDEC - 2 3 11 0 VOLTSO - 0 2 46 0 VORTADV - 0 2 5 0 VPOT - 0 0 15 0 VPTMP - 0 2 224 1 VRATE - 3 1 193 1 VSCT - 2 0 25 0 VSOILM - 2 3 16 0 VSOSM - 10 0 22 0 VSSD - 0 2 28 0 VSTM - 0 2 195 1 VSTM - 4 2 4 0 VTEC - 0 0 1 0 VTMP - 0 2 15 0 VUCSH - 0 2 16 0 VVCSH - 0 2 8 0 VVEL - 2 0 27 0 VWILTM - 0 2 25 0 VWSH - 0 2 192 1 VWSH - 10 4 17 0 WATDENA - 10 4 16 0 WATERDEN - 10 4 20 0 WATPDENA - 10 4 19 0 WATPDEN - 10 4 18 0 WATPTEMP - 2 0 5 0 WATR - 10 0 62 0 WAVEFREW - 2 0 223 1 WCCONV - 0 0 13 0 WCF - 2 0 221 1 WCINC - 2 0 226 1 WCUFLX - 2 0 227 1 WCVFLX - 0 20 10 0 WDCPMFLX - 10 4 14 0 WDEPTH - 10 0 31 0 WDIRW - 0 2 0 0 WDIR - 1 2 0 0 WDPTHIL - 10 0 56 0 WDWFSWEL - 10 0 57 0 WDWSSWEL - 10 0 58 0 WDWTSWEL - 0 1 13 0 WEASD - 10 0 42 0 WESP - 0 0 27 0 WETBT - 0 18 11 0 WETDEP - 0 20 75 0 WFIREFLX - 1 2 2 0 WFRACT - 10 0 59 0 WFWFSWEL - 10 0 60 0 WFWSSWEL - 10 0 61 0 WFWTSWEL - 4 8 5 0 WHTCOR - 4 8 3 0 WHTRAD - 2 0 26 0 WILT - 2 0 201 1 WILT - 0 2 33 0 WINDF - 0 19 199 1 WINDPROB - 3 1 19 0 WINDS - 0 2 1 0 WIND - 0 19 25 0 WIWW - 10 0 193 1 WLENG - 0 20 9 0 WLSMFLX - 0 2 19 0 WMIXE - 2 0 33 0 WROD - 10 0 192 1 WSTP - 10 0 18 0 WSTR - 0 2 214 1 WTEND - 10 4 192 1 WTMPC - 1 2 1 0 WTMPIL - 10 4 15 0 WTMPSS - 10 3 0 0 WTMP - 2 0 222 1 WVCONV - 10 0 4 0 WVDIR - 10 0 5 0 WVHGT - 2 0 220 1 WVINC - 10 0 6 0 WVPER - 10 0 0 0 WVSP1 - 10 0 1 0 WVSP2 - 10 0 2 0 WVSP3 - 2 0 224 1 WVUFLX - 2 0 225 1 WVVFLX - 10 0 14 0 WWSDIR - 4 6 1 0 XLONG - 0 3 26 0 XPRES - 4 8 0 0 XRAYRAD - 4 6 2 0 XSHRT - 10 2 10 0 ZVCICEP diff --git a/fix/fix_upp/postxconfig-NT-fv3sar.txt b/fix/fix_upp/postxconfig-NT-fv3sar.txt deleted file mode 100644 index ddfe56a64..000000000 --- a/fix/fix_upp/postxconfig-NT-fv3sar.txt +++ /dev/null @@ -1,17943 +0,0 @@ -2 -226 -258 -BGDAWP -32769 -ncep_nco -v2003 -local_tab_yes1 -fcst -oper -fcst -fcst -hour -nws_ncep -meso_nam12km -complex_packing_spatial_diff -2nd_ord_sptdiff -fltng_pnt -lossless -1 -PRES_ON_HYBRID_LVL -? -1 -tmpl4_0 -PRES -? -? -hybrid_lvl -0 -? -2 -1. 2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -77 -HGT_ON_HYBRID_LVL -? -1 -tmpl4_0 -HGT -? -? -hybrid_lvl -0 -? -2 -1. 2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -2 -TMP_ON_HYBRID_LVL -? -1 -tmpl4_0 -TMP -? -? -hybrid_lvl -0 -? -2 -1. 2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -3 -POT_ON_HYBRID_LVL -? -1 -tmpl4_0 -POT -? -? -hybrid_lvl -0 -? -2 -1. 2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -4 -DPT_ON_HYBRID_LVL -? -1 -tmpl4_0 -DPT -? -? -hybrid_lvl -0 -? -2 -1. 2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -5 -SPFH_ON_HYBRID_LVL -? -1 -tmpl4_0 -SPFH -? -? -hybrid_lvl -0 -? -1 -1. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -7.0 -0 -0 -0 -? -? -? -6 -RH_ON_HYBRID_LVL -? -1 -tmpl4_0 -RH -? -? -hybrid_lvl -0 -? -1 -1. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -7 -UGRD_ON_HYBRID_LVL -? -1 -tmpl4_0 -UGRD -? -? -hybrid_lvl -0 -? -2 -1. 2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -8 -VGRD_ON_HYBRID_LVL -? -1 -tmpl4_0 -VGRD -? -? -hybrid_lvl -0 -? -2 -1. 2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -9 -VVEL_ON_HYBRID_LVL -? -1 -tmpl4_0 -VVEL -? -? -hybrid_lvl -0 -? -1 -1. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -264 -DZDT_ON_HYBRID_LVL -? -1 -tmpl4_0 -DZDT -? -? -hybrid_lvl -0 -? -1 -1. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --5.0 -0 -0 -0 -? -? -? -11 -TKE_ON_HYBRID_LVL -? -1 -tmpl4_0 -TKE -? -? -hybrid_lvl -0 -? -2 -1. 2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -181 -RWMR_ON_HYBRID_LVL -? -1 -tmpl4_0 -RWMR -? -? -hybrid_lvl -0 -? -2 -1. 2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -182 -SNMR_ON_HYBRID_LVL -? -1 -tmpl4_0 -SNMR -? -? -hybrid_lvl -0 -? -2 -1. 2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -187 -RIME_ON_HYBRID_LVL -? -1 -tmpl4_0 -RIME -NCEP -? -hybrid_lvl -0 -? -2 -1. 2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -199 -TCOND_ON_HYBRID_LVL -? -1 -tmpl4_0 -TCOND -NCEP -? -hybrid_lvl -0 -? -2 -1. 2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -250 -REFD_ON_HYBRID_LVL -? -1 -tmpl4_0 -REFD -NCEP -? -hybrid_lvl -0 -? -2 -1. 2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -146 -BMIXL_ON_HYBRID_LVL -? -1 -tmpl4_0 -BMIXL -NCEP -? -hybrid_lvl -0 -? -1 -1. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -12 -HGT_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -HGT -? -? -isobaric_sfc -0 -? -46 -200. 500. 700. 1000. 2000. 3000. 5000. 7000. 7500. 10000. 12500. 15000. 17500. 20000. 22500. 25000. 27500. 30000. 32500. 35000. 37500. 40000. 42500. 45000. 47500. 50000. 52500. 55000. 57500. 60000. 62500. 65000. 67500. 70000. 72500. 75000. 77500. 80000. 82500. 85000. 87500. 90000. 92500. 95000. 97500. 100000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -13 -TMP_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -TMP -? -? -isobaric_sfc -0 -? -46 -200. 500. 700. 1000. 2000. 3000. 5000. 7000. 7500. 10000. 12500. 15000. 17500. 20000. 22500. 25000. 27500. 30000. 32500. 35000. 37500. 40000. 42500. 45000. 47500. 50000. 52500. 55000. 57500. 60000. 62500. 65000. 67500. 70000. 72500. 75000. 77500. 80000. 82500. 85000. 87500. 90000. 92500. 95000. 97500. 100000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -15 -DPT_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -DPT -? -? -isobaric_sfc -0 -? -46 -200. 500. 700. 1000. 2000. 3000. 5000. 7000. 7500. 10000. 12500. 15000. 17500. 20000. 22500. 25000. 27500. 30000. 32500. 35000. 37500. 40000. 42500. 45000. 47500. 50000. 52500. 55000. 57500. 60000. 62500. 65000. 67500. 70000. 72500. 75000. 77500. 80000. 82500. 85000. 87500. 90000. 92500. 95000. 97500. 100000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -16 -SPFH_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -SPFH -? -? -isobaric_sfc -0 -? -46 -200. 500. 700. 1000. 2000. 3000. 5000. 7000. 7500. 10000. 12500. 15000. 17500. 20000. 22500. 25000. 27500. 30000. 32500. 35000. 37500. 40000. 42500. 45000. 47500. 50000. 52500. 55000. 57500. 60000. 62500. 65000. 67500. 70000. 72500. 75000. 77500. 80000. 82500. 85000. 87500. 90000. 92500. 95000. 97500. 100000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -17 -RH_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -RH -? -? -isobaric_sfc -0 -? -46 -200. 500. 700. 1000. 2000. 3000. 5000. 7000. 7500. 10000. 12500. 15000. 17500. 20000. 22500. 25000. 27500. 30000. 32500. 35000. 37500. 40000. 42500. 45000. 47500. 50000. 52500. 55000. 57500. 60000. 62500. 65000. 67500. 70000. 72500. 75000. 77500. 80000. 82500. 85000. 87500. 90000. 92500. 95000. 97500. 100000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -2.0 -0 -0 -0 -? -? -? -85 -MCONV_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -MCONV -NCEP -? -isobaric_sfc -0 -? -2 -85000. 95000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -18 -UGRD_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -UGRD -? -? -isobaric_sfc -0 -? -46 -200. 500. 700. 1000. 2000. 3000. 5000. 7000. 7500. 10000. 12500. 15000. 17500. 20000. 22500. 25000. 27500. 30000. 32500. 35000. 37500. 40000. 42500. 45000. 47500. 50000. 52500. 55000. 57500. 60000. 62500. 65000. 67500. 70000. 72500. 75000. 77500. 80000. 82500. 85000. 87500. 90000. 92500. 95000. 97500. 100000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -19 -VGRD_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -VGRD -? -? -isobaric_sfc -0 -? -46 -200. 500. 700. 1000. 2000. 3000. 5000. 7000. 7500. 10000. 12500. 15000. 17500. 20000. 22500. 25000. 27500. 30000. 32500. 35000. 37500. 40000. 42500. 45000. 47500. 50000. 52500. 55000. 57500. 60000. 62500. 65000. 67500. 70000. 72500. 75000. 77500. 80000. 82500. 85000. 87500. 90000. 92500. 95000. 97500. 100000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -20 -VVEL_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -VVEL -? -? -isobaric_sfc -0 -? -46 -200. 500. 700. 1000. 2000. 3000. 5000. 7000. 7500. 10000. 12500. 15000. 17500. 20000. 22500. 25000. 27500. 30000. 32500. 35000. 37500. 40000. 42500. 45000. 47500. 50000. 52500. 55000. 57500. 60000. 62500. 65000. 67500. 70000. 72500. 75000. 77500. 80000. 82500. 85000. 87500. 90000. 92500. 95000. 97500. 100000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -284 -DZDT_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -DZDT -? -? -isobaric_sfc -0 -? -46 -200. 500. 700. 1000. 2000. 3000. 5000. 7000. 7500. 10000. 12500. 15000. 17500. 20000. 22500. 25000. 27500. 30000. 32500. 35000. 37500. 40000. 42500. 45000. 47500. 50000. 52500. 55000. 57500. 60000. 62500. 65000. 67500. 70000. 72500. 75000. 77500. 80000. 82500. 85000. 87500. 90000. 92500. 95000. 97500. 100000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --5.0 -0 -0 -0 -? -? -? -21 -ABSV_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -ABSV -? -? -isobaric_sfc -0 -? -10 -20000. 25000. 30000. 40000. 50000. 70000. 75000. 85000. 92500. 100000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -86 -STRM_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -STRM -? -? -isobaric_sfc -0 -? -2 -25000. 50000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -22 -TKE_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -TKE -? -? -isobaric_sfc -0 -? -46 -200. 500. 700. 1000. 2000. 3000. 5000. 7000. 7500. 10000. 12500. 15000. 17500. 20000. 22500. 25000. 27500. 30000. 32500. 35000. 37500. 40000. 42500. 45000. 47500. 50000. 52500. 55000. 57500. 60000. 62500. 65000. 67500. 70000. 72500. 75000. 77500. 80000. 82500. 85000. 87500. 90000. 92500. 95000. 97500. 100000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -166 -ICMR_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -ICMR -? -? -isobaric_sfc -0 -? -46 -200. 500. 700. 1000. 2000. 3000. 5000. 7000. 7500. 10000. 12500. 15000. 17500. 20000. 22500. 25000. 27500. 30000. 32500. 35000. 37500. 40000. 42500. 45000. 47500. 50000. 52500. 55000. 57500. 60000. 62500. 65000. 67500. 70000. 72500. 75000. 77500. 80000. 82500. 85000. 87500. 90000. 92500. 95000. 97500. 100000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -153 -CLWMR_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -CLWMR -? -? -isobaric_sfc -0 -? -46 -200. 500. 700. 1000. 2000. 3000. 5000. 7000. 7500. 10000. 12500. 15000. 17500. 20000. 22500. 25000. 27500. 30000. 32500. 35000. 37500. 40000. 42500. 45000. 47500. 50000. 52500. 55000. 57500. 60000. 62500. 65000. 67500. 70000. 72500. 75000. 77500. 80000. 82500. 85000. 87500. 90000. 92500. 95000. 97500. 100000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -183 -RWMR_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -RWMR -? -? -isobaric_sfc -0 -? -46 -200. 500. 700. 1000. 2000. 3000. 5000. 7000. 7500. 10000. 12500. 15000. 17500. 20000. 22500. 25000. 27500. 30000. 32500. 35000. 37500. 40000. 42500. 45000. 47500. 50000. 52500. 55000. 57500. 60000. 62500. 65000. 67500. 70000. 72500. 75000. 77500. 80000. 82500. 85000. 87500. 90000. 92500. 95000. 97500. 100000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -416 -GRLE_ON_ISOBARIC_SFC -Graupel mixing ration on isobaric surface -1 -tmpl4_0 -GRLE -? -? -isobaric_sfc -0 -? -46 -200. 500. 700. 1000. 2000. 3000. 5000. 7000. 7500. 10000. 12500. 15000. 17500. 20000. 22500. 25000. 27500. 30000. 32500. 35000. 37500. 40000. 42500. 45000. 47500. 50000. 52500. 55000. 57500. 60000. 62500. 65000. 67500. 70000. 72500. 75000. 77500. 80000. 82500. 85000. 87500. 90000. 92500. 95000. 97500. 100000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -184 -SNMR_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -SNMR -? -? -isobaric_sfc -0 -? -46 -200. 500. 700. 1000. 2000. 3000. 5000. 7000. 7500. 10000. 12500. 15000. 17500. 20000. 22500. 25000. 27500. 30000. 32500. 35000. 37500. 40000. 42500. 45000. 47500. 50000. 52500. 55000. 57500. 60000. 62500. 65000. 67500. 70000. 72500. 75000. 77500. 80000. 82500. 85000. 87500. 90000. 92500. 95000. 97500. 100000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -263 -RIME_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -RIME -NCEP -? -isobaric_sfc -0 -? -46 -200. 500. 700. 1000. 2000. 3000. 5000. 7000. 7500. 10000. 12500. 15000. 17500. 20000. 22500. 25000. 27500. 30000. 32500. 35000. 37500. 40000. 42500. 45000. 47500. 50000. 52500. 55000. 57500. 60000. 62500. 65000. 67500. 70000. 72500. 75000. 77500. 80000. 82500. 85000. 87500. 90000. 92500. 95000. 97500. 100000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -23 -MSLET_ON_MEAN_SEA_LVL -? -1 -tmpl4_0 -MSLET -NCEP -? -mean_sea_lvl -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -105 -PRES_ON_MEAN_SEA_LVL -? -1 -tmpl4_0 -PRMSL -? -? -mean_sea_lvl -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -106 -TMP_ON_SPEC_HGT_LVL_ABOVE_GRND_2m -? -1 -tmpl4_0 -TMP -? -? -spec_hgt_lvl_above_grnd -0 -? -1 -2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -112 -SPFH_ON_SPEC_HGT_LVL_ABOVE_GRND_2m -? -1 -tmpl4_0 -SPFH -? -? -spec_hgt_lvl_above_grnd -0 -? -1 -2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -113 -DPT_ON_SPEC_HGT_LVL_ABOVE_GRND_2m -? -1 -tmpl4_0 -DPT -? -? -spec_hgt_lvl_above_grnd -0 -? -1 -2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -114 -RH_ON_SPEC_HGT_LVL_ABOVE_GRND_2m -? -1 -tmpl4_0 -RH -? -? -spec_hgt_lvl_above_grnd -0 -? -1 -2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -64 -UGRD_ON_SPEC_HGT_LVL_ABOVE_GRND_10m -? -1 -tmpl4_0 -UGRD -? -? -spec_hgt_lvl_above_grnd -0 -? -1 -10. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -65 -VGRD_ON_SPEC_HGT_LVL_ABOVE_GRND_10m -? -1 -tmpl4_0 -VGRD -? -? -spec_hgt_lvl_above_grnd -0 -? -1 -10. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -245 -GUST_ON_SURFACE -? -1 -tmpl4_0 -GUST -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -246 -PLPL_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -PLPL -NCEP -? -spec_pres_above_grnd -0 -? -1 -25500. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -158 -POT_ON_SPEC_HGT_LVL_ABOVE_GRND_10m -? -1 -tmpl4_0 -POT -? -? -spec_hgt_lvl_above_grnd -0 -? -1 -10. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -159 -SPFH_ON_SPEC_HGT_LVL_ABOVE_GRND_10m -? -1 -tmpl4_0 -SPFH -? -? -spec_hgt_lvl_above_grnd -0 -? -1 -10. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -24 -PRES_ON_SURFACE -? -1 -tmpl4_0 -PRES -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -25 -HGT_ON_SURFACE -? -1 -tmpl4_0 -HGT -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -27 -POT_ON_SURFACE -? -1 -tmpl4_0 -POT -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -28 -SPFH_ON_SURFACE -? -1 -tmpl4_0 -SPFH -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -26 -TMP_ON_SURFACE -? -1 -tmpl4_0 -TMP -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -115 -TSOIL_ON_DEPTH_BEL_LAND_SFC_3m -? -1 -tmpl4_0 -TSOIL -? -? -depth_bel_land_sfc -0 -? -1 -3. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -116 -TSOIL_ON_DEPTH_BEL_LAND_SFC -? -1 -tmpl4_0 -TSOIL -? -? -depth_bel_land_sfc -4 -2 2 2 2 -4 -0. 10. 40. 100. -depth_bel_land_sfc -4 -2 2 2 2 -4 -10. 40. 100. 200. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -117 -SOILW_ON_DEPTH_BEL_LAND_SFC -? -1 -tmpl4_0 -SOILW -NCEP -? -depth_bel_land_sfc -4 -2 2 2 2 -4 -0. 10. 40. 100. -depth_bel_land_sfc -4 -2 2 2 2 -4 -10. 40. 100. 200. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -225 -SOILL_ON_DEPTH_BEL_LAND_SFC -? -1 -tmpl4_0 -SOILL -NCEP -? -depth_bel_land_sfc -4 -2 2 2 2 -4 -0. 10. 40. 100. -depth_bel_land_sfc -4 -2 2 2 2 -4 -10. 40. 100. 200. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -36 -SOILM_ON_DEPTH_BEL_LAND_SFC -? -1 -tmpl4_0 -SOILM -? -? -depth_bel_land_sfc -1 -2 -1 -0. -depth_bel_land_sfc -1 -2 -1 -200. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -118 -CNWAT_ON_SURFACE -? -1 -tmpl4_0 -CNWAT -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -1.0 -0 -0 -0 -? -? -? -119 -WEASD_ON_SURFACE -? -1 -tmpl4_0 -WEASD -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -120 -SNOWC_ON_SURFACE -? -1 -tmpl4_0 -SNOWC -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -169 -SFEXC_ON_SURFACE -? -1 -tmpl4_0 -SFEXC -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -170 -VEG_ON_SURFACE -? -1 -tmpl4_0 -VEG -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -218 -VGTYP_ON_SURFACE -? -1 -tmpl4_0 -VGTYP -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -219 -SOTYP_ON_SURFACE -? -1 -tmpl4_0 -SOTYP -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -226 -SNFALB_ON_SURFACE -? -1 -tmpl4_0 -SNFALB -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -227 -MXSALB_ON_SURFACE -? -1 -tmpl4_0 -MXSALB -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -220 -CCOND_ON_SURFACE -? -1 -tmpl4_0 -CCOND -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -238 -RCS_ON_SURFACE -? -1 -tmpl4_0 -RCS -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -239 -RCT_ON_SURFACE -? -1 -tmpl4_0 -RCT -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -240 -RCQ_ON_SURFACE -? -1 -tmpl4_0 -RCQ -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -241 -RCSOL_ON_SURFACE -? -1 -tmpl4_0 -RCSOL -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -237 -SMREF_ON_SURFACE -? -1 -tmpl4_0 -SMREF -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -233 -POROS_ON_SURFACE -? -1 -tmpl4_0 -POROS -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -235 -RLYRS_ON_SURFACE -? -1 -tmpl4_0 -RLYRS -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -234 -RSMIN_ON_SURFACE -? -1 -tmpl4_0 -RSMIN -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -224 -SNOD_ON_SURFACE -? -1 -tmpl4_0 -SNOD -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -232 -SMDRY_ON_SURFACE -? -1 -tmpl4_0 -SMDRY -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -236 -WILT_ON_SURFACE -? -1 -tmpl4_0 -WILT -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -171 -MSTAV_ON_DEPTH_BEL_LAND_SFC -? -1 -tmpl4_0 -MSTAV -NCEP -? -depth_bel_land_sfc -1 -2 -1 -0. -depth_bel_land_sfc -1 -2 -1 -100. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -152 -INST_GFLUX_ON_SURFACE -? -1 -tmpl4_0 -GFLUX -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -30 -LFTX_ON_ISOBARIC_SFC_500-1000hpa -? -1 -tmpl4_0 -LFTX -NCEP -? -isobaric_sfc -0 -? -1 -50000. -isobaric_sfc -0 -? -1 -100000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -31 -4LFTX_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -4LFTX -NCEP -? -spec_pres_above_grnd -0 -? -1 -18000. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -75 -PLI_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -PLI -? -? -spec_pres_above_grnd -0 -? -1 -3000. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -32 -CAPE_ON_SURFACE -? -1 -tmpl4_0 -CAPE -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -566 -BEST_CAPE_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -CAPE -? -? -spec_pres_above_grnd -0 -? -1 -18000. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -582 -MIXED_LAYER_CAPE_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -CAPE -? -? -spec_pres_above_grnd -0 -? -1 -9000. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -584 -UNSTABLE_CAPE_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -CAPE -? -? -spec_pres_above_grnd -0 -? -1 -25500. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -107 -CIN_ON_SURFACE -? -1 -tmpl4_0 -CIN -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -567 -BEST_CIN_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -CIN -? -? -spec_pres_above_grnd -0 -? -1 -18000. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -583 -MIXED_LAYER_CIN_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -CIN -? -? -spec_pres_above_grnd -0 -? -1 -9000. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -585 -UNSTABLE_CIN_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -CIN -? -? -spec_pres_above_grnd -0 -? -1 -25500. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -80 -PWAT_ON_ENTIRE_ATMOS_SINGLE_LYR -? -1 -tmpl4_0 -PWAT -? -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -162 -HLCY_ON_SPEC_HGT_LVL_ABOVE_GRND -? -1 -tmpl4_0 -HLCY -? -? -spec_hgt_lvl_above_grnd -0 -? -2 -3000. 1000. -spec_hgt_lvl_above_grnd -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -163 -USTM_ON_SPEC_HGT_LVL_ABOVE_GRND -? -1 -tmpl4_0 -USTM -NCEP -? -spec_hgt_lvl_above_grnd -0 -? -1 -6000. -spec_hgt_lvl_above_grnd -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -164 -VSTM_ON_SPEC_HGT_LVL_ABOVE_GRND -? -1 -tmpl4_0 -VSTM -NCEP -? -spec_hgt_lvl_above_grnd -0 -? -1 -6000. -spec_hgt_lvl_above_grnd -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -87 -ACM_APCP_ON_SURFACE -? -1 -tmpl4_8 -APCP -? -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -34 -ACM_NCPCP_ON_SURFACE -? -1 -tmpl4_8 -NCPCP -? -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -417 -CACM_APCP_ON_SURFACE -? -1 -tmpl4_8 -APCP -? -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -419 -CACM_NCPCP_ON_SURFACE -? -1 -tmpl4_8 -NCPCP -? -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -35 -ACM_WEASD_ON_SURFACE -? -1 -tmpl4_8 -WEASD -? -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -121 -ACM_SNOM_ON_SURFACE -? -1 -tmpl4_8 -SNOM -? -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -122 -ACM_SSRUN_ON_SURFACE -? -1 -tmpl4_8 -SSRUN -NCEP -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -123 -ACM_BGRUN_ON_SURFACE -? -1 -tmpl4_8 -BGRUN -NCEP -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -343 -ACM_WATR_ON_SURFACE -? -1 -tmpl4_8 -WATR -? -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -160 -INST_CRAIN_ON_SURFACE -? -1 -tmpl4_0 -CRAIN -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -1.0 -0 -0 -0 -? -? -? -551 -CSNOW_ON_SURFACE -Categorical snow on surface -1 -tmpl4_0 -CSNOW -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -1.0 -0 -0 -0 -? -? -? -552 -CICEP_ON_SURFACE -Categorical ice pellets on surface -1 -tmpl4_0 -CICEP -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -1.0 -0 -0 -0 -? -? -? -553 -CFRZR_ON_SURFACE -Categorical freezing rain on surface -1 -tmpl4_0 -CFRZR -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -1.0 -0 -0 -0 -? -? -? -167 -INST_PRATE_ON_SURFACE -? -1 -tmpl4_0 -PRATE -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --5.0 -0 -0 -0 -? -? -? -172 -CPOFP_ON_SURFACE -? -1 -tmpl4_0 -CPOFP -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -124 -CLWMR_ON_HYBRID_LVL -? -1 -tmpl4_0 -CLWMR -? -? -hybrid_lvl -0 -? -2 -1. 2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -125 -ICMR_ON_HYBRID_LVL -? -1 -tmpl4_0 -ICMR -? -? -hybrid_lvl -0 -? -2 -1. 2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -415 -GRLE_ON_HYBRID_LVL -Graupel mixing ration on hybrid level -1 -tmpl4_0 -GRLE -? -? -hybrid_lvl -0 -? -2 -1. 2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -145 -TCDC_ON_HYBRID_LVL -? -1 -tmpl4_0 -TCDC -? -? -hybrid_lvl -0 -? -2 -1. 2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -37 -LCDC_ON_LOW_CLOUD_LYR -? -1 -tmpl4_0 -LCDC -? -? -low_cloud_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -38 -MCDC_ON_MID_CLOUD_LYR -? -1 -tmpl4_0 -MCDC -? -? -mid_cloud_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -39 -HCDC_ON_HIGH_CLOUD_LYR -? -1 -tmpl4_0 -HCDC -? -? -high_cloud_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -161 -INST_TCDC_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -TCDC -? -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -144 -AVE_TCDC_ON_ENTIRE_ATMOS -? -1 -tmpl4_8 -TCDC -? -AVE -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -139 -AVE_CDLYR_ON_ENTIRE_ATMOS -? -1 -tmpl4_8 -CDLYR -NCEP -AVE -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -180 -VIS_ON_SURFACE -? -1 -tmpl4_0 -VIS -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -410 -GSD_VIS_ON_CLOUD_TOP -GSD_visibility on cloud top -1 -tmpl4_0 -VIS -? -? -cloud_top -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -109 -HGT_ON_LVL_OF_ADIAB_COND_FROM_SFC -? -1 -tmpl4_0 -HGT -? -? -lvl_of_adiab_cond_from_sfc -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -110 -PRES_ON_LVL_OF_ADIAB_COND_FROM_SFC -? -1 -tmpl4_0 -PRES -? -? -lvl_of_adiab_cond_from_sfc -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -141 -INST_USWRF_ON_SURFACE -? -1 -tmpl4_0 -USWRF -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -142 -INST_ULWRF_ON_SURFACE -? -1 -tmpl4_0 -ULWRF -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -126 -AVE_DSWRF_ON_SURFACE -? -1 -tmpl4_8 -DSWRF -NCEP -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -127 -AVE_DLWRF_ON_SURFACE -? -1 -tmpl4_8 -DLWRF -NCEP -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -128 -AVE_USWRF_ON_SURFACE -? -1 -tmpl4_8 -USWRF -NCEP -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -129 -AVE_ULWRF_ON_SURFACE -? -1 -tmpl4_8 -ULWRF -NCEP -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -130 -AVE_USWRF_ON_TOP_OF_ATMOS -? -1 -tmpl4_8 -USWRF -NCEP -AVE -top_of_atmos -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -131 -AVE_ULWRF_ON_TOP_OF_ATMOS -? -1 -tmpl4_8 -ULWRF -NCEP -AVE -top_of_atmos -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -274 -INST_ULWRF_ON_TOP_OF_ATMOS -? -1 -tmpl4_0 -ULWRF -NCEP -? -top_of_atmos -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -275 -BRTMP_ON_TOP_OF_ATMOS -? -1 -tmpl4_0 -BRTMP -? -? -top_of_atmos -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -156 -INST_DSWRF_ON_SURFACE -? -1 -tmpl4_0 -DSWRF -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -157 -INST_DLWRF_ON_SURFACE -? -1 -tmpl4_0 -DLWRF -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -262 -INST_CSDSF_ON_SURFACE -? -1 -tmpl4_0 -CSDSF -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -44 -SFCR_ON_SURFACE -? -1 -tmpl4_0 -SFCR -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -2.7 -0 -0 -0 -? -? -? -45 -FRICV_ON_SURFACE -? -1 -tmpl4_0 -FRICV -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -132 -CD_ON_SURFACE -? -1 -tmpl4_0 -CD -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -133 -UFLX_ON_SURFACE -? -1 -tmpl4_0 -UFLX -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -134 -VFLX_ON_SURFACE -? -1 -tmpl4_0 -VFLX -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -43 -AVE_SHTFL_ON_SURFACE -? -1 -tmpl4_8 -SHTFL -? -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -135 -AVE_GFLUX_ON_SURFACE -? -1 -tmpl4_8 -GFLUX -NCEP -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -136 -AVE_SNOHF_ON_SURFACE -? -1 -tmpl4_8 -SNOHF -NCEP -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -42 -AVE_LHTFL_ON_SURFACE -? -1 -tmpl4_8 -LHTFL -? -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -47 -ACM_EVP_ON_SURFACE -? -1 -tmpl4_8 -EVP -? -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -137 -ACM_PEVAP_ON_SURFACE -? -1 -tmpl4_8 -PEVAP -NCEP -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -154 -INST_SHTFL_ON_SURFACE -? -1 -tmpl4_0 -SHTFL -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -155 -INST_LHTFL_ON_SURFACE -? -1 -tmpl4_0 -LHTFL -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -48 -NLAT_ON_SURFACE -? -1 -tmpl4_0 -NLAT -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -49 -ELON_ON_SURFACE -? -1 -tmpl4_0 -ELON -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -50 -LAND_ON_SURFACE -? -1 -tmpl4_0 -LAND -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -1.0 -0 -0 -0 -? -? -? -51 -ICEC_ON_SURFACE -? -1 -tmpl4_0 -ICEC -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -150 -ALBDO_ON_SURFACE -? -1 -tmpl4_0 -ALBDO -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -151 -WTMP_ON_SURFACE -? -1 -tmpl4_0 -WTMP -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -54 -PRES_ON_TROPOPAUSE -? -1 -tmpl4_0 -PRES -? -? -tropopause -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -177 -HGT_ON_TROPOPAUSE -? -1 -tmpl4_0 -HGT -? -? -tropopause -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -55 -TMP_ON_TROPOPAUSE -? -1 -tmpl4_0 -TMP -? -? -tropopause -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -108 -POT_ON_TROPOPAUSE -? -1 -tmpl4_0 -POT -? -? -tropopause -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -56 -UGRD_ON_TROPOPAUSE -? -1 -tmpl4_0 -UGRD -? -? -tropopause -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -57 -VGRD_ON_TROPOPAUSE -? -1 -tmpl4_0 -VGRD -? -? -tropopause -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -58 -VWSH_ON_TROPOPAUSE -? -1 -tmpl4_0 -VWSH -NCEP -? -tropopause -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -432 -VUCSH_ON_SPEC_HGT_LVL_ABOVE_GRND_0-6km -Vertical u-component shear between 0 to 6000m Above Ground -1 -tmpl4_0 -VUCSH -? -? -spec_hgt_lvl_above_grnd -0 -? -1 -0. -spec_hgt_lvl_above_grnd -0 -? -1 -6000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -433 -VVCSH_ON_SPEC_HGT_LVL_ABOVE_GRND_0-6km -Vertical v-component shear between 0 to 6000m Above Ground -1 -tmpl4_0 -VVCSH -? -? -spec_hgt_lvl_above_grnd -0 -? -1 -0. -spec_hgt_lvl_above_grnd -0 -? -1 -6000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -59 -TMP_ON_SPEC_ALT_ABOVE_MEAN_SEA_LVL -? -1 -tmpl4_0 -TMP -? -? -spec_alt_above_mean_sea_lvl -0 -? -10 -305. 457. 610. 914. 1524. 1829. 2134. 2743. 3658. 4572. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -586 -TMP_ON_SPEC_HGT_LVL_ABOVE_GRND_FDHGT -? -1 -tmpl4_0 -TMP -? -? -spec_hgt_lvl_above_grnd -0 -? -4 -30. 50. 80. 100. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -60 -UGRD_ON_SPEC_ALT_ABOVE_MEAN_SEA_LVL -? -1 -tmpl4_0 -UGRD -? -? -spec_alt_above_mean_sea_lvl -0 -? -10 -305. 457. 610. 914. 1524. 1829. 2134. 2743. 3658. 4572. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -576 -UGRD_ON_SPEC_HGT_LVL_ABOVE_GRND_FDHGT -? -1 -tmpl4_0 -UGRD -? -? -spec_hgt_lvl_above_grnd -0 -? -4 -30. 50. 80. 100. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -61 -VGRD_ON_SPEC_ALT_ABOVE_MEAN_SEA_LVL -? -1 -tmpl4_0 -VGRD -? -? -spec_alt_above_mean_sea_lvl -0 -? -10 -305. 457. 610. 914. 1524. 1829. 2134. 2743. 3658. 4572. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -577 -VGRD_ON_SPEC_HGT_LVL_ABOVE_GRND_FDHGT -? -1 -tmpl4_0 -VGRD -? -? -spec_hgt_lvl_above_grnd -0 -? -4 -30. 50. 80. 100. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -451 -SPFH_ON_SPEC_ALT_ABOVE_MEAN_SEA_LVL -? -1 -tmpl4_0 -SPFH -? -? -spec_alt_above_mean_sea_lvl -0 -? -1 -305. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -578 -SPFH_ON_SPEC_HGT_LVL_ABOVE_GRND_FDHGT -? -1 -tmpl4_0 -SPFH -? -? -spec_hgt_lvl_above_grnd -0 -? -4 -30. 50. 80. 100. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -579 -PRES_ON_SPEC_HGT_LVL_ABOVE_GRND_FDHGT -? -1 -tmpl4_0 -PRES -? -? -spec_hgt_lvl_above_grnd -0 -? -4 -30. 50. 80. 100. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -62 -HGT_ON_0C_ISOTHERM -? -1 -tmpl4_0 -HGT -? -? -0C_isotherm -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -63 -RH_ON_0C_ISOTHERM -? -1 -tmpl4_0 -RH -? -? -0C_isotherm -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -2.0 -0 -0 -0 -? -? -? -165 -HGT_ON_HGHST_TROP_FRZ_LVL -? -1 -tmpl4_0 -HGT -? -? -hghst_trop_frz_lvl -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -247 -HGT_ON_LWST_LVL_OF_WET_BULB_ZERO -? -1 -tmpl4_0 -HGT -? -? -lwst_lvl_of_wet_bulb_zero -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --5.0 -0 -0 -0 -? -? -? -67 -PRES_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -PRES -? -? -spec_pres_above_grnd -0 -? -6 -3000. 6000. 9000. 12000. 15000. 18000. -spec_pres_above_grnd -0 -? -6 -0. 3000. 6000. 9000. 12000. 15000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -68 -TMP_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -TMP -? -? -spec_pres_above_grnd -0 -? -6 -3000. 6000. 9000. 12000. 15000. 18000. -spec_pres_above_grnd -0 -? -6 -0. 3000. 6000. 9000. 12000. 15000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -69 -POT_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -POT -? -? -spec_pres_above_grnd -0 -? -1 -3000. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -70 -DPT_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -DPT -? -? -spec_pres_above_grnd -0 -? -1 -3000. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -71 -SPFH_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -SPFH -? -? -spec_pres_above_grnd -0 -? -6 -3000. 6000. 9000. 12000. 15000. 18000. -spec_pres_above_grnd -0 -? -6 -0. 3000. 6000. 9000. 12000. 15000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -72 -RH_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -RH -? -? -spec_pres_above_grnd -0 -? -6 -3000. 6000. 9000. 12000. 15000. 18000. -spec_pres_above_grnd -0 -? -6 -0. 3000. 6000. 9000. 12000. 15000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -2.0 -0 -0 -0 -? -? -? -88 -MCONV_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -MCONV -NCEP -? -spec_pres_above_grnd -0 -? -1 -3000. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -89 -PWAT_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -PWAT -? -? -spec_pres_above_grnd -0 -? -1 -3000. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -73 -UGRD_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -UGRD -? -? -spec_pres_above_grnd -0 -? -6 -3000. 6000. 9000. 12000. 15000. 18000. -spec_pres_above_grnd -0 -? -6 -0. 3000. 6000. 9000. 12000. 15000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -74 -VGRD_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -VGRD -? -? -spec_pres_above_grnd -0 -? -6 -3000. 6000. 9000. 12000. 15000. 18000. -spec_pres_above_grnd -0 -? -6 -0. 3000. 6000. 9000. 12000. 15000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -90 -VVEL_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -VVEL -? -? -spec_pres_above_grnd -0 -? -3 -3000. 9000. 18000. -spec_pres_above_grnd -0 -? -3 -0. 6000. 15000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -148 -PRES_ON_CLOUD_BASE -? -1 -tmpl4_0 -PRES -? -? -cloud_base -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -149 -PRES_ON_CLOUD_TOP -? -1 -tmpl4_0 -PRES -? -? -cloud_top -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -168 -TMP_ON_CLOUD_TOP -? -1 -tmpl4_0 -TMP -? -? -cloud_top -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -178 -HGT_ON_CLOUD_BASE -? -1 -tmpl4_0 -HGT -? -? -cloud_base -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -179 -HGT_ON_CLOUD_TOP -? -1 -tmpl4_0 -HGT -? -? -cloud_top -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -168 -TMP_ON_CLOUD_TOP -? -1 -tmpl4_0 -TMP -? -? -cloud_top -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -173 -PRES_ON_MAX_WIND -? -1 -tmpl4_0 -PRES -? -? -max_wind -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -174 -HGT_ON_MAX_WIND -? -1 -tmpl4_0 -HGT -? -? -max_wind -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -175 -UGRD_ON_MAX_WIND -? -1 -tmpl4_0 -UGRD -? -? -max_wind -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -176 -VGRD_ON_MAX_WIND -? -1 -tmpl4_0 -VGRD -? -? -max_wind -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -252 -REFC_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -REFC -NCEP -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -276 -REFZR_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -REFZR -NCEP -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -277 -REFZI_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -REFZI -NCEP -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -253 -REFD_ON_SPEC_HGT_LVL_ABOVE_GRND -? -1 -tmpl4_0 -REFD -NCEP -? -spec_hgt_lvl_above_grnd -0 -? -2 -4000. 1000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -279 -REFZR_ON_SPEC_HGT_LVL_ABOVE_GRND -? -1 -tmpl4_0 -REFZR -NCEP -? -spec_hgt_lvl_above_grnd -0 -? -2 -4000. 1000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -280 -REFZI_ON_SPEC_HGT_LVL_ABOVE_GRND -? -1 -tmpl4_0 -REFZI -NCEP -? -spec_hgt_lvl_above_grnd -0 -? -2 -4000. 1000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -221 -HPBL_ON_SURFACE -? -1 -tmpl4_0 -HPBL -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -194 -PRES_ON_GRID_SCALE_CLOUD_BOT_LVL -? -1 -tmpl4_0 -PRES -? -? -grid_scale_cloud_bot_lvl -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -195 -PRES_ON_GRID_SCALE_CLOUD_TOP_LVL -? -1 -tmpl4_0 -PRES -? -? -grid_scale_cloud_top_lvl -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -200 -TCOLW_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -TCOLW -NCEP -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -201 -TCOLI_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -TCOLI -NCEP -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -202 -TCOLR_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -TCOLR -NCEP -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -203 -TCOLS_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -TCOLS -NCEP -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -204 -TCOLC_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -TCOLC -NCEP -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -428 -TCOLG_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -TCOLG -? -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -285 -TCLSW_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -TCLSW -NCEP -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -286 -TCOLM_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -TCOLM -NCEP -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -287 -HGT_ON_LWST_BOT_LVL_OF_SUPERCOOLED_LIQ_WATER_LYR -? -1 -tmpl4_0 -HGT -? -? -lwst_bot_lvl_of_supercooled_liq_water_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -288 -HGT_ON_HGHST_TOP_LVL_OF_SUPERCOOLED_LIQ_WATER_LYR -? -1 -tmpl4_0 -HGT -? -? -hghst_top_lvl_of_supercooled_liq_water_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -260 -HGT_ON_CLOUD_CEILING -? -1 -tmpl4_0 -HGT -? -? -cloud_ceilng -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -256 -ACM_LSPA_ON_SURFACE -? -1 -tmpl4_8 -LSPA -NCEP -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -282 -PRES_ON_TOP_OF_ATMOS -? -1 -tmpl4_0 -PRES -? -? -top_of_atmos -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -290 -SWHR_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -SWHR -NCEP -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -291 -LWHR_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -LWHR -NCEP -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -292 -AVE_LRGHR_ON_ENTIRE_ATMOS -? -1 -tmpl4_8 -LRGHR -NCEP -AVE -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -295 -MCONV_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -MCONV -NCEP -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -296 -TMP_ON_SIGMA_LVL_HPC -? -1 -tmpl4_0 -TMP -? -? -sigma_lvl -1 -4 -5 -9000. 8500. 8000. 7500. 7000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -344 -PBLREG_ON_SURFACE -? -1 -tmpl4_0 -PBLREG -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -2.0 -0 -0 -0 -? -? -? -389 -UGRD_ON_PLANETARY_BOUND_LYR -? -1 -tmpl4_0 -UGRD -? -? -planetary_bound_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -390 -VGRD_ON_PLANETARY_BOUND_LYR -? -1 -tmpl4_0 -VGRD -? -? -planetary_bound_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -289 -HGT_ON_PLANETARY_BOUND_LYR -? -1 -tmpl4_0 -HGT -? -? -planetary_bound_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -381 -MIXHT_ON_SURFACE -? -1 -tmpl4_0 -MIXHT -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -400 -RETOP_ON_ENTIRE_ATMOS_SINGLE_LYR -? -1 -tmpl4_0 -RETOP -NCEP -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -454 -VRATE_ON_PLANETARY_BOUND_LYR -Ventilation Rate on planetary boundary layer -1 -tmpl4_0 -VRATE -NCEP -? -planetary_bound_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -455 -HINDEX_ON_SURFACE -Haines Index on surface -1 -tmpl4_0 -HINDEX -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -345 -MAX_TMAX_ON_SPEC_HGT_LVL_ABOVE_GRND_2m -? -1 -tmpl4_8 -TMAX -? -MAX -spec_hgt_lvl_above_grnd -0 -? -1 -2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -346 -MIN_TMIN_ON_SPEC_HGT_LVL_ABOVE_GRND_2m -? -1 -tmpl4_8 -TMIN -? -MIN -spec_hgt_lvl_above_grnd -0 -? -1 -2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -347 -MAX_MAXRH_ON_SPEC_HGT_LVL_ABOVE_GRND_2m -? -1 -tmpl4_8 -MAXRH -? -MAX -spec_hgt_lvl_above_grnd -0 -? -1 -2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --2.0 -0 -0 -0 -? -? -? -348 -MIN_MINRH_ON_SPEC_HGT_LVL_ABOVE_GRND_2m -? -1 -tmpl4_8 -MINRH -NCEP -MIN -spec_hgt_lvl_above_grnd -0 -? -1 -2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --2.0 -0 -0 -0 -? -? -? -506 -MAX_MAXUW_ON_SPEC_HGT_LVL_ABOVE_GRND_10m -U Component of Hourly Maximum 10m Wind Speed (m/s) -1 -tmpl4_8 -MAXUW -NCEP -MAX -spec_hgt_lvl_above_grnd -0 -? -1 -10. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -507 -MAX_MAXVW_ON_SPEC_HGT_LVL_ABOVE_GRND_10m -V Component of Hourly Maximum 10m Wind Speed (m/s) -1 -tmpl4_8 -MAXVW -NCEP -MAX -spec_hgt_lvl_above_grnd -0 -? -1 -10. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -422 -MAX_WIND_ON_SPEC_HGT_LVL_ABOVE_GRND_10m -maximum wind speed on 10 meter Above Ground -1 -tmpl4_8 -WIND -? -MAX -spec_hgt_lvl_above_grnd -0 -? -1 -10. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -421 -MAX_REF_ON_SPEC_HGT_LVL_ABOVE_GRND_1km -maximum Updraft Helicity on Specified Height Level Above Ground -1 -tmpl4_8 -MAXREF -NCEP -MAX -spec_hgt_lvl_above_grnd -0 -? -1 -1000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --3.0 -0 -0 -0 -? -? -? -423 -MAX_MAXUVV_ON_ISOBARIC_SFC_10-100hpa -hourly maximum Upward Vertical Velocity between 10-100hpa -1 -tmpl4_8 -MAXUVV -NCEP -MAX -isobaric_sfc -0 -? -1 -10000. -isobaric_sfc -0 -? -1 -100000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --3.0 -0 -0 -0 -? -? -? -424 -MAX_MAXDVV_ON_ISOBARIC_SFC_10-100hpa -hourly maximum Downward Vertical Velocity between 10-100hpa -1 -tmpl4_8 -MAXDVV -NCEP -MAX -isobaric_sfc -0 -? -1 -10000. -isobaric_sfc -0 -? -1 -100000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --3.0 -0 -0 -0 -? -? -? -444 -LTNG_ON_SURFACE -lightning -1 -tmpl4_0 -LTNG -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -1.0 -0 -0 -0 -? -? -? -581 -VIL_ON_ENTIRE_ATMOS -entire atmosphere Vertically Integrated Liquid (kg/m-2) -1 -tmpl4_0 -VIL -? -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -427 -UPHL_ON_SPEC_HGT_LVL_ABOVE_GRND_2-5km -Updraft Helicity on Specified Height Level Above Ground -1 -tmpl4_0 -UPHL -NCEP -? -spec_hgt_lvl_above_grnd -0 -? -1 -5000. -spec_hgt_lvl_above_grnd -0 -? -1 -2000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --3.0 -0 -0 -0 -? -? -? -420 -MAX_UPHL_ON_SPEC_HGT_LVL_ABOVE_GRND_2-5km -maximum Updraft Helicity on Specified Height Level Above Ground -1 -tmpl4_8 -MXUPHL -NCEP -MAX -spec_hgt_lvl_above_grnd -0 -? -1 -5000. -spec_hgt_lvl_above_grnd -0 -? -1 -2000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --3.0 -0 -0 -0 -? -? -? -786 -GSD_MIN_UPHL_ON_SPEC_HGT_LVL_ABOVE_GRND_2-5km -? -1 -tmpl4_8 -MNUPHL -NCEP -MIN -spec_hgt_lvl_above_grnd -0 -? -1 -5000. -spec_hgt_lvl_above_grnd -0 -? -1 -2000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --3.0 -0 -0 -0 -? -? -? -791 -GSD_MIN_UPHL_ON_SPEC_HGT_LVL_ABOVE_GRND_0-3km -? -1 -tmpl4_8 -MNUPHL -NCEP -MIN -spec_hgt_lvl_above_grnd -0 -? -1 -3000. -spec_hgt_lvl_above_grnd -0 -? -1 -0000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --3.0 -0 -0 -0 -? -? -? -790 -GSD_MAX_UPHL_ON_SPEC_HGT_LVL_ABOVE_GRND_0-3km -? -1 -tmpl4_8 -MXUPHL -NCEP -MAX -spec_hgt_lvl_above_grnd -0 -? -1 -3000. -spec_hgt_lvl_above_grnd -0 -? -1 -0000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --3.0 -0 -0 -0 -? -? -? -793 -GSD_MAX_REL_VORT_ON_SPEC_HGT_LVL_ABOVE_GRND_0-1km -? -1 -tmpl4_8 -RELV -? -MAX -spec_hgt_lvl_above_grnd -0 -? -1 -1000. -spec_hgt_lvl_above_grnd -0 -? -1 -0000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -890 -GSD_MAX_REL_VORT_ON_SPEC_HGT_LVL_HYBRID1 -Hourly max relative vorticity on hybrid level 1 -1 -tmpl4_8 -RELV -? -MAX -hybrid_lvl -0 -? -1 -1. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -792 -GSD_MAX_REL_VORT_ON_SPEC_HGT_LVL_ABOVE_GRND_0-2km -? -1 -tmpl4_8 -RELV -? -MAX -spec_hgt_lvl_above_grnd -0 -? -1 -2000. -spec_hgt_lvl_above_grnd -0 -? -1 -0000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -785 -MAX_REF_ON_ISOTHERMAL_-10C -maximum reflectivity on -10C suface -1 -tmpl4_8 -MAXREF -NCEP -MAX -isothermal -0 -? -1 -263. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --3.0 -0 -0 -0 -? -? -? -912 -REFD_ON_ISOTHERMAL -? -1 -tmpl4_0 -REFD -NCEP -? -isothermal -0 -? -1 -263. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -BGRD3D -32769 -ncep_nco -v2003 -local_tab_yes1 -fcst -oper -fcst -fcst -hour -nws_ncep -nmm_8km -complex_packing_spatial_diff -2nd_ord_sptdiff -fltng_pnt -lossless -12 -HGT_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -HGT -? -? -isobaric_sfc -0 -? -4 -25000. 50000. 70000. 85000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -13 -TMP_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -TMP -? -? -isobaric_sfc -0 -? -5 -25000. 50000. 70000. 85000. 95000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -17 -RH_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -RH -? -? -isobaric_sfc -0 -? -4 -25000. 50000. 70000. 85000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -2.0 -0 -0 -0 -? -? -? -18 -UGRD_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -UGRD -? -? -isobaric_sfc -0 -? -4 -25000. 50000. 70000. 85000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -19 -VGRD_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -VGRD -? -? -isobaric_sfc -0 -? -4 -25000. 50000. 70000. 85000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -20 -VVEL_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -VVEL -? -? -isobaric_sfc -0 -? -4 -25000. 50000. 70000. 85000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -16 -SPFH_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -SPFH -? -? -isobaric_sfc -0 -? -4 -25000. 50000. 70000. 85000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -21 -ABSV_ON_ISOBARIC_SFC -? -1 -tmpl4_0 -ABSV -? -? -isobaric_sfc -0 -? -4 -25000. 50000. 70000. 85000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -1 -PRES_ON_HYBRID_LVL -? -1 -tmpl4_0 -PRES -? -? -hybrid_lvl -0 -? -64 -1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -77 -HGT_ON_HYBRID_LVL -? -1 -tmpl4_0 -HGT -? -? -hybrid_lvl -0 -? -64 -1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -2 -TMP_ON_HYBRID_LVL -? -1 -tmpl4_0 -TMP -? -? -hybrid_lvl -0 -? -64 -1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -5 -SPFH_ON_HYBRID_LVL -? -1 -tmpl4_0 -SPFH -? -? -hybrid_lvl -0 -? -64 -1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -7.0 -0 -0 -0 -? -? -? -7 -UGRD_ON_HYBRID_LVL -? -1 -tmpl4_0 -UGRD -? -? -hybrid_lvl -0 -? -64 -1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -8 -VGRD_ON_HYBRID_LVL -? -1 -tmpl4_0 -VGRD -? -? -hybrid_lvl -0 -? -64 -1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -9 -VVEL_ON_HYBRID_LVL -? -1 -tmpl4_0 -VVEL -? -? -hybrid_lvl -0 -? -64 -1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -264 -DZDT_ON_HYBRID_LVL -? -1 -tmpl4_0 -DZDT -? -? -hybrid_lvl -0 -? -64 -1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --5.0 -0 -0 -0 -? -? -? -11 -TKE_ON_HYBRID_LVL -? -1 -tmpl4_0 -TKE -? -? -hybrid_lvl -0 -? -64 -1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -78 -AVE_LRGHR_ON_HYBRID_LVL -? -1 -tmpl4_8 -LRGHR -NCEP -AVE -hybrid_lvl -0 -? -64 -1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -23 -MSLET_ON_MEAN_SEA_LVL -? -1 -tmpl4_0 -MSLET -NCEP -? -mean_sea_lvl -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -105 -PRES_ON_MEAN_SEA_LVL -? -1 -tmpl4_0 -PRMSL -? -? -mean_sea_lvl -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -106 -TMP_ON_SPEC_HGT_LVL_ABOVE_GRND_2m -? -1 -tmpl4_0 -TMP -? -? -spec_hgt_lvl_above_grnd -0 -? -1 -2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -112 -SPFH_ON_SPEC_HGT_LVL_ABOVE_GRND_2m -? -1 -tmpl4_0 -SPFH -? -? -spec_hgt_lvl_above_grnd -0 -? -1 -2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -113 -DPT_ON_SPEC_HGT_LVL_ABOVE_GRND_2m -? -1 -tmpl4_0 -DPT -? -? -spec_hgt_lvl_above_grnd -0 -? -1 -2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -114 -RH_ON_SPEC_HGT_LVL_ABOVE_GRND_2m -? -1 -tmpl4_0 -RH -? -? -spec_hgt_lvl_above_grnd -0 -? -1 -2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -64 -UGRD_ON_SPEC_HGT_LVL_ABOVE_GRND_10m -? -1 -tmpl4_0 -UGRD -? -? -spec_hgt_lvl_above_grnd -0 -? -1 -10. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -65 -VGRD_ON_SPEC_HGT_LVL_ABOVE_GRND_10m -? -1 -tmpl4_0 -VGRD -? -? -spec_hgt_lvl_above_grnd -0 -? -1 -10. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -158 -POT_ON_SPEC_HGT_LVL_ABOVE_GRND_10m -? -1 -tmpl4_0 -POT -? -? -spec_hgt_lvl_above_grnd -0 -? -1 -10. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -159 -SPFH_ON_SPEC_HGT_LVL_ABOVE_GRND_10m -? -1 -tmpl4_0 -SPFH -? -? -spec_hgt_lvl_above_grnd -0 -? -1 -10. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -24 -PRES_ON_SURFACE -? -1 -tmpl4_0 -PRES -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -25 -HGT_ON_SURFACE -? -1 -tmpl4_0 -HGT -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -27 -POT_ON_SURFACE -? -1 -tmpl4_0 -POT -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -28 -SPFH_ON_SURFACE -? -1 -tmpl4_0 -SPFH -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -26 -TMP_ON_SURFACE -? -1 -tmpl4_0 -TMP -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -423 -MAX_MAXUVV_ON_ISOBARIC_SFC_10-100hpa -hourly maximum Upward Vertical Velocity between 10-100hpa -1 -tmpl4_8 -MAXUVV -NCEP -MAX -isobaric_sfc -0 -? -1 -10000. -isobaric_sfc -0 -? -1 -100000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --3.0 -0 -0 -0 -? -? -? -424 -MAX_MAXDVV_ON_ISOBARIC_SFC_10-100hpa -hourly maximum Downward Vertical Velocity between 10-100hpa -1 -tmpl4_8 -MAXDVV -NCEP -MAX -isobaric_sfc -0 -? -1 -10000. -isobaric_sfc -0 -? -1 -100000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --3.0 -0 -0 -0 -? -? -? -790 -GSD_MAX_UPHL_ON_SPEC_HGT_LVL_ABOVE_GRND_0-3km -? -1 -tmpl4_8 -MXUPHL -NCEP -MAX -spec_hgt_lvl_above_grnd -0 -? -1 -3000. -spec_hgt_lvl_above_grnd -0 -? -1 -0000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --3.0 -0 -0 -0 -? -? -? -420 -MAX_UPHL_ON_SPEC_HGT_LVL_ABOVE_GRND_2-5km -maximum Updraft Helicity on Specified Height Level Above Ground -1 -tmpl4_8 -MXUPHL -NCEP -MAX -spec_hgt_lvl_above_grnd -0 -? -1 -5000. -spec_hgt_lvl_above_grnd -0 -? -1 -2000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --3.0 -0 -0 -0 -? -? -? -786 -GSD_MIN_UPHL_ON_SPEC_HGT_LVL_ABOVE_GRND_2-5km -? -1 -tmpl4_8 -MNUPHL -NCEP -MIN -spec_hgt_lvl_above_grnd -0 -? -1 -5000. -spec_hgt_lvl_above_grnd -0 -? -1 -2000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --3.0 -0 -0 -0 -? -? -? -791 -GSD_MIN_UPHL_ON_SPEC_HGT_LVL_ABOVE_GRND_0-3km -? -1 -tmpl4_8 -MNUPHL -NCEP -MIN -spec_hgt_lvl_above_grnd -0 -? -1 -3000. -spec_hgt_lvl_above_grnd -0 -? -1 -0000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --3.0 -0 -0 -0 -? -? -? -793 -GSD_MAX_REL_VORT_ON_SPEC_HGT_LVL_ABOVE_GRND_0-1km -? -1 -tmpl4_8 -RELV -? -MAX -spec_hgt_lvl_above_grnd -0 -? -1 -1000. -spec_hgt_lvl_above_grnd -0 -? -1 -0000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -890 -GSD_MAX_REL_VORT_ON_SPEC_HGT_LVL_HYBRID1 -Hourly max relative vorticity on hybrid level 1 -1 -tmpl4_8 -RELV -? -MAX -hybrid_lvl -0 -? -1 -1. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -792 -GSD_MAX_REL_VORT_ON_SPEC_HGT_LVL_ABOVE_GRND_0-2km -? -1 -tmpl4_8 -RELV -? -MAX -spec_hgt_lvl_above_grnd -0 -? -1 -2000. -spec_hgt_lvl_above_grnd -0 -? -1 -0000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -506 -MAX_MAXUW_ON_SPEC_HGT_LVL_ABOVE_GRND_10m -U Component of Hourly Maximum 10m Wind Speed (m/s) -1 -tmpl4_8 -MAXUW -NCEP -MAX -spec_hgt_lvl_above_grnd -0 -? -1 -10. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -507 -MAX_MAXVW_ON_SPEC_HGT_LVL_ABOVE_GRND_10m -V Component of Hourly Maximum 10m Wind Speed (m/s) -1 -tmpl4_8 -MAXVW -NCEP -MAX -spec_hgt_lvl_above_grnd -0 -? -1 -10. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -421 -MAX_REF_ON_SPEC_HGT_LVL_ABOVE_GRND_1km -maximum Updraft Helicity on Specified Height Level Above Ground -1 -tmpl4_8 -MAXREF -NCEP -MAX -spec_hgt_lvl_above_grnd -0 -? -1 -1000. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --3.0 -0 -0 -0 -? -? -? -785 -MAX_REF_ON_ISOTHERMAL_-10C -maximum reflectivity on -10C suface -1 -tmpl4_8 -MAXREF -NCEP -MAX -isothermal -0 -? -1 -263. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --3.0 -0 -0 -0 -? -? -? -912 -REFD_ON_ISOTHERMAL -? -1 -tmpl4_0 -REFD -NCEP -? -isothermal -0 -? -1 -263. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -345 -MAX_TMAX_ON_SPEC_HGT_LVL_ABOVE_GRND_2m -? -1 -tmpl4_8 -TMAX -? -MAX -spec_hgt_lvl_above_grnd -0 -? -1 -2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -346 -MIN_TMIN_ON_SPEC_HGT_LVL_ABOVE_GRND_2m -? -1 -tmpl4_8 -TMIN -? -MIN -spec_hgt_lvl_above_grnd -0 -? -1 -2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -347 -MAX_MAXRH_ON_SPEC_HGT_LVL_ABOVE_GRND_2m -? -1 -tmpl4_8 -MAXRH -? -MAX -spec_hgt_lvl_above_grnd -0 -? -1 -2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --2.0 -0 -0 -0 -? -? -? -348 -MIN_MINRH_ON_SPEC_HGT_LVL_ABOVE_GRND_2m -? -1 -tmpl4_8 -MINRH -NCEP -MIN -spec_hgt_lvl_above_grnd -0 -? -1 -2. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --2.0 -0 -0 -0 -? -? -? -116 -TSOIL_ON_DEPTH_BEL_LAND_SFC -? -1 -tmpl4_0 -TSOIL -? -? -depth_bel_land_sfc -4 -2 2 2 2 -4 -0. 10. 40. 100. -depth_bel_land_sfc -4 -2 2 2 2 -4 -10. 40. 100. 200. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -117 -SOILW_ON_DEPTH_BEL_LAND_SFC -? -1 -tmpl4_0 -SOILW -NCEP -? -depth_bel_land_sfc -4 -2 2 2 2 -4 -0. 10. 40. 100. -depth_bel_land_sfc -4 -2 2 2 2 -4 -10. 40. 100. 200. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -36 -SOILM_ON_DEPTH_BEL_LAND_SFC -? -1 -tmpl4_0 -SOILM -? -? -depth_bel_land_sfc -1 -2 -1 -0. -depth_bel_land_sfc -1 -2 -1 -200. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -169 -SFEXC_ON_SURFACE -? -1 -tmpl4_0 -SFEXC -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -170 -VEG_ON_SURFACE -? -1 -tmpl4_0 -VEG -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -171 -MSTAV_ON_DEPTH_BEL_LAND_SFC -? -1 -tmpl4_0 -MSTAV -NCEP -? -depth_bel_land_sfc -1 -2 -1 -0. -depth_bel_land_sfc -1 -2 -1 -100. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -115 -TSOIL_ON_DEPTH_BEL_LAND_SFC_3m -? -1 -tmpl4_0 -TSOIL -? -? -depth_bel_land_sfc -0 -? -1 -3. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -152 -INST_GFLUX_ON_SURFACE -? -1 -tmpl4_0 -GFLUX -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -118 -CNWAT_ON_SURFACE -? -1 -tmpl4_0 -CNWAT -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -1.0 -0 -0 -0 -? -? -? -119 -WEASD_ON_SURFACE -? -1 -tmpl4_0 -WEASD -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -31 -4LFTX_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -4LFTX -NCEP -? -spec_pres_above_grnd -0 -? -1 -18000. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -80 -PWAT_ON_ENTIRE_ATMOS_SINGLE_LYR -? -1 -tmpl4_0 -PWAT -? -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -87 -ACM_APCP_ON_SURFACE -? -1 -tmpl4_8 -APCP -? -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -34 -ACM_NCPCP_ON_SURFACE -? -1 -tmpl4_8 -NCPCP -? -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -417 -CACM_APCP_ON_SURFACE -? -1 -tmpl4_8 -APCP -? -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -419 -CACM_NCPCP_ON_SURFACE -? -1 -tmpl4_8 -NCPCP -? -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -35 -ACM_WEASD_ON_SURFACE -? -1 -tmpl4_8 -WEASD -? -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -121 -ACM_SNOM_ON_SURFACE -? -1 -tmpl4_8 -SNOM -? -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -122 -ACM_SSRUN_ON_SURFACE -? -1 -tmpl4_8 -SSRUN -NCEP -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -123 -ACM_BGRUN_ON_SURFACE -? -1 -tmpl4_8 -BGRUN -NCEP -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -160 -INST_CRAIN_ON_SURFACE -? -1 -tmpl4_0 -CRAIN -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -1.0 -0 -0 -0 -? -? -? -551 -CSNOW_ON_SURFACE -Categorical snow on surface -1 -tmpl4_0 -CSNOW -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -1.0 -0 -0 -0 -? -? -? -552 -CICEP_ON_SURFACE -Categorical ice pellets on surface -1 -tmpl4_0 -CICEP -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -1.0 -0 -0 -0 -? -? -? -553 -CFRZR_ON_SURFACE -Categorical freezing rain on surface -1 -tmpl4_0 -CFRZR -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -1.0 -0 -0 -0 -? -? -? -167 -INST_PRATE_ON_SURFACE -? -1 -tmpl4_0 -PRATE -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -172 -CPOFP_ON_SURFACE -? -1 -tmpl4_0 -CPOFP -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -124 -CLWMR_ON_HYBRID_LVL -? -1 -tmpl4_0 -CLWMR -? -? -hybrid_lvl -0 -? -64 -1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -125 -ICMR_ON_HYBRID_LVL -? -1 -tmpl4_0 -ICMR -? -? -hybrid_lvl -0 -? -64 -1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -415 -GRLE_ON_HYBRID_LVL -Graupel mixing ration on hybrid level -1 -tmpl4_0 -GRLE -? -? -hybrid_lvl -0 -? -64 -1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -145 -TCDC_ON_HYBRID_LVL -? -1 -tmpl4_0 -TCDC -? -? -hybrid_lvl -0 -? -64 -1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -181 -RWMR_ON_HYBRID_LVL -? -1 -tmpl4_0 -RWMR -? -? -hybrid_lvl -0 -? -64 -1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -182 -SNMR_ON_HYBRID_LVL -? -1 -tmpl4_0 -SNMR -? -? -hybrid_lvl -0 -? -64 -1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -187 -RIME_ON_HYBRID_LVL -? -1 -tmpl4_0 -RIME -NCEP -? -hybrid_lvl -0 -? -64 -1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -199 -TCOND_ON_HYBRID_LVL -? -1 -tmpl4_0 -TCOND -NCEP -? -hybrid_lvl -0 -? -64 -1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -185 -FRAIN_ON_HYBRID_LVL -? -1 -tmpl4_0 -FRAIN -NCEP -? -hybrid_lvl -0 -? -64 -1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -186 -FICE_ON_HYBRID_LVL -? -1 -tmpl4_0 -FICE -NCEP -? -hybrid_lvl -0 -? -64 -1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -37 -LCDC_ON_LOW_CLOUD_LYR -? -1 -tmpl4_0 -LCDC -? -? -low_cloud_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -38 -MCDC_ON_MID_CLOUD_LYR -? -1 -tmpl4_0 -MCDC -? -? -mid_cloud_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -39 -HCDC_ON_HIGH_CLOUD_LYR -? -1 -tmpl4_0 -HCDC -? -? -high_cloud_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -161 -INST_TCDC_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -TCDC -? -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -144 -AVE_TCDC_ON_ENTIRE_ATMOS -? -1 -tmpl4_8 -TCDC -? -AVE -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -139 -AVE_CDLYR_ON_ENTIRE_ATMOS -? -1 -tmpl4_8 -CDLYR -NCEP -AVE -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -141 -INST_USWRF_ON_SURFACE -? -1 -tmpl4_0 -USWRF -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -142 -INST_ULWRF_ON_SURFACE -? -1 -tmpl4_0 -ULWRF -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -126 -AVE_DSWRF_ON_SURFACE -? -1 -tmpl4_8 -DSWRF -NCEP -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -127 -AVE_DLWRF_ON_SURFACE -? -1 -tmpl4_8 -DLWRF -NCEP -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -128 -AVE_USWRF_ON_SURFACE -? -1 -tmpl4_8 -USWRF -NCEP -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -129 -AVE_ULWRF_ON_SURFACE -? -1 -tmpl4_8 -ULWRF -NCEP -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -130 -AVE_USWRF_ON_TOP_OF_ATMOS -? -1 -tmpl4_8 -USWRF -NCEP -AVE -top_of_atmos -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -131 -AVE_ULWRF_ON_TOP_OF_ATMOS -? -1 -tmpl4_8 -ULWRF -NCEP -AVE -top_of_atmos -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -156 -INST_DSWRF_ON_SURFACE -? -1 -tmpl4_0 -DSWRF -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -157 -INST_DLWRF_ON_SURFACE -? -1 -tmpl4_0 -DLWRF -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -262 -INST_CSDSF_ON_SURFACE -? -1 -tmpl4_0 -CSDSF -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -44 -SFCR_ON_SURFACE -? -1 -tmpl4_0 -SFCR -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -2.7 -0 -0 -0 -? -? -? -45 -FRICV_ON_SURFACE -? -1 -tmpl4_0 -FRICV -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -132 -CD_ON_SURFACE -? -1 -tmpl4_0 -CD -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -133 -UFLX_ON_SURFACE -? -1 -tmpl4_0 -UFLX -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -134 -VFLX_ON_SURFACE -? -1 -tmpl4_0 -VFLX -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -43 -AVE_SHTFL_ON_SURFACE -? -1 -tmpl4_8 -SHTFL -? -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -135 -AVE_GFLUX_ON_SURFACE -? -1 -tmpl4_8 -GFLUX -NCEP -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -136 -AVE_SNOHF_ON_SURFACE -? -1 -tmpl4_8 -SNOHF -NCEP -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -42 -AVE_LHTFL_ON_SURFACE -? -1 -tmpl4_8 -LHTFL -? -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -47 -ACM_EVP_ON_SURFACE -? -1 -tmpl4_8 -EVP -? -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -137 -ACM_PEVAP_ON_SURFACE -? -1 -tmpl4_8 -PEVAP -NCEP -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -154 -INST_SHTFL_ON_SURFACE -? -1 -tmpl4_0 -SHTFL -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -155 -INST_LHTFL_ON_SURFACE -? -1 -tmpl4_0 -LHTFL -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -48 -NLAT_ON_SURFACE -? -1 -tmpl4_0 -NLAT -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -49 -ELON_ON_SURFACE -? -1 -tmpl4_0 -ELON -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -50 -LAND_ON_SURFACE -? -1 -tmpl4_0 -LAND -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -1.0 -0 -0 -0 -? -? -? -51 -ICEC_ON_SURFACE -? -1 -tmpl4_0 -ICEC -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -52 -LMH_ON_SURFACE -? -1 -tmpl4_0 -LMH -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -2.0 -0 -0 -0 -? -? -? -53 -LMV_ON_SURFACE -? -1 -tmpl4_0 -LMV -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -2.0 -0 -0 -0 -? -? -? -150 -ALBDO_ON_SURFACE -? -1 -tmpl4_0 -ALBDO -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -151 -WTMP_ON_SURFACE -? -1 -tmpl4_0 -WTMP -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -67 -PRES_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -PRES -? -? -spec_pres_above_grnd -0 -? -6 -3000. 6000. 9000. 12000. 15000. 18000. -spec_pres_above_grnd -0 -? -6 -0. 3000. 6000. 9000. 12000. 15000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -68 -TMP_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -TMP -? -? -spec_pres_above_grnd -0 -? -6 -3000. 6000. 9000. 12000. 15000. 18000. -spec_pres_above_grnd -0 -? -6 -0. 3000. 6000. 9000. 12000. 15000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -69 -POT_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -POT -? -? -spec_pres_above_grnd -0 -? -1 -3000. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -70 -DPT_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -DPT -? -? -spec_pres_above_grnd -0 -? -1 -3000. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -71 -SPFH_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -SPFH -? -? -spec_pres_above_grnd -0 -? -6 -3000. 6000. 9000. 12000. 15000. 18000. -spec_pres_above_grnd -0 -? -6 -0. 3000. 6000. 9000. 12000. 15000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -72 -RH_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -RH -? -? -spec_pres_above_grnd -0 -? -6 -3000. 6000. 9000. 12000. 15000. 18000. -spec_pres_above_grnd -0 -? -6 -0. 3000. 6000. 9000. 12000. 15000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -2.0 -0 -0 -0 -? -? -? -88 -MCONV_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -MCONV -NCEP -? -spec_pres_above_grnd -0 -? -1 -3000. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -89 -PWAT_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -PWAT -? -? -spec_pres_above_grnd -0 -? -1 -3000. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -73 -UGRD_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -UGRD -? -? -spec_pres_above_grnd -0 -? -6 -3000. 6000. 9000. 12000. 15000. 18000. -spec_pres_above_grnd -0 -? -6 -0. 3000. 6000. 9000. 12000. 15000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -74 -VGRD_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -VGRD -? -? -spec_pres_above_grnd -0 -? -6 -3000. 6000. 9000. 12000. 15000. 18000. -spec_pres_above_grnd -0 -? -6 -0. 3000. 6000. 9000. 12000. 15000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -256 -ACM_LSPA_ON_SURFACE -? -1 -tmpl4_8 -LSPA -NCEP -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -282 -PRES_ON_TOP_OF_ATMOS -? -1 -tmpl4_0 -PRES -? -? -top_of_atmos -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -283 -PRES_ON_HYBRID_LVL_1L -? -1 -tmpl4_0 -PRES -? -? -hybrid_lvl -0 -? -1 -1. -hybrid_lvl -0 -? -1 -21. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -273 -PRES_ON_HYBRID_LVL_LLM -? -1 -tmpl4_0 -PRES -? -? -hybrid_lvl -0 -? -1 -1. -hybrid_lvl -0 -? -1 -61. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -118 -CNWAT_ON_SURFACE -? -1 -tmpl4_0 -CNWAT -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -1.0 -0 -0 -0 -? -? -? -152 -INST_GFLUX_ON_SURFACE -? -1 -tmpl4_0 -GFLUX -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -30 -LFTX_ON_ISOBARIC_SFC_500-1000hpa -? -1 -tmpl4_0 -LFTX -NCEP -? -isobaric_sfc -0 -? -1 -50000. -isobaric_sfc -0 -? -1 -100000. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -32 -CAPE_ON_SURFACE -? -1 -tmpl4_0 -CAPE -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -566 -BEST_CAPE_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -CAPE -? -? -spec_pres_above_grnd -0 -? -1 -18000. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -582 -MIXED_LAYER_CAPE_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -CAPE -? -? -spec_pres_above_grnd -0 -? -1 -9000. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -584 -UNSTABLE_CAPE_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -CAPE -? -? -spec_pres_above_grnd -0 -? -1 -25500. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -107 -CIN_ON_SURFACE -? -1 -tmpl4_0 -CIN -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -567 -BEST_CIN_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -CIN -? -? -spec_pres_above_grnd -0 -? -1 -18000. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -583 -MIXED_LAYER_CIN_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -CIN -? -? -spec_pres_above_grnd -0 -? -1 -9000. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -585 -UNSTABLE_CIN_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -CIN -? -? -spec_pres_above_grnd -0 -? -1 -25500. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -246 -PLPL_ON_SPEC_PRES_ABOVE_GRND -? -1 -tmpl4_0 -PLPL -NCEP -? -spec_pres_above_grnd -0 -? -1 -25500. -spec_pres_above_grnd -0 -? -1 -0. -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -162 -HLCY_ON_SPEC_HGT_LVL_ABOVE_GRND -? -1 -tmpl4_0 -HLCY -? -? -spec_hgt_lvl_above_grnd -0 -? -2 -3000. 1000. -spec_hgt_lvl_above_grnd -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -163 -USTM_ON_SPEC_HGT_LVL_ABOVE_GRND -? -1 -tmpl4_0 -USTM -NCEP -? -spec_hgt_lvl_above_grnd -0 -? -1 -6000. -spec_hgt_lvl_above_grnd -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -164 -VSTM_ON_SPEC_HGT_LVL_ABOVE_GRND -? -1 -tmpl4_0 -VSTM -NCEP -? -spec_hgt_lvl_above_grnd -0 -? -1 -6000. -spec_hgt_lvl_above_grnd -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -37 -LCDC_ON_LOW_CLOUD_LYR -? -1 -tmpl4_0 -LCDC -? -? -low_cloud_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -38 -MCDC_ON_MID_CLOUD_LYR -? -1 -tmpl4_0 -MCDC -? -? -mid_cloud_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -39 -HCDC_ON_HIGH_CLOUD_LYR -? -1 -tmpl4_0 -HCDC -? -? -high_cloud_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -144 -AVE_TCDC_ON_ENTIRE_ATMOS -? -1 -tmpl4_8 -TCDC -? -AVE -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -139 -AVE_CDLYR_ON_ENTIRE_ATMOS -? -1 -tmpl4_8 -CDLYR -NCEP -AVE -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -148 -PRES_ON_CLOUD_BASE -? -1 -tmpl4_0 -PRES -? -? -cloud_base -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -149 -PRES_ON_CLOUD_TOP -? -1 -tmpl4_0 -PRES -? -? -cloud_top -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -168 -TMP_ON_CLOUD_TOP -? -1 -tmpl4_0 -TMP -? -? -cloud_top -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -135 -AVE_GFLUX_ON_SURFACE -? -1 -tmpl4_8 -GFLUX -NCEP -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -136 -AVE_SNOHF_ON_SURFACE -? -1 -tmpl4_8 -SNOHF -NCEP -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -47 -ACM_EVP_ON_SURFACE -? -1 -tmpl4_8 -EVP -? -ACM -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -154 -INST_SHTFL_ON_SURFACE -? -1 -tmpl4_0 -SHTFL -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -155 -INST_LHTFL_ON_SURFACE -? -1 -tmpl4_0 -LHTFL -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -54 -PRES_ON_TROPOPAUSE -? -1 -tmpl4_0 -PRES -? -? -tropopause -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -177 -HGT_ON_TROPOPAUSE -? -1 -tmpl4_0 -HGT -? -? -tropopause -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -55 -TMP_ON_TROPOPAUSE -? -1 -tmpl4_0 -TMP -? -? -tropopause -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -56 -UGRD_ON_TROPOPAUSE -? -1 -tmpl4_0 -UGRD -? -? -tropopause -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -57 -VGRD_ON_TROPOPAUSE -? -1 -tmpl4_0 -VGRD -? -? -tropopause -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -58 -VWSH_ON_TROPOPAUSE -? -1 -tmpl4_0 -VWSH -NCEP -? -tropopause -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -59 -TMP_ON_SPEC_ALT_ABOVE_MEAN_SEA_LVL -? -1 -tmpl4_0 -TMP -? -? -spec_alt_above_mean_sea_lvl -0 -? -10 -305. 457. 610. 914. 1524. 1829. 2134. 2743. 3658. 4572. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -60 -UGRD_ON_SPEC_ALT_ABOVE_MEAN_SEA_LVL -? -1 -tmpl4_0 -UGRD -? -? -spec_alt_above_mean_sea_lvl -0 -? -10 -305. 457. 610. 914. 1524. 1829. 2134. 2743. 3658. 4572. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -61 -VGRD_ON_SPEC_ALT_ABOVE_MEAN_SEA_LVL -? -1 -tmpl4_0 -VGRD -? -? -spec_alt_above_mean_sea_lvl -0 -? -10 -305. 457. 610. 914. 1524. 1829. 2134. 2743. 3658. 4572. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -62 -HGT_ON_0C_ISOTHERM -? -1 -tmpl4_0 -HGT -? -? -0C_isotherm -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -63 -RH_ON_0C_ISOTHERM -? -1 -tmpl4_0 -RH -? -? -0C_isotherm -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -2.0 -0 -0 -0 -? -? -? -165 -HGT_ON_HGHST_TROP_FRZ_LVL -? -1 -tmpl4_0 -HGT -? -? -hghst_trop_frz_lvl -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -173 -PRES_ON_MAX_WIND -? -1 -tmpl4_0 -PRES -? -? -max_wind -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -174 -HGT_ON_MAX_WIND -? -1 -tmpl4_0 -HGT -? -? -max_wind -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -175 -UGRD_ON_MAX_WIND -? -1 -tmpl4_0 -UGRD -? -? -max_wind -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -176 -VGRD_ON_MAX_WIND -? -1 -tmpl4_0 -VGRD -? -? -max_wind -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -422 -MAX_WIND_ON_SPEC_HGT_LVL_ABOVE_GRND_10m -maximum wind speed on 10 meter Above Ground -1 -tmpl4_8 -WIND -? -MAX -spec_hgt_lvl_above_grnd -0 -? -1 -10. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -178 -HGT_ON_CLOUD_BASE -? -1 -tmpl4_0 -HGT -? -? -cloud_base -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -179 -HGT_ON_CLOUD_TOP -? -1 -tmpl4_0 -HGT -? -? -cloud_top -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -180 -VIS_ON_SURFACE -? -1 -tmpl4_0 -VIS -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -252 -REFC_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -REFC -NCEP -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -194 -PRES_ON_GRID_SCALE_CLOUD_BOT_LVL -? -1 -tmpl4_0 -PRES -? -? -grid_scale_cloud_bot_lvl -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -195 -PRES_ON_GRID_SCALE_CLOUD_TOP_LVL -? -1 -tmpl4_0 -PRES -? -? -grid_scale_cloud_top_lvl -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -200 -TCOLW_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -TCOLW -NCEP -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -201 -TCOLI_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -TCOLI -NCEP -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -202 -TCOLR_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -TCOLR -NCEP -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -203 -TCOLS_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -TCOLS -NCEP -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -204 -TCOLC_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -TCOLC -NCEP -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -428 -TCOLG_ON_ENTIRE_ATMOS -? -1 -tmpl4_0 -TCOLG -? -? -entire_atmos_single_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -218 -VGTYP_ON_SURFACE -? -1 -tmpl4_0 -VGTYP -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -219 -SOTYP_ON_SURFACE -? -1 -tmpl4_0 -SOTYP -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -220 -CCOND_ON_SURFACE -? -1 -tmpl4_0 -CCOND -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -221 -HPBL_ON_SURFACE -? -1 -tmpl4_0 -HPBL -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -224 -SNOD_ON_SURFACE -? -1 -tmpl4_0 -SNOD -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -231 -SBSNO_ON_SURFACE -? -1 -tmpl4_0 -SBSNO -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -232 -SMDRY_ON_SURFACE -? -1 -tmpl4_0 -SMDRY -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -233 -POROS_ON_SURFACE -? -1 -tmpl4_0 -POROS -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -234 -RSMIN_ON_SURFACE -? -1 -tmpl4_0 -RSMIN -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -235 -RLYRS_ON_SURFACE -? -1 -tmpl4_0 -RLYRS -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -236 -WILT_ON_SURFACE -? -1 -tmpl4_0 -WILT -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -237 -SMREF_ON_SURFACE -? -1 -tmpl4_0 -SMREF -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -238 -RCS_ON_SURFACE -? -1 -tmpl4_0 -RCS -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -239 -RCT_ON_SURFACE -? -1 -tmpl4_0 -RCT -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -240 -RCQ_ON_SURFACE -? -1 -tmpl4_0 -RCQ -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -241 -RCSOL_ON_SURFACE -? -1 -tmpl4_0 -RCSOL -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -242 -PEVPR_ON_SURFACE -? -1 -tmpl4_0 -PEVPR -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -6.0 -0 -0 -0 -? -? -? -245 -GUST_ON_SURFACE -? -1 -tmpl4_0 -GUST -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -247 -HGT_ON_LWST_LVL_OF_WET_BULB_ZERO -? -1 -tmpl4_0 -HGT -? -? -lwst_lvl_of_wet_bulb_zero -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --5.0 -0 -0 -0 -? -? -? -254 -LAI_ON_SURFACE -? -1 -tmpl4_0 -LAI -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --3.0 -0 -0 -0 -? -? -? -262 -INST_CSDSF_ON_SURFACE -? -1 -tmpl4_0 -CSDSF -NCEP -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -4.0 -0 -0 -0 -? -? -? -222 -TCDC_ON_SIGMA_LVLS -? -1 -tmpl4_0 -TCDC -? -? -sigma_lvl -1 -4 -22 -9975. 9915. 9835. 9745. 9650. 9490. 9260. 9015. 8755. 8480. 8190. 7890. 7585. 7185. 6690. 6180. 5470. 4550. 3595. 2605. 1580. 530. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -289 -HGT_ON_PLANETARY_BOUND_LYR -? -1 -tmpl4_0 -HGT -? -? -planetary_bound_lyr -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -381 -MIXHT_ON_SURFACE -? -1 -tmpl4_0 -MIXHT -? -? -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -505 -TMP_ON_SPEC_HGT_LVL_ABOVE_GRND_10m -? -1 -tmpl4_0 -TMP -? -? -spec_hgt_lvl_above_grnd -0 -? -1 -10. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -500 -AVE_SNOWC_ON_SURFACE -? -1 -tmpl4_8 -SNOWC -NCEP -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -501 -AVE_PRES_ON_SURFACE -? -1 -tmpl4_8 -PRES -? -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -5.0 -0 -0 -0 -? -? -? -502 -AVE_TMP_ON_SPEC_HGT_LVL_ABOVE_GRND_10m -? -1 -tmpl4_8 -TMP -? -AVE -spec_hgt_lvl_above_grnd -0 -? -1 -10. -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 --4.0 -0 -0 -0 -? -? -? -503 -AVE_AKHS_ON_SURFACE -? -1 -tmpl4_8 -AKHS -NCEP -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? -504 -AVE_AKMS_ON_SURFACE -? -1 -tmpl4_8 -AKMS -NCEP -AVE -surface -0 -? -0 -? -? -0 -? -0 -? -? -? -0 -0.0 -0 -0.0 -? -0 -0.0 -0 -0.0 -1 -3.0 -0 -0 -0 -? -? -? diff --git a/jobs/JREGIONAL_GET_EXTRN_MDL_FILES b/jobs/JREGIONAL_GET_EXTRN_MDL_FILES index 94eb6dfc6..27c14192f 100755 --- a/jobs/JREGIONAL_GET_EXTRN_MDL_FILES +++ b/jobs/JREGIONAL_GET_EXTRN_MDL_FILES @@ -206,7 +206,7 @@ cd_vrfy "${extrn_mdl_staging_dir}" get_extrn_mdl_file_dir_info \ extrn_mdl_name="${EXTRN_MDL_NAME}" \ anl_or_fcst="${anl_or_fcst}" \ - cdate_FV3SAR="${CDATE}" \ + cdate_FV3LAM="${CDATE}" \ time_offset_hrs="${time_offset_hrs}" \ varname_extrn_mdl_cdate="extrn_mdl_cdate" \ varname_extrn_mdl_lbc_spec_fhrs="extrn_mdl_lbc_spec_fhrs" \ diff --git a/jobs/JREGIONAL_MAKE_GRID b/jobs/JREGIONAL_MAKE_GRID index a8b1fbe2e..0ff122bad 100755 --- a/jobs/JREGIONAL_MAKE_GRID +++ b/jobs/JREGIONAL_MAKE_GRID @@ -4,7 +4,7 @@ #----------------------------------------------------------------------- # # This script generates grid and orography files in NetCDF format that -# are required as inputs for running the FV3SAR model (i.e. the FV3 mo- +# are required as inputs for running the FV3-LAM model (i.e. the FV3 mo- # del on a regional domain). It in turn calls three other scripts whose # file names are specified in the variables grid_gen_scr, orog_gen_scr, # and orog_fltr_scr and then calls the executable defined in the varia- @@ -28,7 +28,7 @@ # large enough such that the "shave" steps later below (which take # this file as input and generate grid files with thinner halos) # have a wide enough starting halo to work with. More specifical- -# ly, the FV3SAR model needs as inputs two grid files: one with a +# ly, the FV3-LAM model needs as inputs two grid files: one with a # halo that is 3 cells and another with a halo that is 4 cells # wide. Thus, the halo in the grid file that the grid_gen_scr # script generates must be greater than 4 since otherwise, the @@ -38,7 +38,7 @@ # name denotes number of cells, the "h" is used to indicate that # it refers to a halo region, the "w" is used to indicate that it # refers to a wide halo (i.e. wider than the 3-cell and 4-cell ha- -# los that the FV3SAR model requires as inputs, and the "T7" is +# los that the FV3-LAM model requires as inputs, and the "T7" is # used to indicate that the cell count is on tile 7. # # 2) orog_gen_scr: @@ -63,7 +63,7 @@ # generated by script orog_gen_scr (and the grid file generated by # grid_gen_scr). # -# b) In analogy with the input grid files, the FV3SAR model needs as +# b) In analogy with the input grid files, the FV3-LAM model needs as # input two (filtered) orography files -- one with no halo cells # and another with 3. These are obtained later below by "shaving" # off layers of halo cells from the (filtered) orography file ge- diff --git a/jobs/JREGIONAL_RUN_POST b/jobs/JREGIONAL_RUN_POST index 28df0dc03..bddc87aa4 100755 --- a/jobs/JREGIONAL_RUN_POST +++ b/jobs/JREGIONAL_RUN_POST @@ -4,7 +4,7 @@ #----------------------------------------------------------------------- # # This script runs the post-processor (UPP) on the NetCDF output files -# of the write component of the FV3SAR model. +# of the write component of the FV3-LAM model. # #----------------------------------------------------------------------- # diff --git a/scripts/exregional_get_extrn_mdl_files.sh b/scripts/exregional_get_extrn_mdl_files.sh index f94b0409e..ab54da812 100755 --- a/scripts/exregional_get_extrn_mdl_files.sh +++ b/scripts/exregional_get_extrn_mdl_files.sh @@ -631,7 +631,7 @@ file unzip_log_fn in that directory for details: # of each external model file. If any are missing, then the corresponding # files are not in the zip file and thus cannot be extracted. In that # case, print out a message and exit the script because initial condition -# and surface field files for the FV3SAR cannot be generated without all +# and surface field files for the FV3-LAM cannot be generated without all # the external model files. # #----------------------------------------------------------------------- @@ -690,7 +690,7 @@ details: print_info_msg " ======================================================================== External model files needed for generating initial condition and surface -fields for the FV3SAR successfully fetched from HPSS!!! +fields for the FV3-LAM successfully fetched from HPSS!!! Exiting script: \"${scrfunc_fn}\" In directory: \"${scrfunc_dir}\" @@ -701,7 +701,7 @@ In directory: \"${scrfunc_dir}\" print_info_msg " ======================================================================== External model files needed for generating lateral boundary conditions -on the halo of the FV3SAR's regional grid successfully fetched from +on the halo of the FV3-LAM's regional grid successfully fetched from HPSS!!! Exiting script: \"${scrfunc_fn}\" diff --git a/scripts/exregional_make_grid.sh b/scripts/exregional_make_grid.sh index cfe7ea562..977c9c99c 100755 --- a/scripts/exregional_make_grid.sh +++ b/scripts/exregional_make_grid.sh @@ -189,7 +189,7 @@ mkdir_vrfy -p "$tmpdir" # GRID_DIR. Note that the file for tile 7 will include a halo of width # NHW cells. # -# Since tiles 1 through 6 are not needed to run the FV3SAR model and are +# Since tiles 1 through 6 are not needed to run the FV3-LAM model and are # not used later on in any other preprocessing steps, it is not clear # why they are generated. It might be because it is not possible to di- # rectly generate a standalone regional grid using the make_hgrid uti- @@ -283,7 +283,7 @@ mkdir_vrfy -p "$tmpdir" # if [ "${GRID_GEN_METHOD}" = "GFDLgrid" ]; then exec_fn="make_hgrid" -elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then +elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then exec_fn="regional_grid" fi @@ -343,11 +343,11 @@ nonzero exit code. # grid_fn="${grid_name}.tile${TILE_RGNL}.nc" # -# Generate a JPgrid-type of grid. +# Generate a ESGgrid-type of grid. # -elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then +elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then # -# Create the namelist file read in by the JPgrid-type grid generation +# Create the namelist file read in by the ESGgrid-type grid generation # code in the temporary subdirectory. # rgnl_grid_nml_fp="$tmpdir/${RGNL_GRID_NML_FN}" @@ -372,9 +372,9 @@ generation executable (exec_fp): 'dely': ${DEL_ANGLE_Y_SG}, 'lx': ${NEG_NX_OF_DOM_WITH_WIDE_HALO}, 'ly': ${NEG_NY_OF_DOM_WITH_WIDE_HALO}, - 'a': ${JPgrid_ALPHA_PARAM}, - 'k': ${JPgrid_KAPPA_PARAM}, - } + 'a': ${ESGgrid_ALPHA_PARAM}, + 'k': ${ESGgrid_KAPPA_PARAM}, +} " # # Call the python script to create the namelist file. @@ -393,7 +393,7 @@ $settings" # $APRUN ${exec_fp} ${rgnl_grid_nml_fp} || \ print_err_msg_exit "\ -Call to executable (exec_fp) that generates a JPgrid-type regional grid +Call to executable (exec_fp) that generates a ESGgrid-type regional grid returned with nonzero exit code: exec_fp = \"${exec_fp}\"" # @@ -461,7 +461,7 @@ if [ "${GRID_GEN_METHOD}" = "GFDLgrid" ]; then else CRES="C${res_equiv}" fi -elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then +elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then CRES="C${res_equiv}" fi set_file_param "${GLOBAL_VAR_DEFNS_FP}" "CRES" "\"$CRES\"" @@ -482,22 +482,22 @@ mv_vrfy "${grid_fp_orig}" "${grid_fp}" # # If there are pre-existing orography or climatology files that we will # be using (i.e. if RUN_TASK_MAKE_OROG or RUN_TASK_MAKE_SURF_CLIMO is set -# to "FALSE", in which case RES_IN_FIXSAR_FILENAMES will not be set to a +# to "FALSE", in which case RES_IN_FIXLAM_FILENAMES will not be set to a # null string), check that the grid resolution contained in the variable # CRES set above matches the resolution appearing in the names of the # preexisting orography and/or surface climatology files. # #----------------------------------------------------------------------- # -if [ ! -z "${RES_IN_FIXSAR_FILENAMES}" ]; then +if [ ! -z "${RES_IN_FIXLAM_FILENAMES}" ]; then res="${CRES:1}" - if [ "$res" -ne "${RES_IN_FIXSAR_FILENAMES}" ]; then + if [ "$res" -ne "${RES_IN_FIXLAM_FILENAMES}" ]; then print_err_msg_exit "\ The resolution (res) calculated for the grid does not match the resolution -(RES_IN_FIXSAR_FILENAMES) appearing in the names of the orography and/or +(RES_IN_FIXLAM_FILENAMES) appearing in the names of the orography and/or surface climatology files: res = \"$res\" - RES_IN_FIXSAR_FILENAMES = \"${RES_IN_FIXSAR_FILENAMES}\"" + RES_IN_FIXLAM_FILENAMES = \"${RES_IN_FIXLAM_FILENAMES}\"" fi fi # @@ -635,7 +635,7 @@ halo failed." # #----------------------------------------------------------------------- # -# Create symlinks in the FIXsar directory to the grid and mosaic files +# Create symlinks in the FIXLAM directory to the grid and mosaic files # generated above in the GRID_DIR directory. # #----------------------------------------------------------------------- @@ -654,7 +654,7 @@ failed." # paths to the surface climatology files. These files will either already # be avaialable in a user-specified directory (SFC_CLIMO_DIR) or will be # generated by the MAKE_SFC_CLIMO_TN task. They (or symlinks to them) -# will be placed (or wll already exist) in the FIXsar directory. +# will be placed (or wll already exist) in the FIXLAM directory. # # Also, if running ensemble forecasts, call a function (set_FV3nml_stoch_params) # to create a new FV3 namelist file for each ensemble member that contains diff --git a/scripts/exregional_make_ics.sh b/scripts/exregional_make_ics.sh index 0da673482..f02fd03ea 100755 --- a/scripts/exregional_make_ics.sh +++ b/scripts/exregional_make_ics.sh @@ -376,7 +376,7 @@ HRRRX grib2 files created after about \"${cdate_min_HRRRX}\"..." # These geogrid files need to be moved to more permanent locations. # if [ "${MACHINE}" = "HERA" ]; then - geogrid_file_input_grid="/scratch2/BMC/det/beck/FV3-SAR/geo_em.d01.nc_HRRRX" + geogrid_file_input_grid="/scratch2/BMC/det/beck/FV3-LAM/geo_em.d01.nc_HRRRX" elif [ "${MACHINE}" = "JET" ]; then geogrid_file_input_grid="/misc/whome/rtrr/HRRR/static/WPS/geo_em.d01.nc" fi @@ -415,7 +415,7 @@ HRRRX grib2 files created after about \"${cdate_min_HRRRX}\"..." # These geogrid files need to be moved to more permanent locations. # if [ "${MACHINE}" = "HERA" ]; then - geogrid_file_input_grid="/scratch2/BMC/det/beck/FV3-SAR/geo_em.d01.nc_RAPX" + geogrid_file_input_grid="/scratch2/BMC/det/beck/FV3-LAM/geo_em.d01.nc_RAPX" elif [ "${MACHINE}" = "JET" ]; then geogrid_file_input_grid="/misc/whome/rtrr/HRRR/static/WPS/geo_em.d01.nc" fi @@ -457,7 +457,7 @@ exec_fn="chgres_cube.exe" exec_fp="$EXECDIR/${exec_fn}" if [ ! -f "${exec_fp}" ]; then print_err_msg_exit "\ -The executable (exec_fp) for generating initial conditions on the FV3SAR +The executable (exec_fp) for generating initial conditions on the FV3-LAM native grid does not exist: exec_fp = \"${exec_fp}\" Please ensure that you've built this executable." @@ -508,7 +508,7 @@ fi # config.C768.nest.atm.theia.nml:23: tracers_input="sphum","liq_wat","o3mr","ice_wat","rainwat","snowwat","graupel" -# fix_dir_target_grid="${BASEDIR}/JP_grid_HRRR_like_fix_files_chgres_cube" +# fix_dir_target_grid="${BASEDIR}/ESG_grid_HRRR_like_fix_files_chgres_cube" # base_install_dir="${SORCDIR}/chgres_cube.fd" # @@ -520,9 +520,9 @@ fi # settings=" 'config': { - 'fix_dir_target_grid': ${FIXsar}, - 'mosaic_file_target_grid': ${FIXsar}/${CRES}${DOT_OR_USCORE}mosaic.halo${NH4}.nc, - 'orog_dir_target_grid': ${FIXsar}, + 'fix_dir_target_grid': ${FIXLAM}, + 'mosaic_file_target_grid': ${FIXLAM}/${CRES}${DOT_OR_USCORE}mosaic.halo${NH4}.nc, + 'orog_dir_target_grid': ${FIXLAM}, 'orog_files_target_grid': ${CRES}${DOT_OR_USCORE}oro_data.tile${TILE_RGNL}.halo${NH4}.nc, 'vcoord_file_target_grid': ${FIXam}/global_hyblev.l65.txt, 'mosaic_file_input_grid': '', @@ -587,7 +587,7 @@ $settings" ${APRUN} ${exec_fp} || \ print_err_msg_exit "\ Call to executable (exec_fp) to generate surface and initial conditions -(ICs) files for the FV3SAR failed: +(ICs) files for the FV3-LAM failed: exec_fp = \"${exec_fp}\" The external model from which the ICs files are to be generated is: EXTRN_MDL_NAME_ICS = \"${EXTRN_MDL_NAME_ICS}\" diff --git a/scripts/exregional_make_lbcs.sh b/scripts/exregional_make_lbcs.sh index d9a837439..c598d2d0a 100755 --- a/scripts/exregional_make_lbcs.sh +++ b/scripts/exregional_make_lbcs.sh @@ -369,7 +369,7 @@ exec_fn="chgres_cube.exe" exec_fp="$EXECDIR/${exec_fn}" if [ ! -f "${exec_fp}" ]; then print_err_msg_exit "\ -The executable (exec_fp) for generating initial conditions on the FV3SAR +The executable (exec_fp) for generating initial conditions on the FV3-LAM native grid does not exist: exec_fp = \"${exec_fp}\" Please ensure that you've built this executable." @@ -378,7 +378,7 @@ fi #----------------------------------------------------------------------- # # Loop through the LBC update times and run chgres for each such time to -# obtain an LBC file for each that can be used as input to the FV3SAR. +# obtain an LBC file for each that can be used as input to the FV3-LAM. # #----------------------------------------------------------------------- # @@ -450,9 +450,9 @@ list file has not specified for this external model: # settings=" 'config': { - 'fix_dir_target_grid': ${FIXsar}, - 'mosaic_file_target_grid': ${FIXsar}/${CRES}${DOT_OR_USCORE}mosaic.halo${NH4}.nc, - 'orog_dir_target_grid': ${FIXsar}, + 'fix_dir_target_grid': ${FIXLAM}, + 'mosaic_file_target_grid': ${FIXLAM}/${CRES}${DOT_OR_USCORE}mosaic.halo${NH4}.nc, + 'orog_dir_target_grid': ${FIXLAM}, 'orog_files_target_grid': ${CRES}${DOT_OR_USCORE}oro_data.tile7.halo${NH4}.nc, 'vcoord_file_target_grid': ${FIXam}/global_hyblev.l65.txt, 'mosaic_file_input_grid': '', @@ -510,7 +510,7 @@ $settings" ${APRUN} ${exec_fp} || \ print_err_msg_exit "\ Call to executable (exec_fp) to generate lateral boundary conditions (LBCs) -file for the FV3SAR for forecast hour fhr failed: +file for the FV3-LAM for forecast hour fhr failed: exec_fp = \"${exec_fp}\" fhr = \"$fhr\" The external model from which the LBCs files are to be generated is: @@ -521,11 +521,11 @@ located in the following directory: # # Move LBCs file for the current lateral boundary update time to the LBCs # work directory. Note that we rename the file by including in its name -# the forecast hour of the FV3SAR (which is not necessarily the same as +# the forecast hour of the FV3-LAM (which is not necessarily the same as # that of the external model since their start times may be offset). # - fcst_hhh_FV3SAR=$( printf "%03d" "${LBC_SPEC_FCST_HRS[$i]}" ) - mv_vrfy gfs_bndy.nc ${lbcs_dir}/gfs_bndy.tile7.${fcst_hhh_FV3SAR}.nc + fcst_hhh_FV3LAM=$( printf "%03d" "${LBC_SPEC_FCST_HRS[$i]}" ) + mv_vrfy gfs_bndy.nc ${lbcs_dir}/gfs_bndy.tile7.${fcst_hhh_FV3LAM}.nc done # diff --git a/scripts/exregional_make_orog.sh b/scripts/exregional_make_orog.sh index 8f7c1d074..c3ea84518 100755 --- a/scripts/exregional_make_orog.sh +++ b/scripts/exregional_make_orog.sh @@ -219,10 +219,10 @@ cp_vrfy ${TOPO_DIR}/gmted2010.30sec.int fort.235 #----------------------------------------------------------------------- # mosaic_fn="${CRES}${DOT_OR_USCORE}mosaic.halo${NHW}.nc" -mosaic_fp="$FIXsar/${mosaic_fn}" +mosaic_fp="$FIXLAM/${mosaic_fn}" grid_fn=$( get_charvar_from_netcdf "${mosaic_fp}" "gridfiles" ) -grid_fp="${FIXsar}/${grid_fn}" +grid_fp="${FIXLAM}/${grid_fn}" # #----------------------------------------------------------------------- # @@ -300,7 +300,7 @@ case $MACHINE in ${ufs_utils_ushdir}/${orog_gen_scr} \ $res \ ${TILE_RGNL} \ -${FIXsar} \ +${FIXLAM} \ ${raw_dir} \ ${UFS_UTILS_DIR} \ ${TOPO_DIR} \ @@ -348,7 +348,7 @@ Orography file generation complete." #----------------------------------------------------------------------- # # Note that the orography filtering code assumes that the regional grid -# is a GFDLgrid type of grid; it is not designed to handle JPgrid type +# is a GFDLgrid type of grid; it is not designed to handle ESGgrid type # regional grids. If the flag "regional" in the orography filtering # namelist file is set to .TRUE. (which it always is will be here; see # below), then filtering code will first calculate a resolution (i.e. @@ -370,7 +370,7 @@ Orography file generation complete." # resolution of res_regional. These interpolated/extrapolated values are # then used to perform the orography filtering. # -# The above approach works for a GFDLgrid type of grid. To handle JPgrid +# The above approach works for a GFDLgrid type of grid. To handle ESGgrid # type grids, we set res in the namelist to the orography filtering code # the equivalent global uniform cubed-sphere resolution of the regional # grid, we set stretch_fac to 1 (since the equivalent resolution assumes @@ -398,7 +398,7 @@ if [ "${GRID_GEN_METHOD}" = "GFDLgrid" ]; then # stretch_fac="${GFDLgrid_STRETCH_FAC}" refine_ratio="${GFDLgrid_REFINE_RATIO}" -elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then +elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then res="${CRES:1}" # stretch_fac="${STRETCH_FAC}" diff --git a/scripts/exregional_make_sfc_climo.sh b/scripts/exregional_make_sfc_climo.sh index 938ede5e9..c581f040a 100755 --- a/scripts/exregional_make_sfc_climo.sh +++ b/scripts/exregional_make_sfc_climo.sh @@ -110,8 +110,8 @@ input_slope_type_file="${SFC_CLIMO_INPUT_DIR}/slope_type.1.0.nc" input_soil_type_file="${SFC_CLIMO_INPUT_DIR}/soil_type.statsgo.0.05.nc" input_vegetation_type_file="${SFC_CLIMO_INPUT_DIR}/vegetation_type.igbp.0.05.nc" input_vegetation_greenness_file="${SFC_CLIMO_INPUT_DIR}/vegetation_greenness.0.144.nc" -mosaic_file_mdl="${FIXsar}/${CRES}${DOT_OR_USCORE}mosaic.halo${NH4}.nc" -orog_dir_mdl="${FIXsar}" +mosaic_file_mdl="${FIXLAM}/${CRES}${DOT_OR_USCORE}mosaic.halo${NH4}.nc" +orog_dir_mdl="${FIXLAM}" orog_files_mdl=${CRES}${DOT_OR_USCORE}oro_data.tile${TILE_RGNL}.halo${NH4}.nc halo=${NH4} maximum_snow_albedo_method="bilinear" diff --git a/scripts/exregional_run_fcst.sh b/scripts/exregional_run_fcst.sh index 3d6531877..56b98624b 100755 --- a/scripts/exregional_run_fcst.sh +++ b/scripts/exregional_run_fcst.sh @@ -166,7 +166,7 @@ Creating links in the INPUT subdirectory of the current run directory to the grid and (filtered) orography files ..." -# Create links to fix files in the FIXsar directory. +# Create links to fix files in the FIXLAM directory. cd_vrfy ${run_dir}/INPUT @@ -177,8 +177,8 @@ if [ "${RUN_TASK_MAKE_GRID}" = "TRUE" ]; then fi # Symlink to mosaic file with a completely different name. -#target="${FIXsar}/${CRES}${DOT_OR_USCORE}mosaic.halo${NH4}.nc" # Should this point to this halo4 file or a halo3 file??? -target="${FIXsar}/${CRES}${DOT_OR_USCORE}mosaic.halo${NH3}.nc" # Should this point to this halo4 file or a halo3 file??? +#target="${FIXLAM}/${CRES}${DOT_OR_USCORE}mosaic.halo${NH4}.nc" # Should this point to this halo4 file or a halo3 file??? +target="${FIXLAM}/${CRES}${DOT_OR_USCORE}mosaic.halo${NH3}.nc" # Should this point to this halo4 file or a halo3 file??? symlink="grid_spec.nc" if [ -f "${target}" ]; then ln_vrfy -sf ${relative_or_null} $target $symlink @@ -189,7 +189,7 @@ Cannot create symlink because target does not exist: fi ## Symlink to halo-3 grid file with "halo3" stripped from name. -#target="${FIXsar}/${CRES}${DOT_OR_USCORE}grid.tile${TILE_RGNL}.halo${NH3}.nc" +#target="${FIXLAM}/${CRES}${DOT_OR_USCORE}grid.tile${TILE_RGNL}.halo${NH3}.nc" #if [ "${RUN_TASK_MAKE_SFC_CLIMO}" = "TRUE" ] && \ # [ "${GRID_GEN_METHOD}" = "GFDLgrid" ] && \ # [ "${GFDLgrid_USE_GFDLgrid_RES_IN_FILENAMES}" = "FALSE" ]; then @@ -202,7 +202,7 @@ fi mosaic_fn="grid_spec.nc" grid_fn=$( get_charvar_from_netcdf "${mosaic_fn}" "gridfiles" ) -target="${FIXsar}/${grid_fn}" +target="${FIXLAM}/${grid_fn}" symlink="${grid_fn}" if [ -f "${target}" ]; then ln_vrfy -sf ${relative_or_null} $target $symlink @@ -224,7 +224,7 @@ fi # Note that even though the message says "Stopped", the task still con- # sumes core-hours. # -target="${FIXsar}/${CRES}${DOT_OR_USCORE}grid.tile${TILE_RGNL}.halo${NH4}.nc" +target="${FIXLAM}/${CRES}${DOT_OR_USCORE}grid.tile${TILE_RGNL}.halo${NH4}.nc" symlink="grid.tile${TILE_RGNL}.halo${NH4}.nc" if [ -f "${target}" ]; then ln_vrfy -sf ${relative_or_null} $target $symlink @@ -242,7 +242,7 @@ if [ "${RUN_TASK_MAKE_OROG}" = "TRUE" ]; then fi # Symlink to halo-0 orography file with "${CRES}_" and "halo0" stripped from name. -target="${FIXsar}/${CRES}${DOT_OR_USCORE}oro_data.tile${TILE_RGNL}.halo${NH0}.nc" +target="${FIXLAM}/${CRES}${DOT_OR_USCORE}oro_data.tile${TILE_RGNL}.halo${NH0}.nc" symlink="oro_data.nc" if [ -f "${target}" ]; then ln_vrfy -sf ${relative_or_null} $target $symlink @@ -265,7 +265,7 @@ fi # Note that even though the message says "Stopped", the task still con- # sumes core-hours. # -target="${FIXsar}/${CRES}${DOT_OR_USCORE}oro_data.tile${TILE_RGNL}.halo${NH4}.nc" +target="${FIXLAM}/${CRES}${DOT_OR_USCORE}oro_data.tile${TILE_RGNL}.halo${NH4}.nc" symlink="oro_data.tile${TILE_RGNL}.halo${NH4}.nc" if [ -f "${target}" ]; then ln_vrfy -sf ${relative_or_null} $target $symlink @@ -465,7 +465,7 @@ export OMP_STACKSIZE=1024m # #----------------------------------------------------------------------- # -# Run the FV3SAR model. Note that we have to launch the forecast from +# Run the FV3-LAM model. Note that we have to launch the forecast from # the current cycle's directory because the FV3 executable will look for # input files in the current directory. Since those files have been # staged in the cycle directory, the current directory must be the cycle @@ -474,7 +474,7 @@ export OMP_STACKSIZE=1024m #----------------------------------------------------------------------- # $APRUN ${FV3_EXEC_FP} || print_err_msg_exit "\ -Call to executable to run FV3SAR forecast returned with nonzero exit +Call to executable to run FV3-LAM forecast returned with nonzero exit code." # #----------------------------------------------------------------------- diff --git a/scripts/exregional_run_post.sh b/scripts/exregional_run_post.sh index 36992736c..2768e56bd 100755 --- a/scripts/exregional_run_post.sh +++ b/scripts/exregional_run_post.sh @@ -143,9 +143,9 @@ esac #----------------------------------------------------------------------- # rm_vrfy -f fort.* -cp_vrfy $FIXupp/nam_micro_lookup.dat ./eta_micro_lookup.dat -cp_vrfy $FIXupp/postxconfig-NT-fv3sar.txt ./postxconfig-NT.txt -cp_vrfy $FIXupp/params_grib2_tbl_new ./params_grib2_tbl_new +cp_vrfy ${EMC_POST_DIR}/parm/nam_micro_lookup.dat ./eta_micro_lookup.dat +cp_vrfy ${EMC_POST_DIR}/parm/postxconfig-NT-fv3sar.txt ./postxconfig-NT.txt +cp_vrfy ${EMC_POST_DIR}/parm/params_grib2_tbl_new ./params_grib2_tbl_new cp_vrfy ${EXECDIR}/ncep_post . # #----------------------------------------------------------------------- @@ -206,29 +206,6 @@ zero exit code." # #----------------------------------------------------------------------- # -if [ -n "${PREDEF_GRID_NAME}" ]; then - - grid_name="${PREDEF_GRID_NAME}" - -else - - grid_name="${GRID_GEN_METHOD}" - - if [ "${GRID_GEN_METHOD}" = "GFDLgrid" ]; then - stretch_str="S$( printf "%s" "${STRETCH_FAC}" | sed "s|\.|p|" )" - refine_str="RR${GFDLgrid_REFINE_RATIO}" - grid_name="${grid_name}_${CRES}_${stretch_str}_${refine_str}" - elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then - nx_str="NX$( printf "%s" "$NX" | sed "s|\.|p|" )" - ny_str="NY$( printf "%s" "$NY" | sed "s|\.|p|" )" - JPgrid_alpha_param_str="A"$( printf "%s" "${JPgrid_ALPHA_PARAM}" | \ - sed "s|-|mns|" | sed "s|\.|p|" ) - JPgrid_kappa_param_str="K"$( printf "%s" "${JPgrid_KAPPA_PARAM}" | \ - sed "s|-|mns|" | sed "s|\.|p|" ) - grid_name="${grid_name}_${nx_str}_${ny_str}_${JPgrid_alpha_param_str}_${JPgrid_kappa_param_str}" - fi - -fi mv_vrfy BGDAWP.GrbF${fhr} ${postprd_dir}/RRFS.t${cyc}z.bgdawp${fhr}.${tmmark} mv_vrfy BGRD3D.GrbF${fhr} ${postprd_dir}/RRFS.t${cyc}z.bgrd3d${fhr}.${tmmark} diff --git a/tests/baseline_configs/config.GSD_RAP13km.sh b/tests/baseline_configs/config.GSD_RAP13km.sh index ae1616671..18185f0c2 100644 --- a/tests/baseline_configs/config.GSD_RAP13km.sh +++ b/tests/baseline_configs/config.GSD_RAP13km.sh @@ -1,27 +1,27 @@ # -# MACHINE will be set by the workflow launch script (launch_FV3SAR_- +# MACHINE will be set by the workflow launch script (launch_FV3LAM_- # wflow.sh) to value passed in as an argument to that script. # MACHINE="" # -# ACCOUNT will be set by the workflow launch script (launch_FV3SAR_- +# ACCOUNT will be set by the workflow launch script (launch_FV3LAM_- # wflow.sh) to value passed in as an argument to that script. # ACCOUNT="" # -# EXPT_SUBDIR will be set by the workflow launch script (launch_FV3SAR_- +# EXPT_SUBDIR will be set by the workflow launch script (launch_FV3LAM_- # wflow.sh) to a value obtained from the name of this file. # EXPT_SUBDIR="" # # USE_CRON_TO_RELAUNCH may be reset by the workflow launch script -# (launch_FV3SAR_wflow.sh) to value passed in as an argument to that +# (launch_FV3LAM_wflow.sh) to value passed in as an argument to that # script, but in case it is not, we give it a default value here. # USE_CRON_TO_RELAUNCH="TRUE" # # CRON_RELAUNCH_INTVL_MNTS may be reset by the workflow launch script -# (launch_FV3SAR_wflow.sh) to value passed in as an argument to that +# (launch_FV3LAM_wflow.sh) to value passed in as an argument to that # script, but in case it is not, we give it a default value here. # CRON_RELAUNCH_INTVL_MNTS="02" @@ -37,7 +37,7 @@ RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" PREDEF_GRID_NAME="GSD_RAP13km" -GRID_GEN_METHOD="JPgrid" +GRID_GEN_METHOD="ESGgrid" QUILTING="TRUE" USE_CCPP="TRUE" CCPP_PHYS_SUITE="FV3_GSD_v0" diff --git a/tests/baseline_configs/config.community_ensemble_008mems.sh b/tests/baseline_configs/config.community_ensemble_008mems.sh index 309495631..71063ebda 100644 --- a/tests/baseline_configs/config.community_ensemble_008mems.sh +++ b/tests/baseline_configs/config.community_ensemble_008mems.sh @@ -27,7 +27,7 @@ RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" PREDEF_GRID_NAME="GSD_HRRR25km" -GRID_GEN_METHOD="JPgrid" +GRID_GEN_METHOD="ESGgrid" QUILTING="TRUE" USE_CCPP="TRUE" CCPP_PHYS_SUITE="FV3_GFS_2017_gfdlmp" diff --git a/tests/baseline_configs/config.community_ensemble_2mems.sh b/tests/baseline_configs/config.community_ensemble_2mems.sh index 80965edb0..09e1453ac 100644 --- a/tests/baseline_configs/config.community_ensemble_2mems.sh +++ b/tests/baseline_configs/config.community_ensemble_2mems.sh @@ -27,7 +27,7 @@ RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" PREDEF_GRID_NAME="GSD_HRRR25km" -GRID_GEN_METHOD="JPgrid" +GRID_GEN_METHOD="ESGgrid" QUILTING="TRUE" USE_CCPP="TRUE" CCPP_PHYS_SUITE="FV3_GFS_2017_gfdlmp" diff --git a/tests/baseline_configs/config.nco_conus.sh b/tests/baseline_configs/config.nco_conus.sh index 9da21f187..4237a14f0 100644 --- a/tests/baseline_configs/config.nco_conus.sh +++ b/tests/baseline_configs/config.nco_conus.sh @@ -111,15 +111,15 @@ PTMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/ptmp" # # In NCO mode, the user must manually (e.g. after doing the build step) -# create the symlink "${FIXrrfs}/fix_sar" that points to EMC's FIXsar +# create the symlink "${FIXrrfs}/fix_lam" that points to EMC's FIXLAM # directory on the machine. For example, on hera, the symlink's target # needs to be # # /scratch2/NCEPDEV/fv3-cam/emc.campara/fix_fv3cam/fix_sar # -# The experiment generation script will then set FIXsar to +# The experiment generation script will then set FIXLAM to # -# FIXsar="${FIXrrfs}/fix_sar/${EMC_GRID_NAME}" +# FIXLAM="${FIXrrfs}/fix_lam/${EMC_GRID_NAME}" # # where EMC_GRID_NAME has the value set above. # diff --git a/tests/baseline_configs/config.nco_conus_c96.sh b/tests/baseline_configs/config.nco_conus_c96.sh index ba07895a8..1840c3b16 100644 --- a/tests/baseline_configs/config.nco_conus_c96.sh +++ b/tests/baseline_configs/config.nco_conus_c96.sh @@ -111,15 +111,15 @@ PTMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/ptmp" # # In NCO mode, the user must manually (e.g. after doing the build step) -# create the symlink "${FIXrrfs}/fix_sar" that points to EMC's FIXsar +# create the symlink "${FIXrrfs}/fix_lam" that points to EMC's FIXLAM # directory on the machine. For example, on hera, the symlink's target # needs to be # # /scratch2/NCEPDEV/fv3-cam/emc.campara/fix_fv3cam/fix_sar # -# The experiment generation script will then set FIXsar to +# The experiment generation script will then set FIXLAM to # -# FIXsar="${FIXrrfs}/fix_sar/${EMC_GRID_NAME}" +# FIXLAM="${FIXrrfs}/fix_lam/${EMC_GRID_NAME}" # # where EMC_GRID_NAME has the value set above. # diff --git a/tests/baseline_configs/config.nco_ensemble.sh b/tests/baseline_configs/config.nco_ensemble.sh index 9dc147222..a6f65c7db 100644 --- a/tests/baseline_configs/config.nco_ensemble.sh +++ b/tests/baseline_configs/config.nco_ensemble.sh @@ -114,15 +114,15 @@ NUM_ENS_MEMBERS="2" # # In NCO mode, the user must manually (e.g. after doing the build step) -# create the symlink "${FIXrrfs}/fix_sar" that points to EMC's FIXsar +# create the symlink "${FIXrrfs}/fix_lam" that points to EMC's FIXLAM # directory on the machine. For example, on hera, the symlink's target # needs to be # # /scratch2/NCEPDEV/fv3-cam/emc.campara/fix_fv3cam/fix_sar # -# The experiment generation script will then set FIXsar to +# The experiment generation script will then set FIXLAM to # -# FIXsar="${FIXrrfs}/fix_sar/${EMC_GRID_NAME}" +# FIXLAM="${FIXrrfs}/fix_lam/${EMC_GRID_NAME}" # # where EMC_GRID_NAME has the value set above. # diff --git a/tests/baseline_configs/config.new_JPgrid.sh b/tests/baseline_configs/config.new_ESGgrid.sh similarity index 68% rename from tests/baseline_configs/config.new_JPgrid.sh rename to tests/baseline_configs/config.new_ESGgrid.sh index c1fc566cd..1aa5db8a2 100644 --- a/tests/baseline_configs/config.new_JPgrid.sh +++ b/tests/baseline_configs/config.new_ESGgrid.sh @@ -1,27 +1,27 @@ # -# MACHINE will be set by the workflow launch script (launch_FV3SAR_- +# MACHINE will be set by the workflow launch script (launch_FV3LAM_- # wflow.sh) to value passed in as an argument to that script. # MACHINE="" # -# ACCOUNT will be set by the workflow launch script (launch_FV3SAR_- +# ACCOUNT will be set by the workflow launch script (launch_FV3LAM_- # wflow.sh) to value passed in as an argument to that script. # ACCOUNT="" # -# EXPT_SUBDIR will be set by the workflow launch script (launch_FV3SAR_- +# EXPT_SUBDIR will be set by the workflow launch script (launch_FV3LAM_- # wflow.sh) to a value obtained from the name of this file. # EXPT_SUBDIR="" # # USE_CRON_TO_RELAUNCH may be reset by the workflow launch script -# (launch_FV3SAR_wflow.sh) to value passed in as an argument to that +# (launch_FV3LAM_wflow.sh) to value passed in as an argument to that # script, but in case it is not, we give it a default value here. # USE_CRON_TO_RELAUNCH="TRUE" # # CRON_RELAUNCH_INTVL_MNTS may be reset by the workflow launch script -# (launch_FV3SAR_wflow.sh) to value passed in as an argument to that +# (launch_FV3LAM_wflow.sh) to value passed in as an argument to that # script, but in case it is not, we give it a default value here. # CRON_RELAUNCH_INTVL_MNTS="02" @@ -36,18 +36,18 @@ VERBOSE="TRUE" RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" -GRID_GEN_METHOD="JPgrid" +GRID_GEN_METHOD="ESGgrid" -JPgrid_LON_CTR=-97.5 -JPgrid_LAT_CTR=41.25 +ESGgrid_LON_CTR=-97.5 +ESGgrid_LAT_CTR=41.25 -JPgrid_DELX="25000.0" -JPgrid_DELY="25000.0" +ESGgrid_DELX="25000.0" +ESGgrid_DELY="25000.0" -JPgrid_NX=216 -JPgrid_NY=156 +ESGgrid_NX=216 +ESGgrid_NY=156 -JPgrid_WIDE_HALO_WIDTH=6 +ESGgrid_WIDE_HALO_WIDTH=6 DT_ATMOS="40" @@ -59,16 +59,16 @@ if [ "$QUILTING" = "TRUE" ]; then WRTCMP_write_groups="1" WRTCMP_write_tasks_per_group=$(( 1*LAYOUT_Y )) WRTCMP_output_grid="lambert_conformal" - WRTCMP_cen_lon="${JPgrid_LON_CTR}" - WRTCMP_cen_lat="${JPgrid_LAT_CTR}" - WRTCMP_stdlat1="${JPgrid_LAT_CTR}" - WRTCMP_stdlat2="${JPgrid_LAT_CTR}" + WRTCMP_cen_lon="${ESGgrid_LON_CTR}" + WRTCMP_cen_lat="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat1="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat2="${ESGgrid_LAT_CTR}" WRTCMP_nx="200" WRTCMP_ny="150" WRTCMP_lon_lwr_left="-122.21414225" WRTCMP_lat_lwr_left="22.41403305" - WRTCMP_dx="${JPgrid_DELX}" - WRTCMP_dy="${JPgrid_DELY}" + WRTCMP_dx="${ESGgrid_DELX}" + WRTCMP_dy="${ESGgrid_DELY}" fi USE_CCPP="TRUE" diff --git a/tests/baseline_configs/config.regional_001.sh b/tests/baseline_configs/config.regional_001.sh index 1b0ee3916..6a8f6655a 100644 --- a/tests/baseline_configs/config.regional_001.sh +++ b/tests/baseline_configs/config.regional_001.sh @@ -27,7 +27,7 @@ RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" PREDEF_GRID_NAME="GSD_HRRR25km" -GRID_GEN_METHOD="JPgrid" +GRID_GEN_METHOD="ESGgrid" QUILTING="TRUE" USE_CCPP="TRUE" CCPP_PHYS_SUITE="FV3_GFS_2017_gfdlmp" diff --git a/tests/baseline_configs/config.regional_002.sh b/tests/baseline_configs/config.regional_002.sh index 2521ccade..80f7f895a 100644 --- a/tests/baseline_configs/config.regional_002.sh +++ b/tests/baseline_configs/config.regional_002.sh @@ -27,7 +27,7 @@ RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" PREDEF_GRID_NAME="GSD_HRRR25km" -GRID_GEN_METHOD="JPgrid" +GRID_GEN_METHOD="ESGgrid" QUILTING="TRUE" USE_CCPP="TRUE" CCPP_PHYS_SUITE="FV3_GFS_2017_gfdlmp" diff --git a/tests/baseline_configs/config.regional_003.sh b/tests/baseline_configs/config.regional_003.sh index c2cb036d2..d0fb807d0 100644 --- a/tests/baseline_configs/config.regional_003.sh +++ b/tests/baseline_configs/config.regional_003.sh @@ -27,7 +27,7 @@ RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" PREDEF_GRID_NAME="GSD_HRRR25km" -GRID_GEN_METHOD="JPgrid" +GRID_GEN_METHOD="ESGgrid" QUILTING="TRUE" USE_CCPP="TRUE" CCPP_PHYS_SUITE="FV3_GSD_v0" diff --git a/tests/baseline_configs/config.regional_004.sh b/tests/baseline_configs/config.regional_004.sh index e83a70dca..7f19f0d17 100644 --- a/tests/baseline_configs/config.regional_004.sh +++ b/tests/baseline_configs/config.regional_004.sh @@ -27,7 +27,7 @@ RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" PREDEF_GRID_NAME="GSD_HRRR25km" -GRID_GEN_METHOD="JPgrid" +GRID_GEN_METHOD="ESGgrid" QUILTING="TRUE" USE_CCPP="TRUE" CCPP_PHYS_SUITE="FV3_GSD_SAR" diff --git a/tests/baseline_configs/config.regional_005.sh b/tests/baseline_configs/config.regional_005.sh index 9662e3471..bfd925885 100644 --- a/tests/baseline_configs/config.regional_005.sh +++ b/tests/baseline_configs/config.regional_005.sh @@ -27,7 +27,7 @@ RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" PREDEF_GRID_NAME="GSD_HRRR_AK_50km" -GRID_GEN_METHOD="JPgrid" +GRID_GEN_METHOD="ESGgrid" QUILTING="TRUE" USE_CCPP="TRUE" CCPP_PHYS_SUITE="FV3_GSD_SAR" diff --git a/tests/baseline_configs/config.regional_006.sh b/tests/baseline_configs/config.regional_006.sh index 9ad8eb981..f5a0aa25b 100644 --- a/tests/baseline_configs/config.regional_006.sh +++ b/tests/baseline_configs/config.regional_006.sh @@ -27,7 +27,7 @@ RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" PREDEF_GRID_NAME="GSD_HRRR25km" -GRID_GEN_METHOD="JPgrid" +GRID_GEN_METHOD="ESGgrid" QUILTING="TRUE" USE_CCPP="TRUE" CCPP_PHYS_SUITE="FV3_GFS_2017_gfdlmp" @@ -42,13 +42,13 @@ EXTRN_MDL_NAME_ICS="FV3GFS" EXTRN_MDL_NAME_LBCS="FV3GFS" RUN_TASK_MAKE_GRID="FALSE" -GRID_DIR="/scratch2/BMC/det/FV3SAR_pregen/grid/GSD_HRRR25km" +GRID_DIR="/scratch2/BMC/det/FV3LAM_pregen/grid/GSD_HRRR25km" RUN_TASK_MAKE_OROG="FALSE" -OROG_DIR="/scratch2/BMC/det/FV3SAR_pregen/orog/GSD_HRRR25km" +OROG_DIR="/scratch2/BMC/det/FV3LAM_pregen/orog/GSD_HRRR25km" RUN_TASK_MAKE_SFC_CLIMO="FALSE" -SFC_CLIMO_DIR="/scratch2/BMC/det/FV3SAR_pregen/sfc_climo/GSD_HRRR25km" +SFC_CLIMO_DIR="/scratch2/BMC/det/FV3LAM_pregen/sfc_climo/GSD_HRRR25km" #On Jet #GRID_DIR="" diff --git a/tests/baseline_configs/config.regional_009.sh b/tests/baseline_configs/config.regional_009.sh index 935039f60..2fc79bfa2 100644 --- a/tests/baseline_configs/config.regional_009.sh +++ b/tests/baseline_configs/config.regional_009.sh @@ -110,15 +110,15 @@ PTMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/ptmp" # # In NCO mode, the user must manually (e.g. after doing the build step) -# create the symlink "${FIXrrfs}/fix_sar" that points to EMC's FIXsar +# create the symlink "${FIXrrfs}/fix_lam" that points to EMC's FIXLAM # directory on the machine. For example, on hera, the symlink's target # needs to be # # /scratch2/NCEPDEV/fv3-cam/emc.campara/fix_fv3cam/fix_sar # -# The experiment generation script will then set FIXsar to +# The experiment generation script will then set FIXLAM to # -# FIXsar="${FIXrrfs}/fix_sar/${EMC_GRID_NAME}" +# FIXLAM="${FIXrrfs}/fix_lam/${EMC_GRID_NAME}" # # where EMC_GRID_NAME has the value set above. # diff --git a/tests/baseline_configs/config.regional_010.sh b/tests/baseline_configs/config.regional_010.sh index 4a4c7bade..d8898cb04 100644 --- a/tests/baseline_configs/config.regional_010.sh +++ b/tests/baseline_configs/config.regional_010.sh @@ -27,7 +27,7 @@ RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" PREDEF_GRID_NAME="GSD_HRRR25km" -GRID_GEN_METHOD="JPgrid" +GRID_GEN_METHOD="ESGgrid" QUILTING="TRUE" USE_CCPP="TRUE" CCPP_PHYS_SUITE="FV3_CPT_v0" diff --git a/tests/baseline_configs/config.regional_011.sh b/tests/baseline_configs/config.regional_011.sh index 4a8c38462..9f0393f26 100644 --- a/tests/baseline_configs/config.regional_011.sh +++ b/tests/baseline_configs/config.regional_011.sh @@ -27,7 +27,7 @@ RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" PREDEF_GRID_NAME="GSD_HRRR25km" -GRID_GEN_METHOD="JPgrid" +GRID_GEN_METHOD="ESGgrid" QUILTING="TRUE" USE_CCPP="TRUE" CCPP_PHYS_SUITE="FV3_GFS_v15p2" diff --git a/tests/baseline_configs/config.regional_012.sh b/tests/baseline_configs/config.regional_012.sh index ac1b0a68d..f2286353e 100644 --- a/tests/baseline_configs/config.regional_012.sh +++ b/tests/baseline_configs/config.regional_012.sh @@ -27,7 +27,7 @@ RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" PREDEF_GRID_NAME="GSD_HRRR25km" -GRID_GEN_METHOD="JPgrid" +GRID_GEN_METHOD="ESGgrid" QUILTING="TRUE" USE_CCPP="TRUE" CCPP_PHYS_SUITE="FV3_GFS_v16beta" diff --git a/tests/baseline_configs/config.regional_013.sh b/tests/baseline_configs/config.regional_013.sh index 87016c739..30cdca248 100644 --- a/tests/baseline_configs/config.regional_013.sh +++ b/tests/baseline_configs/config.regional_013.sh @@ -27,7 +27,7 @@ RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" PREDEF_GRID_NAME="GSD_HRRR25km" -GRID_GEN_METHOD="JPgrid" +GRID_GEN_METHOD="ESGgrid" QUILTING="TRUE" USE_CCPP="TRUE" CCPP_PHYS_SUITE="FV3_GSD_SAR_v1" diff --git a/tests/baseline_configs/config.regional_014.sh b/tests/baseline_configs/config.regional_014.sh index c9829016a..c65e62bd4 100644 --- a/tests/baseline_configs/config.regional_014.sh +++ b/tests/baseline_configs/config.regional_014.sh @@ -28,7 +28,7 @@ RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" PREDEF_GRID_NAME="GSD_HRRR25km" -GRID_GEN_METHOD="JPgrid" +GRID_GEN_METHOD="ESGgrid" QUILTING="TRUE" USE_CCPP="TRUE" CCPP_PHYS_SUITE="FV3_GFS_2017_gfdlmp" diff --git a/tests/baseline_configs/config.regional_016.sh b/tests/baseline_configs/config.regional_016.sh index e03a741fb..df69233a8 100644 --- a/tests/baseline_configs/config.regional_016.sh +++ b/tests/baseline_configs/config.regional_016.sh @@ -27,7 +27,7 @@ RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" PREDEF_GRID_NAME="GSD_HRRR25km" -GRID_GEN_METHOD="JPgrid" +GRID_GEN_METHOD="ESGgrid" QUILTING="TRUE" USE_CCPP="TRUE" CCPP_PHYS_SUITE="FV3_RRFS_v0" diff --git a/tests/baseline_configs/config.user_staged_extrn_files.sh b/tests/baseline_configs/config.user_staged_extrn_files.sh index cd6669f00..7eb170f37 100644 --- a/tests/baseline_configs/config.user_staged_extrn_files.sh +++ b/tests/baseline_configs/config.user_staged_extrn_files.sh @@ -27,7 +27,7 @@ RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" PREDEF_GRID_NAME="GSD_HRRR25km" -GRID_GEN_METHOD="JPgrid" +GRID_GEN_METHOD="ESGgrid" QUILTING="TRUE" USE_CCPP="TRUE" CCPP_PHYS_SUITE="FV3_GFS_2017_gfdlmp" diff --git a/tests/baselines_list.txt b/tests/baselines_list.txt index b8b7f9fef..8d40475ee 100644 --- a/tests/baselines_list.txt +++ b/tests/baselines_list.txt @@ -4,7 +4,7 @@ community_ensemble_2mems nco_conus nco_conus_c96 nco_ensemble -new_JPgrid +new_ESGgrid regional_001 regional_002 regional_003 diff --git a/tests/run_experiments.sh b/tests/run_experiments.sh index 2e3cdfdb8..c3d22e237 100755 --- a/tests/run_experiments.sh +++ b/tests/run_experiments.sh @@ -449,7 +449,7 @@ fi # #----------------------------------------------------------------------- # - $ushdir/generate_FV3SAR_wflow.sh || \ + $ushdir/generate_FV3LAM_wflow.sh || \ print_err_msg_exit "\ Could not generate an experiment/workflow for the test specified by expt_name: diff --git a/ush/NCL/NCL_ICs_BCs/generate_ICs_BCs.sh b/ush/NCL/NCL_ICs_BCs/generate_ICs_BCs.sh index c7c07fa41..fd6a08fd7 100755 --- a/ush/NCL/NCL_ICs_BCs/generate_ICs_BCs.sh +++ b/ush/NCL/NCL_ICs_BCs/generate_ICs_BCs.sh @@ -20,8 +20,8 @@ BC_interval_hrs="3" plot_RAP_fields="True" #plot_RAP_fields="False" -plot_SARFV3_fields="True" -#plot_SARFV3_fields="False" +plot_FV3LAM_fields="True" +#plot_FV3LAM_fields="False" #grid_dir="/scratch3/BMC/det/beck/FV3-CAM/work.C384r0p7n3_regional_RAP/INPUT" #grid_dir="/scratch3/BMC/fim/Gerard.Ketefian/regional_FV3_EMC_visit_20180509/work_FV3_regional_C96_2018032900/INPUT" @@ -48,37 +48,37 @@ ncl -n generate_RAP_based_ICs_BCs.ncl \ fcst_len_hrs=${fcst_len_hrs} \ BC_interval_hrs=${BC_interval_hrs} \ plot_RAP_fields=${plot_RAP_fields} \ - plot_SARFV3_fields=${plot_SARFV3_fields} \ + plot_FV3LAM_fields=${plot_FV3LAM_fields} \ 'regions=[/ [/ "GLOBE", (/-180, 180, -90, 90/), False, False /], \ - [/ "SARFV3", (/-140, -60, 20, 55/), False, False /], \ - [/ "SARFV3NW", (/-145, -135, 50, 60/), True, True /], \ - [/ "SARFV3SE", (/ -75, -70, 20, 25/), True, False /], \ + [/ "FV3LAM", (/-140, -60, 20, 55/), False, False /], \ + [/ "FV3LAMNW", (/-145, -135, 50, 60/), True, True /], \ + [/ "FV3LAMSE", (/ -75, -70, 20, 25/), True, False /], \ [/ "dummy_list_element_dont_remove" /] \ /]' \ map_proj=\"cyln\" # 'regions=[/ [/ "GLOBE", (/-180, 180, -90, 90/), False, False /], \ -# [/ "SARFV3", (/-140, -60, 20, 55/), False, False /], \ -# [/ "SARFV3NW", (/-135, -130, 45, 50/), True, True /], \ -# [/ "SARFV3SE", (/ -75, -70, 20, 25/), True, False /], \ +# [/ "FV3LAM", (/-140, -60, 20, 55/), False, False /], \ +# [/ "FV3LAMNW", (/-135, -130, 45, 50/), True, True /], \ +# [/ "FV3LAMSE", (/ -75, -70, 20, 25/), True, False /], \ # [/ "dummy_list_element_dont_remove" /] \ # /]' \ -# 'regions=[/ [/ "SARFV3NW", (/-135, -130, 45, 50/), True, True /], \ +# 'regions=[/ [/ "FV3LAMNW", (/-135, -130, 45, 50/), True, True /], \ # [/ "dummy_list_element_dont_remove" /] \ # /]' \ -# 'regions=[/ [/ "SARFV3", (/-140, -60, 20, 55/), False, False /], \ +# 'regions=[/ [/ "FV3LAM", (/-140, -60, 20, 55/), False, False /], \ # [/ "dummy_list_element_dont_remove" /] \ # /]' \ # draw_RAP_grid=False \ -# draw_SARFV3_grid=True \ +# draw_FV3LAM_grid=True \ # plot_subregs=True \ # subreg_names=\(/\"haloAll\",\"haloNW\",\"haloSE\"/\) \ # subreg_coords=\(/\(/-140,-60,20,55/\),\(/-135,-130,45,50/\),\(/-75,-70,20,25/\)/\) \ # subreg_draw_RAP_grid=\(/False,True,False/\) \ -# subreg_draw_SARFV3_grid=\(/False,True,True/\) \ +# subreg_draw_FV3LAM_grid=\(/False,True,True/\) \ # bbb=\[/\[/\"globe\",\(/-140,-60,20,55/\),True,True/\],\[/\"RAP\",\(/-140,-60,20,55/\),True,True/\],\[/\"RAPNW\",\(/-140,-60,20,55/\),False,False/\],\[/\"dummy\"/\]/\] \ # bbb=\[/\[/\"globe\",\(/-140,-60,20,55/\),True,True/\],\ diff --git a/ush/NCL/NCL_ICs_BCs/generate_RAP_based_ICs_BCs.ncl b/ush/NCL/NCL_ICs_BCs/generate_RAP_based_ICs_BCs.ncl index 6e8055f1f..4e5716685 100644 --- a/ush/NCL/NCL_ICs_BCs/generate_RAP_based_ICs_BCs.ncl +++ b/ush/NCL/NCL_ICs_BCs/generate_RAP_based_ICs_BCs.ncl @@ -14,9 +14,9 @@ load "$NCARG_ROOT/lib/ncarg/nclscripts/contrib/cd_string.ncl" load "pause.ncl" load "strcmp.ncl" -load "interpolate_RAP_to_SARFV3.ncl" +load "interpolate_RAP_to_FV3LAM.ncl" load "read_RAP_grid.ncl" -load "read_FV3SAR_grid_halo.ncl" +load "read_FV3LAM_grid_halo.ncl" load "calc_field_stats.ncl" load "read_RAP_horiz_field.ncl" load "adjust_longitude_range.ncl" @@ -99,7 +99,7 @@ end if ; ********************************************************************** ; * ; Check whether draw_RAP_grid has been specified on the command line. -; If not, set it to False. Do same for draw_SARFV3_grid. +; If not, set it to False. Do same for draw_FV3LAM_grid. ; * ; ********************************************************************** ; @@ -107,8 +107,8 @@ end if draw_RAP_grid = False end if - if (.not. isvar("draw_SARFV3_grid")) then - draw_SARFV3_grid = False + if (.not. isvar("draw_FV3LAM_grid")) then + draw_FV3LAM_grid = False end if ; ; ********************************************************************** @@ -303,10 +303,10 @@ end if region_names = new((/ num_regions /), "string") region_bounds = new((/ num_regions, 4 /), "float") ; region_draw_RAP_grid = new((/ num_regions /), "logical") -; region_draw_SARFV3_grid = new((/ num_regions /), "logical") +; region_draw_FV3LAM_grid = new((/ num_regions /), "logical") draw_grid_by_region = True draw_grid_by_region@RAP = new((/ num_regions /), "logical") - draw_grid_by_region@SARFV3 = new((/ num_regions /), "logical") + draw_grid_by_region@FV3LAM = new((/ num_regions /), "logical") do i=0, num_regions-1 ;print("") @@ -316,9 +316,9 @@ end if region_names(i) = curnt_region[0] region_bounds(i,:) = curnt_region[1] ; region_draw_RAP_grid(i) = curnt_region[2] -; region_draw_SARFV3_grid(i) = curnt_region[3] +; region_draw_FV3LAM_grid(i) = curnt_region[3] draw_grid_by_region@RAP(i) = curnt_region[2] - draw_grid_by_region@SARFV3(i) = curnt_region[3] + draw_grid_by_region@FV3LAM(i) = curnt_region[3] ;pause end do @@ -330,8 +330,8 @@ end if ;;print(region_draw_RAP_grid) ;print(draw_grid_by_region@RAP) ;print("") -;;print(region_draw_SARFV3_grid) -;print(draw_grid_by_region@SARFV3) +;;print(region_draw_FV3LAM_grid) +;print(draw_grid_by_region@FV3LAM) ;pause @@ -397,7 +397,7 @@ print("") print("==============================================================") print("==============================================================") print("") -print("Reading in SARFV3 grid...") +print("Reading in FV3LAM grid...") print("") print("==============================================================") print("==============================================================") @@ -414,24 +414,24 @@ print("") ; nh = 4 nh = 50 -; SARFV3_grid_dir = "/scratch3/BMC/fim/Gerard.Ketefian/regional_FV3_EMC_visit_20180509/fv3gfs/fix/fix_fv3/rgnl_C384_strch_1p8_rfn_5_HRRR" - SARFV3_grid_dir = "/scratch3/BMC/fim/Gerard.Ketefian/regional_FV3_EMC_visit_20180509/work_dirs/rgnl_C384_strch_1p5_rfn_3_descriptive_str/filter_topo" +; FV3LAM_grid_dir = "/scratch3/BMC/fim/Gerard.Ketefian/regional_FV3_EMC_visit_20180509/fv3gfs/fix/fix_fv3/rgnl_C384_strch_1p8_rfn_5_HRRR" + FV3LAM_grid_dir = "/scratch3/BMC/fim/Gerard.Ketefian/regional_FV3_EMC_visit_20180509/work_dirs/rgnl_C384_strch_1p5_rfn_3_descriptive_str/filter_topo" CRES = "C384" - SARFV3_halo4_grid_file = CRES + "_grid.tile7.halo4.nc" - SARFV3_halo4_grid_file_full = SARFV3_grid_dir + "/" + SARFV3_halo4_grid_file + FV3LAM_halo4_grid_file = CRES + "_grid.tile7.halo4.nc" + FV3LAM_halo4_grid_file_full = FV3LAM_grid_dir + "/" + FV3LAM_halo4_grid_file - out := read_FV3SAR_grid_halo(SARFV3_halo4_grid_file_full, nh) + out := read_FV3LAM_grid_halo(FV3LAM_halo4_grid_file_full, nh) -;; num_cells_SARFV3 = out@num_cells_total -; lon_cntrs_by_cell_SARFV3 = out@lon_cntrs_by_cell -; lat_cntrs_by_cell_SARFV3 = out@lat_cntrs_by_cell -; lon_verts_by_cell_SARFV3 = out@lon_verts_by_cell -; lat_verts_by_cell_SARFV3 = out@lat_verts_by_cell +;; num_cells_FV3LAM = out@num_cells_total +; lon_cntrs_by_cell_FV3LAM = out@lon_cntrs_by_cell +; lat_cntrs_by_cell_FV3LAM = out@lat_cntrs_by_cell +; lon_verts_by_cell_FV3LAM = out@lon_verts_by_cell +; lat_verts_by_cell_FV3LAM = out@lat_verts_by_cell - lon_cntrs_by_cell@SARFV3 = out@lon_cntrs_by_cell - lat_cntrs_by_cell@SARFV3 = out@lat_cntrs_by_cell - lon_verts_by_cell@SARFV3 = out@lon_verts_by_cell - lat_verts_by_cell@SARFV3 = out@lat_verts_by_cell + lon_cntrs_by_cell@FV3LAM = out@lon_cntrs_by_cell + lat_cntrs_by_cell@FV3LAM = out@lat_cntrs_by_cell + lon_verts_by_cell@FV3LAM = out@lon_verts_by_cell + lat_verts_by_cell@FV3LAM = out@lat_verts_by_cell @@ -667,7 +667,7 @@ print("") print("==============================================================") print("==============================================================") print("") -print("Interpolating RAP field onto halo of SARFV3 regional domain...") +print("Interpolating RAP field onto halo of FV3LAM regional domain...") print("") print("==============================================================") print("==============================================================") @@ -696,8 +696,8 @@ print("") gen_weights = False src_grid_filename = "src_grid_RAP.nc" - dst_grid_filename = "dst_grid_SARFV3halo" + nh + ".nc" - weights_filename = "weights_RAP_to_SARFV3halo" + nh + ".nc" + dst_grid_filename = "dst_grid_FV3LAMhalo" + nh + ".nc" + weights_filename = "weights_RAP_to_FV3LAMhalo" + nh + ".nc" print("") print("Source grid, destination grid, and weights files are:") @@ -711,13 +711,13 @@ print("") fileexists(dst_grid_filename) .and. \ fileexists(weights_filename)) then print("") - print("Source grid (RAP), destination grid (SARFV3), and " + \ + print("Source grid (RAP), destination grid (FV3LAM), and " + \ "weights files " + char_nl + \ "already exist. Not regenerating these files.") gen_weights = False else print("") - print("Source grid (RAP), destination grid (SARFV3), and/or " + \ + print("Source grid (RAP), destination grid (FV3LAM), and/or " + \ "weights file do " + char_nl + \ "not exist and must be generated.") gen_weights = True @@ -732,7 +732,7 @@ print("") print("") print("gen_weights has been set to True, but the source grid (RAP) " + \ "file, the destination " + char_nl + \ - "grid (SARFV3) file, and/or the weights file does/do not exist:") + "grid (FV3LAM) file, and/or the weights file does/do not exist:") print(" fileexists(src_grid_filename) = " + fileexists(src_grid_filename)) print(" fileexists(dst_grid_filename) = " + fileexists(dst_grid_filename)) print(" fileexists(weights_filename) = " + fileexists(weights_filename)) @@ -744,42 +744,42 @@ print("") ; ********************************************************************** ; * ; Perform interpolation (regridding) of the field on the RAP grid to the -; halo of the SARFV3 grid. +; halo of the FV3LAM grid. ; * ; ********************************************************************** ; -; out := interpolate_RAP_to_SARFV3( \ +; out := interpolate_RAP_to_FV3LAM( \ ; lon_cntrs_by_cell_RAP, lat_cntrs_by_cell_RAP, \ ; lon_verts_by_cell_RAP, lat_verts_by_cell_RAP, \ -; lon_cntrs_by_cell_SARFV3, lat_cntrs_by_cell_SARFV3, \ -; lon_verts_by_cell_SARFV3, lat_verts_by_cell_SARFV3, \ +; lon_cntrs_by_cell_FV3LAM, lat_cntrs_by_cell_FV3LAM, \ +; lon_verts_by_cell_FV3LAM, lat_verts_by_cell_FV3LAM, \ ; field_by_cell_RAP, \ ; gen_weights, \ ; src_grid_filename, dst_grid_filename, weights_filename) - out := interpolate_RAP_to_SARFV3( \ + out := interpolate_RAP_to_FV3LAM( \ lon_cntrs_by_cell@RAP, lat_cntrs_by_cell@RAP, \ lon_verts_by_cell@RAP, lat_verts_by_cell@RAP, \ - lon_cntrs_by_cell@SARFV3, lat_cntrs_by_cell@SARFV3, \ - lon_verts_by_cell@SARFV3, lat_verts_by_cell@SARFV3, \ + lon_cntrs_by_cell@FV3LAM, lat_cntrs_by_cell@FV3LAM, \ + lon_verts_by_cell@FV3LAM, lat_verts_by_cell@FV3LAM, \ field_by_cell@RAP, \ gen_weights, \ src_grid_filename, dst_grid_filename, weights_filename) - field_by_cell@SARFV3 = out@field_by_cell_SARFV3 + field_by_cell@FV3LAM = out@field_by_cell_FV3LAM ; ; ********************************************************************** ; * ; Calculate and print out basic statistics of the regridded field on the -; SARFV3 grid. +; FV3LAM grid. ; * ; ********************************************************************** ; print_field_stats = True out := calc_field_stats( \ - field_by_cell@SARFV3, field_desc, field_units, print_field_stats) -; field_min_SARFV3 = out@field_min -; field_max_SARFV3 = out@field_max + field_by_cell@FV3LAM, field_desc, field_units, print_field_stats) +; field_min_FV3LAM = out@field_min +; field_max_FV3LAM = out@field_max @@ -801,18 +801,18 @@ print("") ; ; ********************************************************************** ; * -; If plot_RAP_fields or plot_SARFV3_fields is set to True, plot the +; If plot_RAP_fields or plot_FV3LAM_fields is set to True, plot the ; * ; ********************************************************************** ; - if (plot_RAP_fields .or. plot_SARFV3_fields) then + if (plot_RAP_fields .or. plot_FV3LAM_fields) then print("") print("") print("==============================================================") print("==============================================================") print("") -print("Plotting RAP and/or (interpolated) SARFV3 fields...") +print("Plotting RAP and/or (interpolated) FV3LAM fields...") print("") print("==============================================================") print("==============================================================") @@ -903,19 +903,19 @@ print("") ; * ; ********************************************************************** ; - if (plot_SARFV3_fields) then + if (plot_FV3LAM_fields) then - model_name = "SARFV3" + model_name = "FV3LAM" out := plot_model_field_generic( \ model_name, \ - lon_cntrs_by_cell@SARFV3, lat_cntrs_by_cell@SARFV3, \ - lon_verts_by_cell@SARFV3, lat_verts_by_cell@SARFV3, \ - field_by_cell@SARFV3, \ + lon_cntrs_by_cell@FV3LAM, lat_cntrs_by_cell@FV3LAM, \ + lon_verts_by_cell@FV3LAM, lat_verts_by_cell@FV3LAM, \ + field_by_cell@FV3LAM, \ field_name, field_desc, field_units, \ func_t, func_z, \ fcst_hr, k, \ - draw_grid_by_region@SARFV3(s), \ + draw_grid_by_region@FV3LAM(s), \ plot_options) end if diff --git a/ush/NCL/NCL_ICs_BCs/interpolate_RAP_to_SARFV3.ncl b/ush/NCL/NCL_ICs_BCs/interpolate_RAP_to_FV3LAM.ncl similarity index 82% rename from ush/NCL/NCL_ICs_BCs/interpolate_RAP_to_SARFV3.ncl rename to ush/NCL/NCL_ICs_BCs/interpolate_RAP_to_FV3LAM.ncl index 217aa5a10..c3c4a3d00 100644 --- a/ush/NCL/NCL_ICs_BCs/interpolate_RAP_to_SARFV3.ncl +++ b/ush/NCL/NCL_ICs_BCs/interpolate_RAP_to_FV3LAM.ncl @@ -1,31 +1,31 @@ ; ********************************************************************** ; -; File name: interpolate_RAP_to_SARFV3.ncl +; File name: interpolate_RAP_to_FV3LAM.ncl ; Author: Gerard Ketefian ; ; Description: ; ^^^^^^^^^^^ ; This function interpolates (regrids) a field on the RAP grid to the -; halo of the SARFV3 grid. +; halo of the FV3-LAM grid. ; * ; ********************************************************************** -undef("interpolate_RAP_to_SARFV3") +undef("interpolate_RAP_to_FV3LAM") -function interpolate_RAP_to_SARFV3( \ +function interpolate_RAP_to_FV3LAM( \ lon_cntrs_by_cell_RAP:snumeric, \ lat_cntrs_by_cell_RAP:snumeric, \ lon_verts_by_cell_RAP:snumeric, \ lat_verts_by_cell_RAP:snumeric, \ - lon_cntrs_by_cell_SARFV3:snumeric, \ - lat_cntrs_by_cell_SARFV3:snumeric, \ - lon_verts_by_cell_SARFV3:snumeric, \ - lat_verts_by_cell_SARFV3:snumeric, \ + lon_cntrs_by_cell_FV3LAM:snumeric, \ + lat_cntrs_by_cell_FV3LAM:snumeric, \ + lon_verts_by_cell_FV3LAM:snumeric, \ + lat_verts_by_cell_FV3LAM:snumeric, \ field_by_cell_RAP:snumeric, \ gen_weights:logical, \ src_grid_filename:string, dst_grid_filename:string, weights_filename:string) -local opt, field_by_cell_SARFV3, out +local opt, field_by_cell_FV3LAM, out begin ; @@ -33,9 +33,9 @@ begin ; * ; If gen_weights is set to True, call the function ESMF_regrid(...) to ; generate a set of weights and interpolate the specified field from the -; RAP to the SARFV3 grid. The ESMF_regrid(...) function will also save +; RAP to the FV3-LAM grid. The ESMF_regrid(...) function will also save ; the weights it generates in the specified file (opt@WgtFileName), and -; it will save descriptions of the source (RAP) and destination (SARFV3) +; it will save descriptions of the source (RAP) and destination (FV3-LAM) ; grids in two additional NetCDF files (opt@SrcFileName and opt@ Dst- ; FileName, respectively). ; * @@ -86,11 +86,11 @@ begin ; opt@DstGridType = "unstructured" ; - opt@DstGridLon = lon_cntrs_by_cell_SARFV3 - opt@DstGridLat = lat_cntrs_by_cell_SARFV3 + opt@DstGridLon = lon_cntrs_by_cell_FV3LAM + opt@DstGridLat = lat_cntrs_by_cell_FV3LAM ; - opt@DstGridCornerLon = lon_verts_by_cell_SARFV3 - opt@DstGridCornerLat = lat_verts_by_cell_SARFV3 + opt@DstGridCornerLon = lon_verts_by_cell_FV3LAM + opt@DstGridCornerLat = lat_verts_by_cell_FV3LAM ; ; ********************************************************************** ; * @@ -110,15 +110,15 @@ print("opt@WgtFileName = " + opt@WgtFileName) print("") print("Generating source grid (RAP), destination grid " + \ - "(SARFV3), and weights file and regridding field " + \ - "to destination (SARFV3) grid...") - field_by_cell_SARFV3 = ESMF_regrid(field_by_cell_RAP, opt) + "(FV3-LAM), and weights file and regridding field " + \ + "to destination (FV3-LAM) grid...") + field_by_cell_FV3LAM = ESMF_regrid(field_by_cell_RAP, opt) ; ; ********************************************************************** ; * ; If gen_weights is set to False, call the function ESMF_regrid_with_- ; weights(...) to interpolate the specified field from the RAP to the -; SARFV3 grid using the precomputed weights specified in the file opt@ +; FV3-LAM grid using the precomputed weights specified in the file opt@ ; WgtFileName. ; * ; ********************************************************************** @@ -126,14 +126,14 @@ print("opt@WgtFileName = " + opt@WgtFileName) else print("") - print("Regridding field to destination (SARFV3) grid...") - field_by_cell_SARFV3 \ + print("Regridding field to destination (FV3-LAM) grid...") + field_by_cell_FV3LAM \ = ESMF_regrid_with_weights(field_by_cell_RAP, weights_filename, False) end if print("") -printVarSummary(field_by_cell_SARFV3) +printVarSummary(field_by_cell_FV3LAM) ; ; ********************************************************************** ; * @@ -144,7 +144,7 @@ printVarSummary(field_by_cell_SARFV3) ; ********************************************************************** ; out = True - out@field_by_cell_SARFV3 = field_by_cell_SARFV3 + out@field_by_cell_FV3LAM = field_by_cell_FV3LAM return(out) end diff --git a/ush/NCL/NCL_ICs_BCs/plot_model_field_generic.ncl b/ush/NCL/NCL_ICs_BCs/plot_model_field_generic.ncl index 04743733d..1fe34c0e9 100644 --- a/ush/NCL/NCL_ICs_BCs/plot_model_field_generic.ncl +++ b/ush/NCL/NCL_ICs_BCs/plot_model_field_generic.ncl @@ -164,7 +164,7 @@ begin ; All attributes of the output variable "out" are plotting attributes ; that should be reused for the plot generated by the next call to ; plot_horiz_field(...) (which will plot a regridded version of the -; field above on the SARFV3 grid). For this purpose, here we copy all +; field above on the FV3-LAM grid). For this purpose, here we copy all ; attributes of "out" into the variable plot_options. We will then use ; plot_options as an input arguemnt to plot_horiz_field(...). ; * diff --git a/ush/NCL/NCL_ICs_BCs/read_FV3SAR_grid_halo.ncl b/ush/NCL/NCL_ICs_BCs/read_FV3LAM_grid_halo.ncl similarity index 98% rename from ush/NCL/NCL_ICs_BCs/read_FV3SAR_grid_halo.ncl rename to ush/NCL/NCL_ICs_BCs/read_FV3LAM_grid_halo.ncl index 33c9fef05..e8dd9e92a 100644 --- a/ush/NCL/NCL_ICs_BCs/read_FV3SAR_grid_halo.ncl +++ b/ush/NCL/NCL_ICs_BCs/read_FV3LAM_grid_halo.ncl @@ -1,12 +1,12 @@ ; ; ********************************************************************** ; -; File name: read_FV3SAR_grid_halo.ncl +; File name: read_FV3LAM_grid_halo.ncl ; Author: Gerard Ketefian ; ; Description: ; ^^^^^^^^^^^ -; This function reads in the coordinates of the FV3SAR regional grid +; This function reads in the coordinates of the FV3-LAM regional grid ; from the specified grid file and extracts from it the coordinates of ; the halo. ; @@ -15,9 +15,9 @@ load "strcmp.ncl" load "adjust_longitude_range.ncl" -undef("read_FV3SAR_grid_halo") +undef("read_FV3LAM_grid_halo") -function read_FV3SAR_grid_halo(grid_file:string, nh:integer) +function read_FV3LAM_grid_halo(grid_file:string, nh:integer) local f_grid, \ two_nx, two_ny, nx, ny, nxp, nyp, \ @@ -60,7 +60,7 @@ begin ; ; ********************************************************************** ; -; Open the FV3SAR grid file containing grid information. +; Open the FV3-LAM grid file containing grid information. ; ; ********************************************************************** ; diff --git a/ush/NCL/check_filevar_existence_dims.ncl b/ush/NCL/check_filevar_existence_dims.ncl index 4d654c181..b301a2d49 100644 --- a/ush/NCL/check_filevar_existence_dims.ncl +++ b/ush/NCL/check_filevar_existence_dims.ncl @@ -98,7 +98,7 @@ begin ; ********************************************************************** ; ; Set the dimension names we expect to see in the file(s) from which we -; will read in the FV3SAR field. This depends on the file base name. +; will read in the FV3-LAM field. This depends on the file base name. ; These dimension names will be used to check the consistency of the di- ; mensions of the specified field. ; diff --git a/ush/NCL/find_wrtcmp_grid_params.ncl b/ush/NCL/find_wrtcmp_grid_params.ncl index 149b12f89..c70045d13 100644 --- a/ush/NCL/find_wrtcmp_grid_params.ncl +++ b/ush/NCL/find_wrtcmp_grid_params.ncl @@ -25,7 +25,7 @@ loadscript(lib_location + "strcmp_exact.ncl") load "calc_wrtcmp_grid_params_rotated_latlon.ncl" load "calc_wrtcmp_grid_params_lambert_cnfrml.ncl" -load "read_FV3SAR_grid_native.ncl" +load "read_FV3LAM_grid_native.ncl" begin ; @@ -169,14 +169,14 @@ begin ; ; ********************************************************************** ; -; Read in the native FV3SAR grid. +; Read in the native FV3-LAM grid. ; ; ********************************************************************** ; remove_rgnl_halo = True get_tile_bdies = False - grid_info := read_FV3SAR_grid_native( \ + grid_info := read_FV3LAM_grid_native( \ expt_dir, \ gtype, \ CRES, \ @@ -211,7 +211,7 @@ begin ; output from the grid-read operation above. Then call the function ; that calculates the write-component grid parameters for a lambert- ; conformal grid that is guaranteed to lie completely inside the native -; FV3SAR grid. +; FV3-LAM grid. ; ; ********************************************************************** ; diff --git a/ush/NCL/make_plot_titles.ncl b/ush/NCL/make_plot_titles.ncl index 5bbb8f51d..2cb3788f2 100644 --- a/ush/NCL/make_plot_titles.ncl +++ b/ush/NCL/make_plot_titles.ncl @@ -52,7 +52,7 @@ function make_plot_titles( \ local inds_tiles_to_plot_str, fmt_str, vert_indx_str, \ func_code_zoom, \ left_str, right_str, main_str, \ - num_newlines_FV3SAR, num_newlines_RAP, num_newlines_to_add, \ + num_newlines_FV3LAM, num_newlines_RAP, num_newlines_to_add, \ line, field_min_str, field_max_str, \ num_lines, line_lengths, line_length_max, num_pad_spaces_before, \ add_half_horiz_space, vert_offset_one_line, vert_offsets, \ @@ -87,7 +87,7 @@ begin ; ; First, consider the case in which the RAP grid and/or a RAP field is ; displayed in the plot. In this case, the main middle string will be -; blank, the left string will contain the FV3SAR grid and/or field in- +; blank, the left string will contain the FV3-LAM grid and/or field in- ; formation, and the right string will contain the RAP grid and/or field ; information. ; @@ -98,7 +98,7 @@ begin main_str = "" left_str \ - := "~F30~FV3SAR field info:~C~" \ + := "~F30~FV3-LAM field info:~C~" \ + "~F29~" + field_desc + " (" + char_dq + field_name + char_dq + ")" \ + " [" + field_units + "]" @@ -113,7 +113,7 @@ begin if (show_tile_bdies) then left_str = left_str + "~C~" + "Tile boundaries in " + tile_bdy_color end if - num_newlines_FV3SAR \ + num_newlines_FV3LAM \ = dimsizes(str_index_of_substr(left_str, "~C~", 0)) right_str \ @@ -130,7 +130,7 @@ begin ; newlines so that they both have the same number (looks better in the ; plot. ; - num_newlines_to_add = num_newlines_FV3SAR - num_newlines_RAP + num_newlines_to_add = num_newlines_FV3LAM - num_newlines_RAP if (num_newlines_to_add .ge. 1) then right_str = right_str + repeat_str("~C~ ", num_newlines_to_add) ; For some reason, after the last newline (~C~), the spacing isn't quite @@ -212,7 +212,7 @@ begin main_str := new(1, "string") line := field_desc + " (" + char_dq + field_name + char_dq \ - + ") on FV3SAR grid" + + ") on FV3-LAM grid" main_str := array_append_record(main_str, line, 0) main_str := main_str(1:) diff --git a/ush/NCL/plot_FV3SAR_field_native.ncl b/ush/NCL/plot_FV3LAM_field_native.ncl similarity index 94% rename from ush/NCL/plot_FV3SAR_field_native.ncl rename to ush/NCL/plot_FV3LAM_field_native.ncl index db511b9dd..a28dc77e6 100644 --- a/ush/NCL/plot_FV3SAR_field_native.ncl +++ b/ush/NCL/plot_FV3LAM_field_native.ncl @@ -18,10 +18,10 @@ ;help = True -expt_dir = "/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/FV3SAR_demo_PASPBL_20190725/expt_dirs/test_GSD_HRRR25km" -expt_dir = "/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/FV3SAR_demo_PASPBL_20190725/expt_dirs/test_GSD_HRRR13km" -expt_dir = "/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/FV3SAR_demo_PASPBL_20190725/expt_dirs/test_GSD_HRRR3km" -expt_dir = "/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/FV3SAR_demo_PASPBL_20190725/expt_dirs/test_GSD_HAFSV0.A" +expt_dir = "/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/FV3LAM_demo_PASPBL_20190725/expt_dirs/test_GSD_HRRR25km" +expt_dir = "/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/FV3LAM_demo_PASPBL_20190725/expt_dirs/test_GSD_HRRR13km" +expt_dir = "/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/FV3LAM_demo_PASPBL_20190725/expt_dirs/test_GSD_HRRR3km" +expt_dir = "/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/FV3LAM_demo_PASPBL_20190725/expt_dirs/test_GSD_HAFSV0.A" tile_inds := (/ 1, 7, 4 /) @@ -215,11 +215,11 @@ loadscript(lib_location + "get_rect_grid_bdy.ncl") loadscript(lib_location + "set_cnLevels_lbLabels.ncl") load "process_plot_params.ncl" -load "read_FV3SAR_grid_native.ncl" -load "read_FV3SAR_gridfield_native.ncl" -load "read_FV3SAR_field_native.ncl" -load "read_FV3SAR_grid_wrtcmp.ncl" -load "read_FV3SAR_field_wrtcmp.ncl" +load "read_FV3LAM_grid_native.ncl" +load "read_FV3LAM_gridfield_native.ncl" +load "read_FV3LAM_field_native.ncl" +load "read_FV3LAM_grid_wrtcmp.ncl" +load "read_FV3LAM_field_wrtcmp.ncl" load "read_RAP_grid.ncl" load "read_RAP_field.ncl" load "plot_horiz_field.ncl" @@ -563,7 +563,7 @@ pause ; ; ********************************************************************** ; -; Read in the FV3SAR grid. +; Read in the FV3-LAM grid. ; ; ********************************************************************** ; @@ -576,15 +576,15 @@ pause ; "native", since then it will have the flexibility to plot fields on ; either the native or the wrtcmp grid. -; read_FV3SAR_wrtcmp = True - read_FV3SAR_wrtcmp = False +; read_FV3LAM_wrtcmp = True + read_FV3LAM_wrtcmp = False - if (read_FV3SAR_wrtcmp) then + if (read_FV3LAM_wrtcmp) then - FV3SAR_wrtcmp_fn = expt_dir + "/" + CDATE + "/" + "dynf000.nc" + FV3LAM_wrtcmp_fn = expt_dir + "/" + CDATE + "/" + "dynf000.nc" get_domain_bdy = True - grid_info := read_FV3SAR_grid_wrtcmp( \ - FV3SAR_wrtcmp_fn, \ + grid_info := read_FV3LAM_grid_wrtcmp( \ + FV3LAM_wrtcmp_fn, \ get_domain_bdy) fp_wrtcmp = grid_info@fp @@ -596,11 +596,11 @@ pause lat_verts_unstruc = grid_info@lat_verts_unstruc lon_bdy = grid_info@lon_bdy lat_bdy = grid_info@lat_bdy - coord_data_type_FV3SAR = grid_info@coord_data_type + coord_data_type_FV3LAM = grid_info@coord_data_type else - grid_info := read_FV3SAR_grid_native( \ + grid_info := read_FV3LAM_grid_native( \ expt_dir, \ gtype, \ cres, \ @@ -641,7 +641,7 @@ pause lat_tile_corners_face_midpts_tiles_to_plot \ = grid_info@lat_tile_corners_face_midpts_all_tiles - coord_data_type_FV3SAR = grid_info@coord_data_type + coord_data_type_FV3LAM = grid_info@coord_data_type end if ; @@ -651,8 +651,8 @@ pause ; ; ********************************************************************** ; - lon_bdy_all_bdies := new(1, coord_data_type_FV3SAR) - lat_bdy_all_bdies := new(1, coord_data_type_FV3SAR) + lon_bdy_all_bdies := new(1, coord_data_type_FV3LAM) + lat_bdy_all_bdies := new(1, coord_data_type_FV3LAM) ; ; ********************************************************************** ; @@ -783,33 +783,33 @@ pause ; ********************************************************************** ; ; If the RAP coordinate arrays are not of the same data type as the FV3- -; SAR coordinate arrays, convert the data type of the former to that of +; LAM coordinate arrays, convert the data type of the former to that of ; the latter. ; ; ********************************************************************** ; - if (.not. strcmp_exact(coord_data_type_FV3SAR, coord_data_type_RAP)) then + if (.not. strcmp_exact(coord_data_type_FV3LAM, coord_data_type_RAP)) then lon_cntrs_unstruc_RAP \ - := totype(lon_cntrs_unstruc_RAP, coord_data_type_FV3SAR) + := totype(lon_cntrs_unstruc_RAP, coord_data_type_FV3LAM) lat_cntrs_unstruc_RAP \ - := totype(lat_cntrs_unstruc_RAP, coord_data_type_FV3SAR) + := totype(lat_cntrs_unstruc_RAP, coord_data_type_FV3LAM) lon_verts_unstruc_RAP \ - := totype(lon_verts_unstruc_RAP, coord_data_type_FV3SAR) + := totype(lon_verts_unstruc_RAP, coord_data_type_FV3LAM) lat_verts_unstruc_RAP \ - := totype(lat_verts_unstruc_RAP, coord_data_type_FV3SAR) + := totype(lat_verts_unstruc_RAP, coord_data_type_FV3LAM) end if ; ; ********************************************************************** ; -; Prepend RAP coordinates to the corresponding arrays for the FV3SAR. +; Prepend RAP coordinates to the corresponding arrays for the FV3LAM. ; This is done for plotting convenience. Note that the RAP coordinates ; are prepended insted of appended so that the RAP grid (and any field -; associated with it) is drawn first and the FV3SAR tiles (and any +; associated with it) is drawn first and the FV3LAM tiles (and any ; fields on them) are then drawn on top. ; ; ********************************************************************** @@ -843,33 +843,33 @@ pause ; ********************************************************************** ; ; If the write-component coordinate arrays are not of the same data type -; as the FV3SAR coordinate arrays, convert the data type of the former +; as the FV3LAM coordinate arrays, convert the data type of the former ; to that of the latter. ; ; ********************************************************************** ; - if (.not. strcmp_exact(coord_data_type_FV3SAR, coord_data_type_wrtcmp)) then + if (.not. strcmp_exact(coord_data_type_FV3LAM, coord_data_type_wrtcmp)) then lon_cntrs_unstruc_wrtcmp \ - := totype(lon_cntrs_unstruc_wrtcmp, coord_data_type_FV3SAR) + := totype(lon_cntrs_unstruc_wrtcmp, coord_data_type_FV3LAM) lat_cntrs_unstruc_wrtcmp \ - := totype(lat_cntrs_unstruc_wrtcmp, coord_data_type_FV3SAR) + := totype(lat_cntrs_unstruc_wrtcmp, coord_data_type_FV3LAM) lon_verts_unstruc_wrtcmp \ - := totype(lon_verts_unstruc_wrtcmp, coord_data_type_FV3SAR) + := totype(lon_verts_unstruc_wrtcmp, coord_data_type_FV3LAM) lat_verts_unstruc_wrtcmp \ - := totype(lat_verts_unstruc_wrtcmp, coord_data_type_FV3SAR) + := totype(lat_verts_unstruc_wrtcmp, coord_data_type_FV3LAM) end if ; ; ********************************************************************** ; -; Prepend write-component coordinates to the corresponding arrays for the FV3SAR. +; Prepend write-component coordinates to the corresponding arrays for the FV3LAM. ; This is done for plotting convenience. Note that the write-component coordinates ; are prepended insted of appended so that the write-component grid (and any field -; associated with it) is drawn first and the FV3SAR tiles (and any +; associated with it) is drawn first and the FV3LAM tiles (and any ; fields on them) are then drawn on top. ; ; ********************************************************************** @@ -904,9 +904,9 @@ pause num_bdies_to_plot = num_bdies_to_plot + 1 - if (.not. strcmp_exact(coord_data_type_FV3SAR, coord_data_type_RAP)) then - lon_bdy_RAP := totype(lon_bdy_RAP, coord_data_type_FV3SAR) - lat_bdy_RAP := totype(lat_bdy_RAP, coord_data_type_FV3SAR) + if (.not. strcmp_exact(coord_data_type_FV3LAM, coord_data_type_RAP)) then + lon_bdy_RAP := totype(lon_bdy_RAP, coord_data_type_FV3LAM) + lat_bdy_RAP := totype(lat_bdy_RAP, coord_data_type_FV3LAM) end if lon_bdy_all_bdies \ @@ -929,9 +929,9 @@ pause num_bdies_to_plot = num_bdies_to_plot + 1 - if (.not. strcmp_exact(coord_data_type_FV3SAR, coord_data_type_wrtcmp)) then - lon_bdy_wrtcmp := totype(lon_bdy_wrtcmp, coord_data_type_FV3SAR) - lat_bdy_wrtcmp := totype(lat_bdy_wrtcmp, coord_data_type_FV3SAR) + if (.not. strcmp_exact(coord_data_type_FV3LAM, coord_data_type_wrtcmp)) then + lon_bdy_wrtcmp := totype(lon_bdy_wrtcmp, coord_data_type_FV3LAM) + lat_bdy_wrtcmp := totype(lat_bdy_wrtcmp, coord_data_type_FV3LAM) end if lon_bdy_all_bdies \ @@ -1024,7 +1024,7 @@ pause ; ; ********************************************************************** ; -; Read in the FV3SAR field for the current forecast hour and vertical +; Read in the FV3LAM field for the current forecast hour and vertical ; index. ; ; ********************************************************************** @@ -1032,7 +1032,7 @@ pause if (is_gridfield) then field_info \ - := read_FV3SAR_gridfield_native( \ + := read_FV3LAM_gridfield_native( \ field_names_by_tile, \ file_names_by_tile, \ gtype, inds_tiles_to_plot, \ @@ -1047,7 +1047,7 @@ pause else field_info \ - := read_FV3SAR_field_native( \ + := read_FV3LAM_field_native( \ field_names_by_tile, \ file_names_by_tile, \ gtype, inds_tiles_to_plot, \ @@ -1061,7 +1061,7 @@ pause end if -; fp_field_FV3SAR = field_info@fp ; This would in general be an array or list of file pointers. +; fp_field_FV3LAM = field_info@fp ; This would in general be an array or list of file pointers. field_desc := field_info@field_desc field_units := field_info@field_units nz_by_tile := field_info@nz_by_tile @@ -1071,10 +1071,10 @@ pause field_max_tiles_to_plot := field_info@field_max_by_tile field_median_tiles_to_plot := field_info@field_median_by_tile field_mean_tiles_to_plot := field_info@field_mean_by_tile - field_data_type_FV3SAR := field_info@field_data_type + field_data_type_FV3LAM := field_info@field_data_type ; Not sure why setting field_name to "none" doesn't do this, but do this ; here temporarily to make the field transparent. -;field_unstruc = default_fillvalue(field_data_type_FV3SAR) +;field_unstruc = default_fillvalue(field_data_type_FV3LAM) ; ; ********************************************************************** ; @@ -1124,8 +1124,8 @@ inds_tiles_to_plot_str + " ..." ; ********************************************************************** ; ; Initialize the 1-D unstructured array that will contain the field val- -; ues on all grids (FV3SAR and possibly also RAP) and initialize it to -; the field values on the FV3SAR tile grids. +; ues on all grids (FV3LAM and possibly also RAP) and initialize it to +; the field values on the FV3LAM tile grids. ; ; ********************************************************************** ; @@ -1174,23 +1174,23 @@ inds_tiles_to_plot_str + " ..." ; ; ********************************************************************** ; -; For plotting convenience, we will combine the fields on the FV3SAR andi +; For plotting convenience, we will combine the fields on the FV3LAM andi ; RAP grids into a single array. For this purpose, if necessary we -; first convert the data type of the RAP field to that of the FV3SAR +; first convert the data type of the RAP field to that of the FV3LAM ; field. ; ; ********************************************************************** ; - if (.not. strcmp_exact(field_data_type_FV3SAR, field_data_type_RAP)) then + if (.not. strcmp_exact(field_data_type_FV3LAM, field_data_type_RAP)) then field_unstruc_RAP \ - := totype(field_unstruc_RAP, field_data_type_FV3SAR) + := totype(field_unstruc_RAP, field_data_type_FV3LAM) end if ; ; ********************************************************************** ; ; For plotting convenience, prepend the RAP field to the array contain- -; ing the FV3SAR field. We prepend instead of append so that the RAP -; field is drawn first and the FV3SAR field on the tiles are then drawn +; ing the FV3LAM field. We prepend instead of append so that the RAP +; field is drawn first and the FV3LAM field on the tiles are then drawn ; on top. ; ; ********************************************************************** @@ -1322,7 +1322,7 @@ inds_tiles_to_plot_str + " ..." ; ********************************************************************** ; ; Calculate "nice" contour level values to use for making a color con- -; tour plot of the combined FV3SAR and RAP field. +; tour plot of the combined FV3LAM and RAP field. ; ; ********************************************************************** ; diff --git a/ush/NCL/plot_grid.ncl b/ush/NCL/plot_grid.ncl index 21c056bcf..6f9a10e2a 100644 --- a/ush/NCL/plot_grid.ncl +++ b/ush/NCL/plot_grid.ncl @@ -185,10 +185,10 @@ loadscript(lib_location + "get_rect_grid_bdy.ncl") loadscript(lib_location + "set_cnLevels_lbLabels.ncl") load "process_plot_params.ncl" -load "read_FV3SAR_grid_native.ncl" -load "read_FV3SAR_field_native.ncl" -load "read_FV3SAR_grid_wrtcmp.ncl" -load "read_FV3SAR_field_wrtcmp.ncl" +load "read_FV3LAM_grid_native.ncl" +load "read_FV3LAM_field_native.ncl" +load "read_FV3LAM_grid_wrtcmp.ncl" +load "read_FV3LAM_field_wrtcmp.ncl" load "read_RAP_grid.ncl" load "read_RAP_field.ncl" load "plot_horiz_field.ncl" @@ -406,19 +406,19 @@ char_dq + "ncgm" + char_dq + "." + char_nl ; ; ********************************************************************** ; -; Read in the FV3SAR grid. +; Read in the FV3-LAM grid. ; ; ********************************************************************** ; -read_FV3SAR_wrtcmp = True -;read_FV3SAR_wrtcmp = False +read_FV3LAM_wrtcmp = True +;read_FV3LAM_wrtcmp = False -if (read_FV3SAR_wrtcmp) then +if (read_FV3LAM_wrtcmp) then - FV3SAR_wrtcmp_fn = run_dir + "/" + CDATE + "/" + "dynf000.nc" + FV3LAM_wrtcmp_fn = run_dir + "/" + CDATE + "/" + "dynf000.nc" get_domain_bdy = True - grid_info := read_FV3SAR_grid_wrtcmp( \ - FV3SAR_wrtcmp_fn, \ + grid_info := read_FV3LAM_grid_wrtcmp( \ + FV3LAM_wrtcmp_fn, \ get_domain_bdy) fp_wrtcmp = grid_info@fp @@ -430,7 +430,7 @@ if (read_FV3SAR_wrtcmp) then lat_verts_unstruc = grid_info@lat_verts_unstruc lon_bdy = grid_info@lon_bdy lat_bdy = grid_info@lat_bdy - coord_data_type_FV3SAR = grid_info@coord_data_type + coord_data_type_FV3LAM = grid_info@coord_data_type else @@ -438,7 +438,7 @@ else ; or be a requird input that gets processed along with the other ; command linea arguments? - grid_info := read_FV3SAR_grid_native( \ + grid_info := read_FV3LAM_grid_native( \ work_dir, \ gtype, \ cres, \ @@ -479,7 +479,7 @@ else lat_tile_corners_face_midpts_tiles_to_plot \ = grid_info@lat_tile_corners_face_midpts_all_tiles - coord_data_type_FV3SAR = grid_info@coord_data_type + coord_data_type_FV3LAM = grid_info@coord_data_type end if ; @@ -507,7 +507,7 @@ num_vert = dimsizes(vert_inds_to_plot) ; Must set to 0 for write-component files since those each contain output for only one time. -if (read_FV3SAR_wrtcmp) then +if (read_FV3LAM_wrtcmp) then time_inds_to_plot = 0*time_inds_to_plot end if @@ -547,15 +547,15 @@ do n=0, num_fcst_hrs-1 ; ; ********************************************************************** ; -if (read_FV3SAR_wrtcmp) then +if (read_FV3LAM_wrtcmp) then ; ; Set the file name. This depends on the time index/ forecast output hour. ; -; FV3SAR_wrtcmp_fn = run_dir + "/dynf000.nc" -; FV3SAR_wrtcmp_fn = run_dir + "/phyf000.nc" -; FV3SAR_wrtcmp_fn = run_dir + "/phyf" + fcst_hr_str + ".nc" - FV3SAR_wrtcmp_fn = run_dir + "/" + CDATE + "/" + "phyf" + fcst_hr_str + ".nc" +; FV3LAM_wrtcmp_fn = run_dir + "/dynf000.nc" +; FV3LAM_wrtcmp_fn = run_dir + "/phyf000.nc" +; FV3LAM_wrtcmp_fn = run_dir + "/phyf" + fcst_hr_str + ".nc" + FV3LAM_wrtcmp_fn = run_dir + "/" + CDATE + "/" + "phyf" + fcst_hr_str + ".nc" ; ; ********************************************************************** @@ -595,7 +595,7 @@ if (read_FV3SAR_wrtcmp) then ; t_filedim_names = (/ "time" /) var_info := check_filevar_existence_dims( \ - FV3SAR_wrtcmp_fn, \ + FV3LAM_wrtcmp_fn, \ field_name, \ nx, ny, \ vert_inds_to_plot, \ @@ -622,20 +622,20 @@ if (read_FV3SAR_wrtcmp) then ; ; ********************************************************************** ; -; Read the specified field on the FV3SAR write-component grid. +; Read the specified field on the FV3-LAM write-component grid. ; ; ********************************************************************** ; field_info \ - := read_FV3SAR_field_wrtcmp( \ + := read_FV3LAM_field_wrtcmp( \ field_name, \ horiz_dist_units, horiz_area_units, \ - FV3SAR_wrtcmp_fn, \ + FV3LAM_wrtcmp_fn, \ nx, ny, \ vert_indx, time_indx, \ func_xy_only, func_xyz_only, func_xyt_only, func_xyzt_only) - fp_field_FV3SAR = field_info@fp + fp_field_FV3LAM = field_info@fp field_desc = field_info@field_desc field_units = field_info@field_units field_unstruc = field_info@field_unstruc @@ -643,7 +643,7 @@ if (read_FV3SAR_wrtcmp) then field_max = field_info@field_max field_median = field_info@field_median field_mean = field_info@field_mean - field_data_type_FV3SAR = field_info@field_data_type + field_data_type_FV3LAM = field_info@field_data_type plot_title = field_desc + " [" + field_units + "]" print("") @@ -978,7 +978,7 @@ n_tile_prev + " to " + char_nl + \ ; ********************************************************************** ; field_info \ - := read_FV3SAR_field_native( \ + := read_FV3LAM_field_native( \ field_names_by_tile, \ file_names_by_tile, \ gtype, inds_tiles_to_plot, \ @@ -990,7 +990,7 @@ n_tile_prev + " to " + char_nl + \ func_xy_only, func_xyz_only, func_xyt_only, func_xyzt_only, \ average_in_x, average_in_y) -; fp_field_FV3SAR = field_info@fp ; This would in general be an array or list of file pointers. +; fp_field_FV3LAM = field_info@fp ; This would in general be an array or list of file pointers. field_desc = field_info@field_desc field_units = field_info@field_units field_unstruc = field_info@field_all_tiles_unstruc @@ -998,7 +998,7 @@ n_tile_prev + " to " + char_nl + \ field_max_all_tiles = field_info@field_max_all_tiles field_median_all_tiles = field_info@field_median_all_tiles field_mean_all_tiles = field_info@field_mean_all_tiles - field_data_type_FV3SAR = field_info@field_data_type + field_data_type_FV3LAM = field_info@field_data_type plot_title = field_desc + " [" + field_units + "]" print("") @@ -1014,7 +1014,7 @@ n_tile_prev + " to " + char_nl + \ temp := tostring(inds_tiles_to_plot) temp := str_join(temp, ", ") temp := str_concat( (/"[tile(s) ", temp, "]"/) ) - msg := "Calculating statistics of field over all FV3SAR tiles to be plotted " + \ + msg := "Calculating statistics of field over all FV3-LAM tiles to be plotted " + \ temp + " ..." print("") print("" + separator_line) @@ -1029,7 +1029,7 @@ n_tile_prev + " to " + char_nl + \ print("") print("" + msg) - msg := "Done calculating statistics of field over all FV3SAR tiles to be plotted." + msg := "Done calculating statistics of field over all FV3-LAM tiles to be plotted." print("") print("" + msg) print("" + separator_line) @@ -1184,7 +1184,7 @@ end if ; ********************************************************************** ; ; If plot_RAP_field is set to True, combine the coordinate arrays for -; the FV3SAR and the RAP into a single set of arrays for plotting. +; the FV3-LAM and the RAP into a single set of arrays for plotting. ; ; ********************************************************************** ; @@ -1193,45 +1193,45 @@ end if ; ********************************************************************** ; ; If the RAP coordinate arrays are not of the same data type as the FV3- -; SAR coordinate arrays, convert the data type of the former to that of +; LAM coordinate arrays, convert the data type of the former to that of ; the latter. ; ; ********************************************************************** ; - if (.not. strcmp_exact(coord_data_type_FV3SAR, coord_data_type_RAP)) then + if (.not. strcmp_exact(coord_data_type_FV3LAM, coord_data_type_RAP)) then lon_cntrs_unstruc_RAP \ - := totype(lon_cntrs_unstruc_RAP, coord_data_type_FV3SAR) + := totype(lon_cntrs_unstruc_RAP, coord_data_type_FV3LAM) lat_cntrs_unstruc_RAP \ - := totype(lat_cntrs_unstruc_RAP, coord_data_type_FV3SAR) + := totype(lat_cntrs_unstruc_RAP, coord_data_type_FV3LAM) lon_verts_unstruc_RAP \ - := totype(lon_verts_unstruc_RAP, coord_data_type_FV3SAR) + := totype(lon_verts_unstruc_RAP, coord_data_type_FV3LAM) lat_verts_unstruc_RAP \ - := totype(lat_verts_unstruc_RAP, coord_data_type_FV3SAR) + := totype(lat_verts_unstruc_RAP, coord_data_type_FV3LAM) end if ; ; ********************************************************************** ; -; If the RAP field is not of the same data type as the FV3SAR field, +; If the RAP field is not of the same data type as the FV3-LAM field, ; convert the data type of the former to that of the latter. ; ; ********************************************************************** ; - if (.not. strcmp_exact(field_data_type_FV3SAR, field_data_type_RAP)) then + if (.not. strcmp_exact(field_data_type_FV3LAM, field_data_type_RAP)) then field_unstruc_RAP \ - := totype(field_unstruc_RAP, field_data_type_FV3SAR) + := totype(field_unstruc_RAP, field_data_type_FV3LAM) end if ; ; ********************************************************************** ; ; Prepend RAP coordinates and fields to the corresponding arrays for the -; FV3SAR so that the RAP grid is drawn first and the FV3SAR tiles are +; FV3-LAM so that the RAP grid is drawn first and the FV3-LAM tiles are ; then drawn on top. ; ; ********************************************************************** @@ -1258,7 +1258,7 @@ end if ; ; ********************************************************************** ; - msg := "Calculating statistics of combined field on FV3SAR and RAP grids ..." + msg := "Calculating statistics of combined field on FV3-LAM and RAP grids ..." print("") print("" + separator_line) print("" + msg) @@ -1277,7 +1277,7 @@ end if field_median := field_stat_info@field_median field_mean := field_stat_info@field_mean - msg := "Done calculating statistics of combined field on FV3SAR and RAP grids." + msg := "Done calculating statistics of combined field on FV3-LAM and RAP grids." print("") print("" + msg) print("" + separator_line) @@ -1285,7 +1285,7 @@ end if ; ********************************************************************** ; ; If show_RAP_bdy is set to True, prepend the RAP boundary coordinates -; to those for the FV3SAR tiles. +; to those for the FV3-LAM tiles. ; ; ********************************************************************** ; @@ -1293,9 +1293,9 @@ end if ; ; Perform data conversion if necessary. ; - if (strcmp_exact(coord_data_type_FV3SAR, coord_data_type_RAP) .eq. False) then - lon_bdy_RAP := totype(lon_bdy_RAP, coord_data_type_FV3SAR) - lat_bdy_RAP := totype(lat_bdy_RAP, coord_data_type_FV3SAR) + if (strcmp_exact(coord_data_type_FV3LAM, coord_data_type_RAP) .eq. False) then + lon_bdy_RAP := totype(lon_bdy_RAP, coord_data_type_FV3LAM) + lat_bdy_RAP := totype(lat_bdy_RAP, coord_data_type_FV3LAM) end if if (.not. show_tile_bdies) then @@ -1452,7 +1452,7 @@ bdy_opts@bdy_dash_patterns = 1 ; Old way of calling plot_horiz_field + changes to get it to work with ; new way, but doesn't work. Use the new call further below, but some ; input arguments not yet defined. Should be defined as in file -; plot_FV3SAR_field_native.ncl. +; plot_FV3LAM_field_native.ncl. ; plot_info := plot_horiz_field( \ ; fn_graphics, \ ; lon_cntrs_unstruc, lat_cntrs_unstruc, \ diff --git a/ush/NCL/process_plot_params.ncl b/ush/NCL/process_plot_params.ncl index a038c37de..b58b42320 100644 --- a/ush/NCL/process_plot_params.ncl +++ b/ush/NCL/process_plot_params.ncl @@ -252,7 +252,7 @@ example_usage_and_help_str ; ; ********************************************************************** ; -; Note: Can't use this for JPgrid because that has no such standard values. +; Note: Can't use this for ESGgrid because that has no such standard values. ; At some point, change this if-statement so that it's entered only for ; GFDLgrid. if (False) then diff --git a/ush/NCL/read_FV3SAR_field_native.ncl b/ush/NCL/read_FV3LAM_field_native.ncl similarity index 98% rename from ush/NCL/read_FV3SAR_field_native.ncl rename to ush/NCL/read_FV3LAM_field_native.ncl index 88a463e2e..6a551194a 100644 --- a/ush/NCL/read_FV3SAR_field_native.ncl +++ b/ush/NCL/read_FV3LAM_field_native.ncl @@ -1,7 +1,7 @@ ; ; ********************************************************************** ; -; File name: read_FV3SAR_field_native.ncl +; File name: read_FV3LAM_field_native.ncl ; Author: Gerard Ketefian ; ; Description: @@ -18,9 +18,9 @@ loadscript(lib_location + "calc_field_stats.ncl") load "get_gridfield_info.ncl" -undef("read_FV3SAR_field_native") +undef("read_FV3LAM_field_native") -function read_FV3SAR_field_native( \ +function read_FV3LAM_field_native( \ field_names_by_tile[*]:string, \ file_names_by_tile[*]:string, \ gtype:string, \ @@ -72,7 +72,7 @@ begin ; ; ********************************************************************** ; - id_str := "Message from procedure/function read_FV3SAR_field_native():" + id_str := "Message from procedure/function read_FV3LAM_field_native():" ; ; ********************************************************************** ; diff --git a/ush/NCL/read_FV3SAR_field_wrtcmp.ncl b/ush/NCL/read_FV3LAM_field_wrtcmp.ncl similarity index 97% rename from ush/NCL/read_FV3SAR_field_wrtcmp.ncl rename to ush/NCL/read_FV3LAM_field_wrtcmp.ncl index 2b2378e0e..440bdb81c 100644 --- a/ush/NCL/read_FV3SAR_field_wrtcmp.ncl +++ b/ush/NCL/read_FV3LAM_field_wrtcmp.ncl @@ -1,7 +1,7 @@ ; ; ********************************************************************** ; -; File name: read_FV3SAR_field_wrtcmp.ncl +; File name: read_FV3LAM_field_wrtcmp.ncl ; Author: Gerard Ketefian ; ; Description: @@ -15,9 +15,9 @@ loadscript(lib_location + "special_chars.ncl") loadscript(lib_location + "strcmp_exact.ncl") loadscript(lib_location + "calc_field_stats.ncl") -undef("read_FV3SAR_field_wrtcmp") +undef("read_FV3LAM_field_wrtcmp") -function read_FV3SAR_field_wrtcmp( \ +function read_FV3LAM_field_wrtcmp( \ field_name:string, \ horiz_dist_units:string, \ horiz_area_units:string, \ diff --git a/ush/NCL/read_FV3SAR_grid_native.ncl b/ush/NCL/read_FV3LAM_grid_native.ncl similarity index 99% rename from ush/NCL/read_FV3SAR_grid_native.ncl rename to ush/NCL/read_FV3LAM_grid_native.ncl index 0905e9e1f..7862666d8 100644 --- a/ush/NCL/read_FV3SAR_grid_native.ncl +++ b/ush/NCL/read_FV3LAM_grid_native.ncl @@ -1,7 +1,7 @@ ; ; ********************************************************************** ; -; File name: read_FV3SAR_grid_native.ncl +; File name: read_FV3LAM_grid_native.ncl ; Author: Gerard Ketefian ; ; Description: @@ -15,13 +15,13 @@ ; The input arguments to this function are as follows: ; ; expt_dir: -; This is the experiment directory created by the FV3SAR workflow gene- +; This is the experiment directory created by the FV3-LAM workflow gene- ; ration script. The grid specification files corresponding to the ; cubed-sphere tiles are within subdirectories under this directory. ; ; gtype: ; This is a string containing the grid type of the FV3 cubed-sphere grid -; being read in. For files generated by the FV3SAR workflow, this will +; being read in. For files generated by the FV3-LAMR workflow, this will ; be equal to "regional". ; ; cres: @@ -67,9 +67,9 @@ loadscript(lib_location + "get_rect_grid_bdy.ncl") loadscript(lib_location + "get_rect_grid_corners.ncl") loadscript(lib_location + "adjust_longitude_range.ncl") -undef("read_FV3SAR_grid_native") +undef("read_FV3LAM_grid_native") -function read_FV3SAR_grid_native( \ +function read_FV3LAM_grid_native( \ expt_dir:string, \ gtype:string, \ cres:string, \ @@ -233,7 +233,7 @@ begin else grid_fn = grid_fn + ".nc" end if - grid_fn = expt_dir + "/fix_sar/" + grid_fn + grid_fn = expt_dir + "/fix_lam/" + grid_fn grid_fn_all_tiles(nn) = grid_fn print(" grid_fn_all_tiles(" + nn + ") = " + \ diff --git a/ush/NCL/read_FV3SAR_grid_wrtcmp.ncl b/ush/NCL/read_FV3LAM_grid_wrtcmp.ncl similarity index 93% rename from ush/NCL/read_FV3SAR_grid_wrtcmp.ncl rename to ush/NCL/read_FV3LAM_grid_wrtcmp.ncl index b2434eea0..77bddcef3 100644 --- a/ush/NCL/read_FV3SAR_grid_wrtcmp.ncl +++ b/ush/NCL/read_FV3LAM_grid_wrtcmp.ncl @@ -1,15 +1,15 @@ ; ; ********************************************************************** ; -; File name: read_FV3SAR_grid_wrtcmp.ncl +; File name: read_FV3LAM_grid_wrtcmp.ncl ; Author: Gerard Ketefian ; ; Description: ; ^^^^^^^^^^^ ; This function returns the dimensions, cell center coordinates, and -; cell vertex coordinates of the grid that discretizes the FV3SAR's +; cell vertex coordinates of the grid that discretizes the FV3-LAM's ; write-component output domain. The file to read is specified by -; FV3SAR_wrtcmp_fn. If get_domain_bdy is set to True, this function +; FV3LAM_wrtcmp_fn. If get_domain_bdy is set to True, this function ; also returns the coordinates of the cell vertices lying on the bounda- ; ry of the domain. ; @@ -20,10 +20,10 @@ loadscript(lib_location + "constants.ncl") loadscript(lib_location + "strcmp_exact.ncl") loadscript(lib_location + "get_rect_grid_bdy.ncl") -undef("read_FV3SAR_grid_wrtcmp") +undef("read_FV3LAM_grid_wrtcmp") -function read_FV3SAR_grid_wrtcmp( \ - FV3SAR_wrtcmp_fn:string, \ +function read_FV3LAM_grid_wrtcmp( \ + FV3LAM_wrtcmp_fn:string, \ get_domain_bdy:logical) local fp, \ @@ -54,17 +54,17 @@ begin ; ; ********************************************************************** ; -; Open the specified FV3SAR wrtcmp-generated output file for reading. +; Open the specified FV3-LAM wrtcmp-generated output file for reading. ; ; ********************************************************************** ; print("") print("" + separator_line) - print("Reading in FV3SAR's write-component grid coordinates from file ...") + print("Reading in FV3LAM's write-component grid coordinates from file ...") print("") - print(" FV3SAR_wrtcmp_fn = " + char_dq + FV3SAR_wrtcmp_fn + char_dq) + print(" FV3LAM_wrtcmp_fn = " + char_dq + FV3LAM_wrtcmp_fn + char_dq) - fp = addfile(FV3SAR_wrtcmp_fn, "r") + fp = addfile(FV3LAM_wrtcmp_fn, "r") ; ; ********************************************************************** ; @@ -228,7 +228,7 @@ lat_verts = lat_verts*degs_per_rad end do print("") - print("Done reading in FV3SAR's write-component grid coordinates from file.") + print("Done reading in FV3-LAM's write-component grid coordinates from file.") print("" + separator_line) ; ; ********************************************************************** diff --git a/ush/NCL/read_FV3SAR_gridfield_native.ncl b/ush/NCL/read_FV3LAM_gridfield_native.ncl similarity index 98% rename from ush/NCL/read_FV3SAR_gridfield_native.ncl rename to ush/NCL/read_FV3LAM_gridfield_native.ncl index 95aa9e4e4..287b68a05 100644 --- a/ush/NCL/read_FV3SAR_gridfield_native.ncl +++ b/ush/NCL/read_FV3LAM_gridfield_native.ncl @@ -1,7 +1,7 @@ ; ; ********************************************************************** ; -; File name: read_FV3SAR_gridfield_native.ncl +; File name: read_FV3LAM_gridfield_native.ncl ; Author: Gerard Ketefian ; ; Description: @@ -18,9 +18,9 @@ loadscript(lib_location + "calc_field_stats.ncl") load "get_gridfield_info.ncl" -undef("read_FV3SAR_gridfield_native") +undef("read_FV3LAM_gridfield_native") -function read_FV3SAR_gridfield_native( \ +function read_FV3LAM_gridfield_native( \ field_names_by_tile[*]:string, \ file_names_by_tile[*]:string, \ gtype:string, \ @@ -108,7 +108,7 @@ begin ; ; ********************************************************************** ; - id_str := "Message from procedure/function read_FV3SAR_gridfield_native():" + id_str := "Message from procedure/function read_FV3LAM_gridfield_native():" ; ; ********************************************************************** ; @@ -648,7 +648,7 @@ begin ; ; Set to missing values the variables containing the vertical and time ; dimensions of the field on each tile. These need to be returned only -; for consistency with the read_FV3SAR_field_native(...) function. +; for consistency with the read_FV3LAM_field_native(...) function. ; ; ********************************************************************** ; diff --git a/ush/UFS_plot_domains.py b/ush/UFS_plot_domains.py index 46a74ec35..a6e629bd1 100755 --- a/ush/UFS_plot_domains.py +++ b/ush/UFS_plot_domains.py @@ -10,12 +10,12 @@ # Computational grid definitions -JPgrid_LON_CTR=-153.0 -JPgrid_LAT_CTR=61.0 -JPgrid_DELX=3000.0 -JPgrid_DELY=3000.0 -JPgrid_NX=1344 -JPgrid_NY=1152 +ESGgrid_LON_CTR=-153.0 +ESGgrid_LAT_CTR=61.0 +ESGgrid_DELX=3000.0 +ESGgrid_DELY=3000.0 +ESGgrid_NX=1344 +ESGgrid_NY=1152 # Write component grid definitions @@ -23,8 +23,8 @@ WRTCMP_ny=1132 WRTCMP_lon_lwr_left=151.5 WRTCMP_lat_lwr_left=42.360 -WRTCMP_dx=JPgrid_DELX -WRTCMP_dy=JPgrid_DELY +WRTCMP_dx=ESGgrid_DELX +WRTCMP_dy=ESGgrid_DELY # Plot-specific definitions @@ -39,11 +39,11 @@ -JPgrid_width = JPgrid_NX * JPgrid_DELX -JPgrid_height = JPgrid_NY * JPgrid_DELY +ESGgrid_width = ESGgrid_NX * ESGgrid_DELX +ESGgrid_height = ESGgrid_NY * ESGgrid_DELY -big_grid_width=np.ceil(JPgrid_width*1.25) -big_grid_height=np.ceil(JPgrid_height*1.25) +big_grid_width=np.ceil(ESGgrid_width*1.25) +big_grid_height=np.ceil(ESGgrid_height*1.25) WRTCMP_width = WRTCMP_nx * WRTCMP_dx WRTCMP_height = WRTCMP_ny * WRTCMP_dy @@ -53,15 +53,15 @@ #ax1 = plt.axes ax1 = plt.subplot2grid((1,1), (0,0)) -map1 = Basemap(projection='gnom', resolution=plot_res, lon_0 = JPgrid_LON_CTR, lat_0 = JPgrid_LAT_CTR, +map1 = Basemap(projection='gnom', resolution=plot_res, lon_0 = ESGgrid_LON_CTR, lat_0 = ESGgrid_LAT_CTR, width = big_grid_width, height=big_grid_height) map1.drawmapboundary(fill_color='#9999FF') map1.fillcontinents(color='#ddaa66',lake_color='#9999FF') map1.drawcoastlines() -map2 = Basemap(projection='gnom', lon_0 = JPgrid_LON_CTR, lat_0 = JPgrid_LAT_CTR, - width = JPgrid_width, height=JPgrid_height) +map2 = Basemap(projection='gnom', lon_0 = ESGgrid_LON_CTR, lat_0 = ESGgrid_LAT_CTR, + width = ESGgrid_width, height=ESGgrid_height) #map2.drawmapboundary(fill_color='#9999FF') #map2.fillcontinents(color='#ddaa66',lake_color='#9999FF') @@ -69,7 +69,7 @@ map3 = Basemap(llcrnrlon= WRTCMP_lon_lwr_left, llcrnrlat=WRTCMP_lat_lwr_left, width=WRTCMP_width, height=WRTCMP_height, - resolution=plot_res, projection='lcc', lat_0 = JPgrid_LAT_CTR, lon_0 = JPgrid_LON_CTR) + resolution=plot_res, projection='lcc', lat_0 = ESGgrid_LAT_CTR, lon_0 = ESGgrid_LON_CTR) #map3.drawmapboundary(fill_color='#9999FF') #map3.fillcontinents(color='#ddaa66',lake_color='#9999FF',alpha=0.5) diff --git a/ush/cmp_expt_to_baseline.sh b/ush/cmp_expt_to_baseline.sh index e0582417c..94e6e0c47 100755 --- a/ush/cmp_expt_to_baseline.sh +++ b/ush/cmp_expt_to_baseline.sh @@ -165,7 +165,7 @@ The experiment and baseline directories are: # "orog" \ # "sfc_climo" \ subdirs=( "." \ - "fix_sar" \ + "fix_lam" \ "$CDATE/${EXTRN_MDL_NAME_ICS}/ICS" \ "$CDATE/${EXTRN_MDL_NAME_LBCS}/LBCS" \ "$CDATE/INPUT" \ diff --git a/ush/config.community.sh b/ush/config.community.sh index 1fb2b283c..38dbad21c 100644 --- a/ush/config.community.sh +++ b/ush/config.community.sh @@ -12,7 +12,7 @@ RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" PREDEF_GRID_NAME="GSD_HRRR25km" -GRID_GEN_METHOD="JPgrid" +GRID_GEN_METHOD="ESGgrid" QUILTING="TRUE" USE_CCPP="TRUE" CCPP_PHYS_SUITE="FV3_GFS_2017_gfdlmp" diff --git a/ush/config.nco.sh b/ush/config.nco.sh index 4c10c9eb2..6f176789c 100644 --- a/ush/config.nco.sh +++ b/ush/config.nco.sh @@ -43,15 +43,15 @@ PTMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/ptmp" # Path to direct # # In NCO mode, the user must manually (e.g. after doing the build step) -# create the symlink "${FIXrrfs}/fix_sar" that points to EMC's FIXsar +# create the symlink "${FIXrrfs}/fix_sar" that points to EMC's FIXLAM # directory on the machine. For example, on hera, the symlink's target # needs to be # # /scratch2/NCEPDEV/fv3-cam/emc.campara/fix_fv3cam/fix_sar # -# The experiment generation script will then set FIXsar to +# The experiment generation script will then set FIXLAM to # -# FIXsar="${FIXrrfs}/fix_sar/${EMC_GRID_NAME}" +# FIXLAM="${FIXrrfs}/fix_lam/${EMC_GRID_NAME}" # # where EMC_GRID_NAME has the value set above. # diff --git a/ush/config_defaults.sh b/ush/config_defaults.sh index 7f91c0819..8fbabb3d1 100644 --- a/ush/config_defaults.sh +++ b/ush/config_defaults.sh @@ -151,7 +151,7 @@ EXPT_SUBDIR="" # The beginning portion of the directory containing files generated by # the external model (FV3GFS) that the initial and lateral boundary # condition generation tasks need in order to create initial and boundary -# condition files for a given cycle on the native FV3SAR grid. For a +# condition files for a given cycle on the native FV3-LAM grid. For a # cycle that starts on the date specified by the variable yyyymmdd # (consisting of the 4-digit year followed by the 2-digit month followed # by the 2-digit day of the month) and hour specified by the variable hh @@ -227,7 +227,7 @@ DOT_OR_USCORE="_" # # RGNL_GRID_NML_FN: # Name of file containing the namelist settings for the code that generates -# a "JPgrid" type of regional grid. +# a "ESGgrid" type of regional grid. # # FV3_NML_BASE_SUITE_FN: # Name of Fortran namelist file containing the forecast model's base suite @@ -317,12 +317,12 @@ MODEL_CONFIG_FN="model_configure" NEMS_CONFIG_FN="nems.configure" FV3_EXEC_FN="fv3_gfs.x" -WFLOW_XML_FN="FV3SAR_wflow.xml" +WFLOW_XML_FN="FV3LAM_wflow.xml" GLOBAL_VAR_DEFNS_FN="var_defns.sh" EXTRN_MDL_ICS_VAR_DEFNS_FN="extrn_mdl_ics_var_defns.sh" EXTRN_MDL_LBCS_VAR_DEFNS_FN="extrn_mdl_lbcs_var_defns.sh" -WFLOW_LAUNCH_SCRIPT_FN="launch_FV3SAR_wflow.sh" -WFLOW_LAUNCH_LOG_FN="log.launch_FV3SAR_wflow" +WFLOW_LAUNCH_SCRIPT_FN="launch_FV3LAM_wflow.sh" +WFLOW_LAUNCH_LOG_FN="log.launch_FV3LAM_wflow" # #----------------------------------------------------------------------- # @@ -407,7 +407,7 @@ FV3GFS_FILE_FMT_LBCS="nemsio" # YYYY is the 4-digit year, MM the 2-digit month, DD the 2-digit day of # the month, and HH the 2-digit hour of the day) for the external model # files specified by the array EXTRN_MDL_FILES_ICS (these files will be -# used to generate the ICs on the native FV3SAR grid. If this is set to +# used to generate the ICs on the native FV3-LAM grid. If this is set to # an empty string, then the workflow will look for the external model # files for generating ICS in a default machine-dependent location. In # this case, EXTRN_MDL_FILES_ICS is not used. @@ -484,13 +484,13 @@ OZONE_PARAM_NO_CCPP="ozphys" # and using it as the regional grid. Note that the forecast is run on # only on the regional grid (i.e. tile 7, not tiles 1 through 6). # -# * "JPgrid": +# * "ESGgrid": # This will generate a regional grid using the map projection developed # by Jim Purser of EMC. # #----------------------------------------------------------------------- # -GRID_GEN_METHOD="JPgrid" +GRID_GEN_METHOD="ESGgrid" # #----------------------------------------------------------------------- # @@ -645,29 +645,29 @@ GFDLgrid_USE_GFDLgrid_RES_IN_FILENAMES="TRUE" # #----------------------------------------------------------------------- # -# Set parameters specific to the "JPgrid" method of generating a regional -# grid (i.e. for GRID_GEN_METHOD set to "JPgrid"). Definitions: +# Set parameters specific to the "ESGgrid" method of generating a regional +# grid (i.e. for GRID_GEN_METHOD set to "ESGgrid"). Definitions: # -# JPgrid_LON_CTR: +# ESGgrid_LON_CTR: # The longitude of the center of the grid (in degrees). # -# JPgrid_LAT_CTR: +# ESGgrid_LAT_CTR: # The latitude of the center of the grid (in degrees). # -# JPgrid_DELX: +# ESGgrid_DELX: # The cell size in the zonal direction of the regional grid (in meters). # -# JPgrid_DELY: +# ESGgrid_DELY: # The cell size in the meridional direction of the regional grid (in # meters). # -# JPgrid_NX: +# ESGgrid_NX: # The number of cells in the zonal direction on the regional grid. # -# JPgrid_NY: +# ESGgrid_NY: # The number of cells in the meridional direction on the regional grid. # -# JPgrid_WIDE_HALO_WIDTH: +# ESGgrid_WIDE_HALO_WIDTH: # The width (in units of number of grid cells) of the halo to add around # the regional grid before shaving the halo down to the width(s) expected # by the forecast model. @@ -676,7 +676,7 @@ GFDLgrid_USE_GFDLgrid_RES_IN_FILENAMES="TRUE" # 4-cell wide and orography files with halos that are 0-cell and 3-cell # wide (all of which are required as inputs to the forecast model), the # grid and orography tasks first create files with halos around the regional -# domain of width JPgrid_WIDE_HALO_WIDTH cells. These are first stored +# domain of width ESGgrid_WIDE_HALO_WIDTH cells. These are first stored # in files. The files are then read in and "shaved" down to obtain grid # files with 3-cell-wide and 4-cell-wide halos and orography files with # 0-cell-wide (i.e. no halo) and 3-cell-wide halos. For this reason, we @@ -689,27 +689,27 @@ GFDLgrid_USE_GFDLgrid_RES_IN_FILENAMES="TRUE" # to change this parameter from its default value set here. # # NOTE: Probably don't need to make this a user-specified variable. -# Just set it in the function set_gridparams_JPgrid.sh. +# Just set it in the function set_gridparams_ESGgrid.sh. # -# JPgrid_ALPHA_PARAM: +# ESGgrid_ALPHA_PARAM: # The alpha parameter used in the Jim Purser map projection/grid generation # method. # -# JPgrid_KAPPA_PARAM: +# ESGgrid_KAPPA_PARAM: # The kappa parameter used in the Jim Purser map projection/grid generation # method. # #----------------------------------------------------------------------- # -JPgrid_LON_CTR="-97.5" -JPgrid_LAT_CTR="35.5" -JPgrid_DELX="3000.0" -JPgrid_DELY="3000.0" -JPgrid_NX="1000" -JPgrid_NY="1000" -JPgrid_WIDE_HALO_WIDTH="6" -JPgrid_ALPHA_PARAM="0.21423" -JPgrid_KAPPA_PARAM="-0.23209" +ESGgrid_LON_CTR="-97.5" +ESGgrid_LAT_CTR="35.5" +ESGgrid_DELX="3000.0" +ESGgrid_DELY="3000.0" +ESGgrid_NX="1000" +ESGgrid_NY="1000" +ESGgrid_WIDE_HALO_WIDTH="6" +ESGgrid_ALPHA_PARAM="0.21423" +ESGgrid_KAPPA_PARAM="-0.23209" # #----------------------------------------------------------------------- # @@ -923,7 +923,7 @@ SFC_CLIMO_DIR="/path/to/pregenerated/surface/climo/files" #----------------------------------------------------------------------- # # Set the array parameter containing the names of all the fields that the -# MAKE_SFC_CLIMO_TN task generates on the native FV3SAR grid. +# MAKE_SFC_CLIMO_TN task generates on the native FV3-LAM grid. # #----------------------------------------------------------------------- # @@ -944,7 +944,7 @@ SFC_CLIMO_FIELDS=( \ # # FIXgsm: # System directory in which the majority of fixed (i.e. time-independent) -# files that are needed to run the FV3SAR model are located +# files that are needed to run the FV3-LAM model are located # # TOPO_DIR: # The location on disk of the static input files used by the make_orog @@ -987,7 +987,7 @@ SFC_CLIMO_FIELDS=( \ # model's namelist file that represent the relative or absolute paths of # various fixed files (the first column of the array, where columns are # delineated by the pipe symbol "|") to the full paths to surface climatology -# files (on the native FV3SAR grid) in the FIXsar directory derived from +# files (on the native FV3-LAM grid) in the FIXLAM directory derived from # the corresponding surface climatology fields (the second column of the # array). # diff --git a/ush/generate_FV3SAR_wflow.sh b/ush/generate_FV3LAM_wflow.sh similarity index 97% rename from ush/generate_FV3SAR_wflow.sh rename to ush/generate_FV3LAM_wflow.sh index 2c24392d5..e80666c39 100755 --- a/ush/generate_FV3SAR_wflow.sh +++ b/ush/generate_FV3LAM_wflow.sh @@ -9,7 +9,7 @@ # #----------------------------------------------------------------------- # -function generate_FV3SAR_wflow() { +function generate_FV3LAM_wflow() { # #----------------------------------------------------------------------- # @@ -435,7 +435,7 @@ added: print_info_msg " Adding the following line to the cron table in order to automatically -resubmit FV3SAR workflow: +resubmit FV3-LAM workflow: CRONTAB_LINE = \"${CRONTAB_LINE}\"" ( crontab -l; echo "${CRONTAB_LINE}" ) | crontab - @@ -522,7 +522,7 @@ the forecast model directory sturcture to the experiment directory..." Copying the fixed file containing cloud condensation nuclei (CCN) data (needed by the Thompson microphysics parameterization) to the experiment directory..." - cp_vrfy "$FIXgsd/CCN_ACTIVATE.BIN" "$EXPTDIR" + cp_vrfy "${FIXgsm}/CCN_ACTIVATE.BIN" "$EXPTDIR" fi fi @@ -599,7 +599,7 @@ fi if [ ! -e "${FV3_EXEC_FP}" ] || \ [ "${exec_fp}" -nt "${FV3_EXEC_FP}" ]; then print_info_msg "$VERBOSE" " -Copying the FV3SAR executable (exec_fp) to the executables directory +Copying the FV3-LAM executable (exec_fp) to the executables directory (EXECDIR): exec_fp = \"${exec_fp}\" EXECDIR = \"$EXECDIR\"" @@ -610,7 +610,7 @@ fi # #----------------------------------------------------------------------- # -# Set parameters in the FV3SAR namelist file. +# Set parameters in the FV3-LAM namelist file. # #----------------------------------------------------------------------- # @@ -619,7 +619,7 @@ Setting parameters in FV3 namelist file (FV3_NML_FP): FV3_NML_FP = \"${FV3_NML_FP}\"" # # Set npx and npy, which are just NX plus 1 and NY plus 1, respectively. -# These need to be set in the FV3SAR Fortran namelist file. They represent +# These need to be set in the FV3-LAM Fortran namelist file. They represent # the number of cell vertices in the x and y directions on the regional # grid. # @@ -672,9 +672,9 @@ settings="\ 'target_lat': ${LAT_CTR}, # # Question: -# For a JPgrid type grid, what should stretch_fac be set to? This depends +# For a ESGgrid type grid, what should stretch_fac be set to? This depends # on how the FV3 code uses the stretch_fac parameter in the namelist file. -# Recall that for a JPgrid, it gets set in the function set_gridparams_JPgrid(.sh) +# Recall that for a ESGgrid, it gets set in the function set_gridparams_ESGgrid(.sh) # to something like 0.9999, but is it ok to set it to that here in the # FV3 namelist file? # @@ -803,7 +803,7 @@ $settings" # If not running the MAKE_GRID_TN task (which implies the workflow will # use pregenerated grid files), set the namelist variables specifying # the paths to surface climatology files. These files are located in -# (or have symlinks that point to them) in the FIXsar directory. +# (or have symlinks that point to them) in the FIXLAM directory. # # Note that if running the MAKE_GRID_TN task, this action usually cannot # be performed here but must be performed in that task because the names @@ -922,7 +922,7 @@ For automatic resubmission of the workflow (say every 3 minutes), the following line can be added to the user's crontab (use \"crontab -e\" to edit the cron table): -*/3 * * * * cd $EXPTDIR && ./launch_FV3SAR_wflow.sh +*/3 * * * * cd $EXPTDIR && ./launch_FV3LAM_wflow.sh Done. " @@ -983,11 +983,11 @@ rm -f "${tmp_fp}" # Set the name of and full path to the log file in which the output from # the experiment/workflow generation function will be saved. # -log_fn="log.generate_FV3SAR_wflow" +log_fn="log.generate_FV3LAM_wflow" log_fp="$ushdir/${log_fn}" rm -f "${log_fp}" # -# Call the generate_FV3SAR_wflow function defined above to generate the +# Call the generate_FV3LAM_wflow function defined above to generate the # experiment/workflow. Note that we pipe the output of the function # (and possibly other commands) to the "tee" command in order to be able # to both save it to a file and print it out to the screen (stdout). @@ -1000,7 +1000,7 @@ rm -f "${log_fp}" # temporary file and read them in outside the subshell later below. # { -generate_FV3SAR_wflow 2>&1 # If this exits with an error, the whole {...} group quits, so things don't work... +generate_FV3LAM_wflow 2>&1 # If this exits with an error, the whole {...} group quits, so things don't work... retval=$? echo "$EXPTDIR" >> "${tmp_fp}" echo "$retval" >> "${tmp_fp}" @@ -1008,8 +1008,8 @@ echo "$retval" >> "${tmp_fp}" # # Read in experiment/workflow variables needed later below from the tem- # porary file created in the subshell above containing the call to the -# generate_FV3SAR_wflow function. These variables are not directly -# available here because the call to generate_FV3SAR_wflow above takes +# generate_FV3LAM_wflow function. These variables are not directly +# available here because the call to generate_FV3LAM_wflow above takes # place in a subshell (due to the fact that we are then piping its out- # put to the "tee" command). Then remove the temporary file. # @@ -1017,14 +1017,14 @@ exptdir=$( sed "1q;d" "${tmp_fp}" ) retval=$( sed "2q;d" "${tmp_fp}" ) rm "${tmp_fp}" # -# If the call to the generate_FV3SAR_wflow function above was success- +# If the call to the generate_FV3LAM_wflow function above was success- # ful, move the log file in which the "tee" command saved the output of # the function to the experiment directory. # if [ $retval -eq 0 ]; then mv "${log_fp}" "$exptdir" # -# If the call to the generate_FV3SAR_wflow function above was not suc- +# If the call to the generate_FV3LAM_wflow function above was not suc- # cessful, print out an error message and exit with a nonzero return # code. # diff --git a/ush/get_extrn_mdl_file_dir_info.sh b/ush/get_extrn_mdl_file_dir_info.sh index 29099ce19..f9ce609bc 100755 --- a/ush/get_extrn_mdl_file_dir_info.sh +++ b/ush/get_extrn_mdl_file_dir_info.sh @@ -60,7 +60,7 @@ function get_extrn_mdl_file_dir_info() { local valid_args=( \ "extrn_mdl_name" \ "anl_or_fcst" \ - "cdate_FV3SAR" \ + "cdate_FV3LAM" \ "time_offset_hrs" \ "varname_extrn_mdl_cdate" \ "varname_extrn_mdl_lbc_spec_fhrs" \ @@ -105,7 +105,7 @@ Usage: ${func_name} \ extrn_mdl_name \ anl_or_fcst \ - cdate_FV3SAR \ + cdate_FV3LAM \ time_offset_hrs \ varname_extrn_mdl_cdate \ varname_extrn_mdl_lbc_spec_fhrs \ @@ -121,13 +121,13 @@ where the arguments are defined as follows: extrn_mdl_name: Name of the external model, i.e. the name of the model providing the fields from which files containing initial conditions, surface fields, - and/or lateral boundary conditions for the FV3SAR will be generated. + and/or lateral boundary conditions for the FV3-LAM will be generated. anl_or_fcst: Flag that specifies whether the external model files we are interested in obtaining are analysis or forecast files. - cdate_FV3SAR: + cdate_FV3LAM: The cycle date and time (hours only) for which we want to obtain file and directory information. This has the form YYYYMMDDHH, where YYYY is the four-digit starting year of the cycle, MM is the two-digit @@ -137,15 +137,15 @@ where the arguments are defined as follows: time_offset_hrs: The number of hours by which to shift back in time the start time of the external model forecast from the specified cycle start time of the - FV3SAR (cdate_FV3SAR). When getting directory and file information on + FV3-LAM (cdate_FV3LAM). When getting directory and file information on external model analysis files, this is normally set to 0. When get- ting directory and file information on external model forecast files, this may be set to a nonzero value to obtain information for an exter- - nal model run that started time_offset_hrs hours before cdate_FV3SAR - (instead of exactly at cdate_FV3SAR). Note that in this case, the + nal model run that started time_offset_hrs hours before cdate_FV3LAM + (instead of exactly at cdate_FV3LAM). Note that in this case, the forecast hours (relative to the external model run's start time) at which the lateral boundary conditions will be updated must be shifted - forward by time_offset_hrs hours relative to those for the FV3SAR in + forward by time_offset_hrs hours relative to those for the FV3-LAM in order to make up for the backward-in-time shift in the starting time of the external model. @@ -156,9 +156,9 @@ where the arguments are defined as follows: varname_extrn_mdl_lbc_spec_fhrs: Name of the global variable that will contain the forecast hours (re- lative to the starting time of the external model run, which is earli- - er than that of the FV3SAR by time_offset_hrs hours) at which lateral + er than that of the FV3-LAM by time_offset_hrs hours) at which lateral boundary condition (LBC) output files are obtained from the external - model (and will be used to update the LBCs of the FV3SAR). + model (and will be used to update the LBCs of the FV3-LAM). varname_extrn_mdl_fns: Name of the global variable that will contain the names of the exter- @@ -219,20 +219,20 @@ fi # #----------------------------------------------------------------------- # -# Extract from cdate_FV3SAR the starting year, month, day, and hour of -# the FV3SAR cycle. Then subtract the temporal offset specified in -# time_offset_hrs (assumed to be given in units of hours) from cdate_FV3SAR +# Extract from cdate_FV3LAM the starting year, month, day, and hour of +# the FV3-LAM cycle. Then subtract the temporal offset specified in +# time_offset_hrs (assumed to be given in units of hours) from cdate_FV3LAM # to obtain the starting date and time of the external model, express the # result in YYYYMMDDHH format, and save it in cdate. This is the starting # time of the external model forecast. # #----------------------------------------------------------------------- # - yyyy=${cdate_FV3SAR:0:4} - mm=${cdate_FV3SAR:4:2} - dd=${cdate_FV3SAR:6:2} - hh=${cdate_FV3SAR:8:2} - yyyymmdd=${cdate_FV3SAR:0:8} + yyyy=${cdate_FV3LAM:0:4} + mm=${cdate_FV3LAM:4:2} + dd=${cdate_FV3LAM:6:2} + hh=${cdate_FV3LAM:8:2} + yyyymmdd=${cdate_FV3LAM:0:8} cdate=$( date --utc --date "${yyyymmdd} ${hh} UTC - ${time_offset_hrs} hours" "+%Y%m%d%H" ) # @@ -701,8 +701,8 @@ has not been specified for this external model: "FV3GFS") if [ "${fv3gfs_file_fmt}" = "nemsio" ]; then - if [ "${cdate_FV3SAR}" -le "2019061206" ]; then - arcv_dir="/NCEPDEV/emc-global/5year/emc.glopara/WCOSS_C/Q2FY19/prfv3rt3/${cdate_FV3SAR}" + if [ "${cdate_FV3LAM}" -le "2019061206" ]; then + arcv_dir="/NCEPDEV/emc-global/5year/emc.glopara/WCOSS_C/Q2FY19/prfv3rt3/${cdate_FV3LAM}" arcv_fns="" else arcv_dir="/NCEPPROD/hpssprod/runhistory/rh${yyyy}/${yyyy}${mm}/${yyyymmdd}" diff --git a/ush/launch_FV3SAR_wflow.sh b/ush/launch_FV3LAM_wflow.sh similarity index 98% rename from ush/launch_FV3SAR_wflow.sh rename to ush/launch_FV3LAM_wflow.sh index db583d62d..0b5aba00b 100755 --- a/ush/launch_FV3SAR_wflow.sh +++ b/ush/launch_FV3LAM_wflow.sh @@ -36,28 +36,28 @@ scrfunc_dir=$( dirname "${scrfunc_fp}" ) # # 1) Call this script from the experiment directory: # > cd /path/to/experiment/directory -# > launch_FV3SAR_wflow.sh +# > launch_FV3LAM_wflow.sh # # 2) Call this script from the experiment directory but using "./" be- # fore the script name: # > cd /path/to/experiment/directory -# > ./launch_FV3SAR_wflow.sh +# > ./launch_FV3LAM_wflow.sh # # 3) Call this script from any directory using the absolute path to the # symlink in the experiment directory: -# > /path/to/experiment/directory/launch_FV3SAR_wflow.sh +# > /path/to/experiment/directory/launch_FV3LAM_wflow.sh # # 4) Call this script from a directory that is several levels up from # the experiment directory (but not necessarily at the root directo- # ry): # > cd /path/to -# > experiment/directory/launch_FV3SAR_wflow.sh +# > experiment/directory/launch_FV3LAM_wflow.sh # # Note that given just a file name, e.g. the name of this script without # any path before it, the "dirname" command will return a ".", e.g. in # bash, # -# > exptdir=$( dirname "launch_FV3SAR_wflow.sh" ) +# > exptdir=$( dirname "launch_FV3LAM_wflow.sh" ) # > echo $exptdir # # will print out ".". diff --git a/ush/link_fix.sh b/ush/link_fix.sh index e07cee411..a3996a1d0 100755 --- a/ush/link_fix.sh +++ b/ush/link_fix.sh @@ -106,7 +106,7 @@ function link_fix() { # #----------------------------------------------------------------------- # -# Create symlinks in the FIXsar directory pointing to the grid files. +# Create symlinks in the FIXLAM directory pointing to the grid files. # These symlinks are needed by the make_orog, make_sfc_climo, make_ic, # make_lbc, and/or run_fcst tasks. # @@ -118,7 +118,7 @@ function link_fix() { #----------------------------------------------------------------------- # print_info_msg "$verbose" " -Creating links in the FIXsar directory to the grid files..." +Creating links in the FIXLAM directory to the grid files..." # #----------------------------------------------------------------------- # @@ -127,7 +127,7 @@ Creating links in the FIXsar directory to the grid files..." # # # For grid files (i.e. file_group set to "grid"), symlinks are created -# in the FIXsar directory to files (of the same names) in the GRID_DIR. +# in the FIXLAM directory to files (of the same names) in the GRID_DIR. # These symlinks/files and the reason each is needed is listed below: # # 1) "C*.mosaic.halo${NHW}.nc" @@ -336,17 +336,17 @@ Please ensure that all files have the same resolution." #----------------------------------------------------------------------- # # In creating the various symlinks below, it is convenient to work in -# the FIXsar directory. We will change directory back to the original +# the FIXLAM directory. We will change directory back to the original # later below. # #----------------------------------------------------------------------- # - cd_vrfy "$FIXsar" + cd_vrfy "$FIXLAM" # #----------------------------------------------------------------------- # # Use the set of full file paths generated above as the link targets to -# create symlinks to these files in the FIXsar directory. +# create symlinks to these files in the FIXLAM directory. # #----------------------------------------------------------------------- # @@ -392,8 +392,8 @@ Cannot create symlink because target file (fp) does not exist: else print_err_msg_exit "\ Cannot create symlink because the target file (target) in the directory -specified by FIXsar does not exist: - FIXsar = \"${FIXsar}\" +specified by FIXLAM does not exist: + FIXLAM = \"${FIXLAM}\" target = \"${target}\"" fi # @@ -418,8 +418,8 @@ specified by FIXsar does not exist: else print_err_msg_exit "\ Cannot create symlink because the target file (target) in the directory -specified by FIXsar does not exist: - FIXsar = \"${FIXsar}\" +specified by FIXLAM does not exist: + FIXLAM = \"${FIXLAM}\" target = \"${target}\"" fi @@ -455,7 +455,7 @@ Cannot create symlink because target file (target) does not exist: done # # In order to be able to specify the surface climatology file names in -# the forecast model's namelist file, in the FIXsar directory a symlink +# the forecast model's namelist file, in the FIXLAM directory a symlink # must be created for each surface climatology field that has "tile1" in # its name (and no "halo") and which points to the corresponding "tile7.halo0" # file. diff --git a/ush/load_modules_run_task.sh b/ush/load_modules_run_task.sh index 9e2caccff..16de7ee46 100755 --- a/ush/load_modules_run_task.sh +++ b/ush/load_modules_run_task.sh @@ -153,7 +153,7 @@ jjob_fp="$2" # and loads modules. # # The regional_workflow repository contains module files for all the -# workflow tasks in the template rocoto XML file for the FV3SAR work- +# workflow tasks in the template rocoto XML file for the FV3-LAM work- # flow. The full path to a module file for a given task is # # $HOMErrfs/modulefiles/$machine/${task_name} diff --git a/ush/set_FV3nml_sfc_climo_filenames.sh b/ush/set_FV3nml_sfc_climo_filenames.sh index d79a333cb..2d44a9d0c 100644 --- a/ush/set_FV3nml_sfc_climo_filenames.sh +++ b/ush/set_FV3nml_sfc_climo_filenames.sh @@ -3,10 +3,10 @@ # # This file defines a function that sets the values of the variables in # the forecast model's namelist file that specify the paths to the surface -# climatology files on the FV3SAR native grid (which are either pregenerated +# climatology files on the FV3LAM native grid (which are either pregenerated # or created by the MAKE_SFC_CLIMO_TN task). Note that the workflow # generation scripts create symlinks to these surface climatology files -# in the FIXsar directory, and the values in the namelist file that get +# in the FIXLAM directory, and the values in the namelist file that get # set by this function are relative or full paths to these links. # #----------------------------------------------------------------------- @@ -156,7 +156,7 @@ for (( i=0; i<${num_nml_vars}; i++ )); do # # Set the full path to the surface climatology file. # - fp="${FIXsar}/${CRES}.${sfc_climo_field_name}.$suffix" + fp="${FIXLAM}/${CRES}.${sfc_climo_field_name}.$suffix" # # If not in NCO mode, for portability and brevity change fp so that it # is a relative path (relative to any cycle directory immediately under diff --git a/ush/set_extrn_mdl_params.sh b/ush/set_extrn_mdl_params.sh index 39f299eef..fac2e50bc 100644 --- a/ush/set_extrn_mdl_params.sh +++ b/ush/set_extrn_mdl_params.sh @@ -34,7 +34,7 @@ local func_name="${FUNCNAME[0]}" # Set the system directory (i.e. location on disk, not on HPSS) in which # the files generated by the external model specified by EXTRN_MDL_- # NAME_ICS that are necessary for generating initial condition (IC) -# and surface files for the FV3SAR are stored (usually for a limited +# and surface files for the FV3-LAM are stored (usually for a limited # time, e.g. for the GFS external model, 2 weeks on WCOSS and 2 days on # theia). If for a given cycle these files are available in this system # directory, they will be copied over to a subdirectory within the cy- @@ -192,7 +192,7 @@ esac # Set the system directory (i.e. location on disk, not on HPSS) in which # the files generated by the external model specified by EXTRN_MDL_- # NAME_LBCS that are necessary for generating lateral boundary condition -# (LBC) files for the FV3SAR are stored (usually for a limited time, +# (LBC) files for the FV3-LAM are stored (usually for a limited time, # e.g. for the GFS external model, 2 weeks on WCOSS and 2 days on the- # ia). If for a given cycle these files are available in this system # directory, they will be copied over to a subdirectory within the cy- diff --git a/ush/set_gridparams_JPgrid.sh b/ush/set_gridparams_ESGgrid.sh similarity index 96% rename from ush/set_gridparams_JPgrid.sh rename to ush/set_gridparams_ESGgrid.sh index c8c52d425..669efb771 100644 --- a/ush/set_gridparams_JPgrid.sh +++ b/ush/set_gridparams_ESGgrid.sh @@ -2,12 +2,12 @@ #----------------------------------------------------------------------- # # This file defines and then calls a function that sets the parameters -# for a grid that is to be generated using the "JPgrid" grid generation -# method (i.e. GRID_GEN_METHOD set to "JPgrid"). +# for a grid that is to be generated using the "ESGgrid" grid generation +# method (i.e. GRID_GEN_METHOD set to "ESGgrid"). # #----------------------------------------------------------------------- # -function set_gridparams_JPgrid() { +function set_gridparams_ESGgrid() { # #----------------------------------------------------------------------- # @@ -103,7 +103,7 @@ function set_gridparams_JPgrid() { # #----------------------------------------------------------------------- # -# For a JPgrid-type grid, the orography filtering is performed by pass- +# For a ESGgrid-type grid, the orography filtering is performed by pass- # ing to the orography filtering the parameters for an "equivalent" glo- # bal uniform cubed-sphere grid. These are the parameters that a global # uniform cubed-sphere grid needs to have in order to have a nominal diff --git a/ush/set_gridparams_GFDLgrid.sh b/ush/set_gridparams_GFDLgrid.sh index 2eb4ed210..7d47affb1 100644 --- a/ush/set_gridparams_GFDLgrid.sh +++ b/ush/set_gridparams_GFDLgrid.sh @@ -255,7 +255,7 @@ fi # denote these limits. The reason we include "_wide_halo" in these va- # riable names is that the halo of the grid that we will first generate # will be wider than the halos that are actually needed as inputs to the -# FV3SAR model (i.e. the 0-cell-wide, 3-cell-wide, and 4-cell-wide halos +# FV3LAM model (i.e. the 0-cell-wide, 3-cell-wide, and 4-cell-wide halos # described above). We will generate the grids with narrower halos that # the model needs later on by "shaving" layers of cells from this wide- # halo grid. Next, we describe how to calculate the above indices. diff --git a/ush/set_predef_grid_params.sh b/ush/set_predef_grid_params.sh index 55a162cd6..b9e435efc 100644 --- a/ush/set_predef_grid_params.sh +++ b/ush/set_predef_grid_params.sh @@ -90,18 +90,18 @@ predefined domain: PREDEF_GRID_NAME = \"${PREDEF_GRID_NAME}\" GRID_GEN_METHOD = \"${GRID_GEN_METHOD}\"" - elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then + elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then - JPgrid_LON_CTR=-62.0 - JPgrid_LAT_CTR=22.0 + ESGgrid_LON_CTR=-62.0 + ESGgrid_LAT_CTR=22.0 - JPgrid_DELX="3000.0" - JPgrid_DELY="3000.0" + ESGgrid_DELX="3000.0" + ESGgrid_DELY="3000.0" - JPgrid_NX=2880 - JPgrid_NY=1920 + ESGgrid_NX=2880 + ESGgrid_NY=1920 - JPgrid_WIDE_HALO_WIDTH=6 + ESGgrid_WIDE_HALO_WIDTH=6 DT_ATMOS="40" @@ -113,7 +113,7 @@ predefined domain: WRTCMP_write_groups="1" WRTCMP_write_tasks_per_group="32" WRTCMP_output_grid="regional_latlon" - WRTCMP_cen_lon="${JPgrid_LON_CTR}" + WRTCMP_cen_lon="${ESGgrid_LON_CTR}" WRTCMP_cen_lat="25.0" WRTCMP_lon_lwr_left="-114.5" WRTCMP_lat_lwr_left="-5.0" @@ -142,18 +142,18 @@ predefined domain: PREDEF_GRID_NAME = \"${PREDEF_GRID_NAME}\" GRID_GEN_METHOD = \"${GRID_GEN_METHOD}\"" - elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then + elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then - JPgrid_LON_CTR=-62.0 - JPgrid_LAT_CTR=22.0 + ESGgrid_LON_CTR=-62.0 + ESGgrid_LAT_CTR=22.0 - JPgrid_DELX="13000.0" - JPgrid_DELY="13000.0" + ESGgrid_DELX="13000.0" + ESGgrid_DELY="13000.0" - JPgrid_NX=665 - JPgrid_NY=444 + ESGgrid_NX=665 + ESGgrid_NY=444 - JPgrid_WIDE_HALO_WIDTH=6 + ESGgrid_WIDE_HALO_WIDTH=6 DT_ATMOS="180" @@ -165,7 +165,7 @@ predefined domain: WRTCMP_write_groups="1" WRTCMP_write_tasks_per_group="32" WRTCMP_output_grid="regional_latlon" - WRTCMP_cen_lon="${JPgrid_LON_CTR}" + WRTCMP_cen_lon="${ESGgrid_LON_CTR}" WRTCMP_cen_lat="25.0" WRTCMP_lon_lwr_left="-114.5" WRTCMP_lat_lwr_left="-5.0" @@ -194,18 +194,18 @@ predefined domain: PREDEF_GRID_NAME = \"${PREDEF_GRID_NAME}\" GRID_GEN_METHOD = \"${GRID_GEN_METHOD}\"" - elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then + elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then - JPgrid_LON_CTR=-62.0 - JPgrid_LAT_CTR=22.0 + ESGgrid_LON_CTR=-62.0 + ESGgrid_LAT_CTR=22.0 - JPgrid_DELX="25000.0" - JPgrid_DELY="25000.0" + ESGgrid_DELX="25000.0" + ESGgrid_DELY="25000.0" - JPgrid_NX=345 - JPgrid_NY=230 + ESGgrid_NX=345 + ESGgrid_NY=230 - JPgrid_WIDE_HALO_WIDTH=6 + ESGgrid_WIDE_HALO_WIDTH=6 DT_ATMOS="300" @@ -217,7 +217,7 @@ predefined domain: WRTCMP_write_groups="1" WRTCMP_write_tasks_per_group="32" WRTCMP_output_grid="regional_latlon" - WRTCMP_cen_lon="${JPgrid_LON_CTR}" + WRTCMP_cen_lon="${ESGgrid_LON_CTR}" WRTCMP_cen_lat="25.0" WRTCMP_lon_lwr_left="-114.5" WRTCMP_lat_lwr_left="-5.0" @@ -280,18 +280,18 @@ predefined domain: WRTCMP_dlat="0.121833" fi - elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then + elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then - JPgrid_LON_CTR=-106.0 - JPgrid_LAT_CTR=54.0 + ESGgrid_LON_CTR=-106.0 + ESGgrid_LAT_CTR=54.0 - JPgrid_DELX="13000.0" - JPgrid_DELY="13000.0" + ESGgrid_DELX="13000.0" + ESGgrid_DELY="13000.0" - JPgrid_NX=960 - JPgrid_NY=960 + ESGgrid_NX=960 + ESGgrid_NY=960 - JPgrid_WIDE_HALO_WIDTH=6 + ESGgrid_WIDE_HALO_WIDTH=6 DT_ATMOS="50" @@ -303,8 +303,8 @@ predefined domain: WRTCMP_write_groups="1" WRTCMP_write_tasks_per_group="16" WRTCMP_output_grid="rotated_latlon" - WRTCMP_cen_lon="${JPgrid_LON_CTR}" - WRTCMP_cen_lat="${JPgrid_LAT_CTR}" + WRTCMP_cen_lon="${ESGgrid_LON_CTR}" + WRTCMP_cen_lat="${ESGgrid_LAT_CTR}" WRTCMP_lon_lwr_left="-57.9926" WRTCMP_lat_lwr_left="-50.74344" WRTCMP_lon_upr_rght="57.99249" @@ -332,18 +332,18 @@ predefined domain: PREDEF_GRID_NAME = \"${PREDEF_GRID_NAME}\" GRID_GEN_METHOD = \"${GRID_GEN_METHOD}\"" - elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then + elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then - JPgrid_LON_CTR=-97.5 - JPgrid_LAT_CTR=38.5 + ESGgrid_LON_CTR=-97.5 + ESGgrid_LAT_CTR=38.5 - JPgrid_DELX="25000.0" - JPgrid_DELY="25000.0" + ESGgrid_DELX="25000.0" + ESGgrid_DELY="25000.0" - JPgrid_NX=200 - JPgrid_NY=110 + ESGgrid_NX=200 + ESGgrid_NY=110 - JPgrid_WIDE_HALO_WIDTH=6 + ESGgrid_WIDE_HALO_WIDTH=6 DT_ATMOS="300" @@ -355,16 +355,16 @@ predefined domain: WRTCMP_write_groups="1" WRTCMP_write_tasks_per_group="2" WRTCMP_output_grid="lambert_conformal" - WRTCMP_cen_lon="${JPgrid_LON_CTR}" - WRTCMP_cen_lat="${JPgrid_LAT_CTR}" - WRTCMP_stdlat1="${JPgrid_LAT_CTR}" - WRTCMP_stdlat2="${JPgrid_LAT_CTR}" + WRTCMP_cen_lon="${ESGgrid_LON_CTR}" + WRTCMP_cen_lat="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat1="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat2="${ESGgrid_LAT_CTR}" WRTCMP_nx="191" WRTCMP_ny="97" WRTCMP_lon_lwr_left="-120.72962370" WRTCMP_lat_lwr_left="25.11648583" - WRTCMP_dx="${JPgrid_DELX}" - WRTCMP_dy="${JPgrid_DELY}" + WRTCMP_dx="${ESGgrid_DELX}" + WRTCMP_dy="${ESGgrid_DELY}" fi fi @@ -386,18 +386,18 @@ predefined domain: PREDEF_GRID_NAME = \"${PREDEF_GRID_NAME}\" GRID_GEN_METHOD = \"${GRID_GEN_METHOD}\"" - elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then + elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then - JPgrid_LON_CTR=-97.5 - JPgrid_LAT_CTR=38.5 + ESGgrid_LON_CTR=-97.5 + ESGgrid_LAT_CTR=38.5 - JPgrid_DELX="13000.0" - JPgrid_DELY="13000.0" + ESGgrid_DELX="13000.0" + ESGgrid_DELY="13000.0" - JPgrid_NX=390 - JPgrid_NY=210 + ESGgrid_NX=390 + ESGgrid_NY=210 - JPgrid_WIDE_HALO_WIDTH=6 + ESGgrid_WIDE_HALO_WIDTH=6 DT_ATMOS="180" @@ -409,16 +409,16 @@ predefined domain: WRTCMP_write_groups="1" WRTCMP_write_tasks_per_group="10" WRTCMP_output_grid="lambert_conformal" - WRTCMP_cen_lon="${JPgrid_LON_CTR}" - WRTCMP_cen_lat="${JPgrid_LAT_CTR}" - WRTCMP_stdlat1="${JPgrid_LAT_CTR}" - WRTCMP_stdlat2="${JPgrid_LAT_CTR}" + WRTCMP_cen_lon="${ESGgrid_LON_CTR}" + WRTCMP_cen_lat="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat1="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat2="${ESGgrid_LAT_CTR}" WRTCMP_nx="383" WRTCMP_ny="195" WRTCMP_lon_lwr_left="-121.58647982" WRTCMP_lat_lwr_left="24.36006861" - WRTCMP_dx="${JPgrid_DELX}" - WRTCMP_dy="${JPgrid_DELY}" + WRTCMP_dx="${ESGgrid_DELX}" + WRTCMP_dy="${ESGgrid_DELY}" fi fi @@ -482,18 +482,18 @@ predefined domain: WRTCMP_dy="3000.0" fi - elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then + elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then - JPgrid_LON_CTR=-97.5 - JPgrid_LAT_CTR=38.5 + ESGgrid_LON_CTR=-97.5 + ESGgrid_LAT_CTR=38.5 - JPgrid_DELX="3000.0" - JPgrid_DELY="3000.0" + ESGgrid_DELX="3000.0" + ESGgrid_DELY="3000.0" - JPgrid_NX=1734 - JPgrid_NY=1008 + ESGgrid_NX=1734 + ESGgrid_NY=1008 - JPgrid_WIDE_HALO_WIDTH=6 + ESGgrid_WIDE_HALO_WIDTH=6 DT_ATMOS="40" @@ -505,16 +505,16 @@ predefined domain: WRTCMP_write_groups="1" WRTCMP_write_tasks_per_group="24" WRTCMP_output_grid="lambert_conformal" - WRTCMP_cen_lon="${JPgrid_LON_CTR}" - WRTCMP_cen_lat="${JPgrid_LAT_CTR}" - WRTCMP_stdlat1="${JPgrid_LAT_CTR}" - WRTCMP_stdlat2="${JPgrid_LAT_CTR}" + WRTCMP_cen_lon="${ESGgrid_LON_CTR}" + WRTCMP_cen_lat="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat1="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat2="${ESGgrid_LAT_CTR}" WRTCMP_nx="1738" WRTCMP_ny="974" WRTCMP_lon_lwr_left="-122.21414225" WRTCMP_lat_lwr_left="22.41403305" - WRTCMP_dx="${JPgrid_DELX}" - WRTCMP_dy="${JPgrid_DELY}" + WRTCMP_dx="${ESGgrid_DELX}" + WRTCMP_dy="${ESGgrid_DELY}" fi fi @@ -571,18 +571,18 @@ predefined domain: WRTCMP_dlat="0.02" fi - elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then + elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then - JPgrid_LON_CTR=-97.5 - JPgrid_LAT_CTR=38.5 + ESGgrid_LON_CTR=-97.5 + ESGgrid_LAT_CTR=38.5 - JPgrid_DELX="3000.0" - JPgrid_DELY="3000.0" + ESGgrid_DELX="3000.0" + ESGgrid_DELY="3000.0" - JPgrid_NX=960 - JPgrid_NY=960 + ESGgrid_NX=960 + ESGgrid_NY=960 - JPgrid_WIDE_HALO_WIDTH=6 + ESGgrid_WIDE_HALO_WIDTH=6 fi ;; @@ -641,7 +641,7 @@ predefined domain: WRTCMP_dlat="0.24" fi - elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then + elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then print_err_msg_exit "\ The parameters for a \"${GRID_GEN_METHOD}\" type grid have not yet been specified for this @@ -731,28 +731,28 @@ predefined domain: WRTCMP_write_tasks_per_group="24" BLOCKSIZE=32 - elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then + elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then # Values taken from pre-generated files in /scratch4/NCEPDEV/fv3-cam/save/Benjamin.Blake/regional_workflow/fix/fix_sar # With move to Hera, those files were lost; a backup can be found here: /scratch2/BMC/det/kavulich/fix/fix_sar # Longitude and latitude for center of domain - JPgrid_LON_CTR=-153.0 - JPgrid_LAT_CTR=61.0 + ESGgrid_LON_CTR=-153.0 + ESGgrid_LAT_CTR=61.0 # Projected grid spacing in meters...in the static files (e.g. "C768_grid.tile7.nc"), the "dx" is actually the resolution # of the supergrid, which is HALF of this dx - JPgrid_DELX="3000.0" - JPgrid_DELY="3000.0" + ESGgrid_DELX="3000.0" + ESGgrid_DELY="3000.0" # Number of x and y points for your domain (halo not included); # Divide "supergrid" values from /scratch2/BMC/det/kavulich/fix/fix_sar/ak/C768_grid.tile7.halo4.nc by 2 and subtract 8 to eliminate halo - JPgrid_NX=1344 # Supergrid value 2704 - JPgrid_NY=1152 # Supergrid value 2320 + ESGgrid_NX=1344 # Supergrid value 2704 + ESGgrid_NY=1152 # Supergrid value 2320 # Number of halo points for a wide grid (before trimming)...this should almost always be 6 for now # Within the model we actually have a 4-point halo and a 3-point halo - JPgrid_WIDE_HALO_WIDTH=6 + ESGgrid_WIDE_HALO_WIDTH=6 # Side note: FV3 is lagrangian and vertical coordinates are dynamically remapped during model integration # 'ksplit' is the factor that determines the timestep for this process (divided @@ -765,7 +765,7 @@ predefined domain: DT_ATMOS="18" -#Factors for MPI decomposition. JPgrid_NX must be divisible by LAYOUT_X, JPgrid_NY must be divisible by LAYOUT_Y +#Factors for MPI decomposition. ESGgrid_NX must be divisible by LAYOUT_X, ESGgrid_NY must be divisible by LAYOUT_Y LAYOUT_X="28" LAYOUT_Y="16" @@ -784,18 +784,18 @@ predefined domain: #lambert_conformal or rotated_latlon. lambert_conformal not well tested and probably doesn't work for our purposes WRTCMP_output_grid="lambert_conformal" #These should always be set the same as compute grid - WRTCMP_cen_lon="${JPgrid_LON_CTR}" - WRTCMP_cen_lat="${JPgrid_LAT_CTR}" - WRTCMP_stdlat1="${JPgrid_LAT_CTR}" - WRTCMP_stdlat2="${JPgrid_LAT_CTR}" + WRTCMP_cen_lon="${ESGgrid_LON_CTR}" + WRTCMP_cen_lat="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat1="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat2="${ESGgrid_LAT_CTR}" #Write component grid must always be <= compute grid (without haloes) WRTCMP_nx="1344" WRTCMP_ny="1152" #Lower left latlon (southwest corner) WRTCMP_lon_lwr_left="-177.0" WRTCMP_lat_lwr_left="42.5" - WRTCMP_dx="$JPgrid_DELX" - WRTCMP_dy="$JPgrid_DELY" + WRTCMP_dx="$ESGgrid_DELX" + WRTCMP_dy="$ESGgrid_DELY" fi @@ -854,18 +854,18 @@ predefined domain: WRTCMP_dy="3000.0" fi - elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then + elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then - JPgrid_LON_CTR=-161.5 - JPgrid_LAT_CTR=63.0 + ESGgrid_LON_CTR=-161.5 + ESGgrid_LAT_CTR=63.0 - JPgrid_DELX="3000.0" - JPgrid_DELY="3000.0" + ESGgrid_DELX="3000.0" + ESGgrid_DELY="3000.0" - JPgrid_NX=1380 - JPgrid_NY=1020 + ESGgrid_NX=1380 + ESGgrid_NY=1020 - JPgrid_WIDE_HALO_WIDTH=6 + ESGgrid_WIDE_HALO_WIDTH=6 DT_ATMOS="50" @@ -877,16 +877,16 @@ predefined domain: WRTCMP_write_groups="1" WRTCMP_write_tasks_per_group="2" WRTCMP_output_grid="lambert_conformal" - WRTCMP_cen_lon="${JPgrid_LON_CTR}" - WRTCMP_cen_lat="${JPgrid_LAT_CTR}" - WRTCMP_stdlat1="${JPgrid_LAT_CTR}" - WRTCMP_stdlat2="${JPgrid_LAT_CTR}" + WRTCMP_cen_lon="${ESGgrid_LON_CTR}" + WRTCMP_cen_lat="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat1="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat2="${ESGgrid_LAT_CTR}" WRTCMP_nx="1320" WRTCMP_ny="950" WRTCMP_lon_lwr_left="173.734" WRTCMP_lat_lwr_left="46.740347" - WRTCMP_dx="${JPgrid_DELX}" - WRTCMP_dy="${JPgrid_DELY}" + WRTCMP_dx="${ESGgrid_DELX}" + WRTCMP_dy="${ESGgrid_DELY}" fi fi @@ -908,18 +908,18 @@ predefined domain: PREDEF_GRID_NAME = \"${PREDEF_GRID_NAME}\" GRID_GEN_METHOD = \"${GRID_GEN_METHOD}\" " - elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then + elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then - JPgrid_LON_CTR=-163.5 - JPgrid_LAT_CTR=62.8 + ESGgrid_LON_CTR=-163.5 + ESGgrid_LAT_CTR=62.8 - JPgrid_DELX="50000.0" - JPgrid_DELY="50000.0" + ESGgrid_DELX="50000.0" + ESGgrid_DELY="50000.0" - JPgrid_NX=74 - JPgrid_NY=51 + ESGgrid_NX=74 + ESGgrid_NY=51 - JPgrid_WIDE_HALO_WIDTH=6 + ESGgrid_WIDE_HALO_WIDTH=6 DT_ATMOS="600" @@ -931,16 +931,16 @@ predefined domain: WRTCMP_write_groups="1" WRTCMP_write_tasks_per_group="1" WRTCMP_output_grid="lambert_conformal" - WRTCMP_cen_lon="${JPgrid_LON_CTR}" - WRTCMP_cen_lat="${JPgrid_LAT_CTR}" - WRTCMP_stdlat1="${JPgrid_LAT_CTR}" - WRTCMP_stdlat2="${JPgrid_LAT_CTR}" + WRTCMP_cen_lon="${ESGgrid_LON_CTR}" + WRTCMP_cen_lat="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat1="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat2="${ESGgrid_LAT_CTR}" WRTCMP_nx="70" WRTCMP_ny="45" WRTCMP_lon_lwr_left="172.0" WRTCMP_lat_lwr_left="49.0" - WRTCMP_dx="${JPgrid_DELX}" - WRTCMP_dy="${JPgrid_DELY}" + WRTCMP_dx="${ESGgrid_DELX}" + WRTCMP_dy="${ESGgrid_DELY}" fi fi @@ -963,27 +963,27 @@ predefined domain: PREDEF_GRID_NAME = \"${PREDEF_GRID_NAME}\" GRID_GEN_METHOD = \"${GRID_GEN_METHOD}\"" - elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then + elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then # Values taken from pre-generated files in /scratch4/NCEPDEV/fv3-cam/save/Benjamin.Blake/regional_workflow/fix/fix_sar/hi/C768_grid.tile7.nc # With move to Hera, those files were lost; a backup can be found here: /scratch2/BMC/det/kavulich/fix/fix_sar # Longitude and latitude for center of domain - JPgrid_LON_CTR=-157.0 - JPgrid_LAT_CTR=20.0 + ESGgrid_LON_CTR=-157.0 + ESGgrid_LAT_CTR=20.0 # Projected grid spacing in meters...in the static files (e.g. "C768_grid.tile7.nc"), the "dx" is actually the resolution # of the supergrid, which is HALF of this dx (plus or minus some grid stretch factor) - JPgrid_DELX="3000.0" - JPgrid_DELY="3000.0" + ESGgrid_DELX="3000.0" + ESGgrid_DELY="3000.0" # Number of x and y points for your domain (halo not included); # Divide "supergrid" values from /scratch2/BMC/det/kavulich/fix/fix_sar/hi/C768_grid.tile7.halo4.nc by 2 and subtract 8 to eliminate halo - JPgrid_NX=432 # Supergrid value 880 - JPgrid_NY=360 # Supergrid value 736 + ESGgrid_NX=432 # Supergrid value 880 + ESGgrid_NY=360 # Supergrid value 736 # Number of halo points for a wide grid (before trimming)...this should almost always be 6 for now # Within the model we actually have a 4-point halo and a 3-point halo - JPgrid_WIDE_HALO_WIDTH=6 + ESGgrid_WIDE_HALO_WIDTH=6 # Side note: FV3 is lagrangian and vertical coordinates are dynamically remapped during model integration # 'ksplit' is the factor that determines the timestep for this process (divided @@ -996,7 +996,7 @@ predefined domain: DT_ATMOS="18" -#Factors for MPI decomposition. JPgrid_NX must be divisible by LAYOUT_X, JPgrid_NY must be divisible by LAYOUT_Y +#Factors for MPI decomposition. ESGgrid_NX must be divisible by LAYOUT_X, ESGgrid_NY must be divisible by LAYOUT_Y LAYOUT_X="8" LAYOUT_Y="8" #Take number of points on a tile (nx/lx*ny/ly), must divide by block size to get an integer. @@ -1014,19 +1014,19 @@ predefined domain: #lambert_conformal or rotated_latlon. lambert_conformal not well tested and probably doesn't work for our purposes WRTCMP_output_grid="lambert_conformal" #These should usually be set the same as compute grid - WRTCMP_cen_lon="${JPgrid_LON_CTR}" - WRTCMP_cen_lat="${JPgrid_LAT_CTR}" - WRTCMP_stdlat1="${JPgrid_LAT_CTR}" - WRTCMP_stdlat2="${JPgrid_LAT_CTR}" -#Write component grid should be close to the JPgrid values unless you are doing something weird + WRTCMP_cen_lon="${ESGgrid_LON_CTR}" + WRTCMP_cen_lat="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat1="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat2="${ESGgrid_LAT_CTR}" +#Write component grid should be close to the ESGgrid values unless you are doing something weird WRTCMP_nx="420" WRTCMP_ny="348" #Lower left latlon (southwest corner) WRTCMP_lon_lwr_left="-162.8" WRTCMP_lat_lwr_left="15.2" - WRTCMP_dx="$JPgrid_DELX" - WRTCMP_dy="$JPgrid_DELY" + WRTCMP_dx="$ESGgrid_DELX" + WRTCMP_dy="$ESGgrid_DELY" fi fi @@ -1050,27 +1050,27 @@ predefined domain: GRID_GEN_METHOD = \"${GRID_GEN_METHOD}\" " - elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then + elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then # Values taken from pre-generated files in /scratch4/NCEPDEV/fv3-cam/save/Benjamin.Blake/regional_workflow/fix/fix_sar/pr/C768_grid.tile7.nc # With move to Hera, those files were lost; a backup can be found here: /scratch2/BMC/det/kavulich/fix/fix_sar # Longitude and latitude for center of domain - JPgrid_LON_CTR=-69.0 - JPgrid_LAT_CTR=18.0 + ESGgrid_LON_CTR=-69.0 + ESGgrid_LAT_CTR=18.0 # Projected grid spacing in meters...in the static files (e.g. "C768_grid.tile7.nc"), the "dx" is actually the resolution # of the supergrid, which is HALF of this dx (plus or minus some grid stretch factor) - JPgrid_DELX="3000.0" - JPgrid_DELY="3000.0" + ESGgrid_DELX="3000.0" + ESGgrid_DELY="3000.0" # Number of x and y points for your domain (halo not included); # Divide "supergrid" values from /scratch2/BMC/det/kavulich/fix/fix_sar/pr/C768_grid.tile7.halo4.nc by 2 and subtract 8 to eliminate halo - JPgrid_NX=576 # Supergrid value 1168 - JPgrid_NY=432 # Supergrid value 880 + ESGgrid_NX=576 # Supergrid value 1168 + ESGgrid_NY=432 # Supergrid value 880 # Number of halo points for a wide grid (before trimming)...this should almost always be 6 for now # Within the model we actually have a 4-point halo and a 3-point halo - JPgrid_WIDE_HALO_WIDTH=6 + ESGgrid_WIDE_HALO_WIDTH=6 # Side note: FV3 is lagrangian and vertical coordinates are dynamically remapped during model integration # 'ksplit' is the factor that determines the timestep for this process (divided @@ -1083,7 +1083,7 @@ predefined domain: DT_ATMOS="18" -#Factors for MPI decomposition. JPgrid_NX must be divisible by LAYOUT_X, JPgrid_NY must be divisible by LAYOUT_Y +#Factors for MPI decomposition. ESGgrid_NX must be divisible by LAYOUT_X, ESGgrid_NY must be divisible by LAYOUT_Y LAYOUT_X="16" LAYOUT_Y="8" @@ -1102,18 +1102,18 @@ predefined domain: #lambert_conformal or rotated_latlon. lambert_conformal not well tested and probably doesn't work for our purposes WRTCMP_output_grid="lambert_conformal" #These should always be set the same as compute grid - WRTCMP_cen_lon="${JPgrid_LON_CTR}" - WRTCMP_cen_lat="${JPgrid_LAT_CTR}" - WRTCMP_stdlat1="${JPgrid_LAT_CTR}" - WRTCMP_stdlat2="${JPgrid_LAT_CTR}" + WRTCMP_cen_lon="${ESGgrid_LON_CTR}" + WRTCMP_cen_lat="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat1="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat2="${ESGgrid_LAT_CTR}" #Write component grid must always be <= compute grid (without haloes) WRTCMP_nx="576" WRTCMP_ny="432" #Lower left latlon (southwest corner) WRTCMP_lon_lwr_left="-77" WRTCMP_lat_lwr_left="12" - WRTCMP_dx="$JPgrid_DELX" - WRTCMP_dy="$JPgrid_DELY" + WRTCMP_dx="$ESGgrid_DELX" + WRTCMP_dy="$ESGgrid_DELY" fi fi @@ -1136,27 +1136,27 @@ predefined domain: GRID_GEN_METHOD = \"${GRID_GEN_METHOD}\" " - elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then + elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then # Values taken from pre-generated files in /scratch4/NCEPDEV/fv3-cam/save/Benjamin.Blake/regional_workflow/fix/fix_sar/guam/C768_grid.tile7.nc # With move to Hera, those files were lost; a backup can be found here: /scratch2/BMC/det/kavulich/fix/fix_sar # Longitude and latitude for center of domain - JPgrid_LON_CTR=146.0 - JPgrid_LAT_CTR=15.0 + ESGgrid_LON_CTR=146.0 + ESGgrid_LAT_CTR=15.0 # Projected grid spacing in meters...in the static files (e.g. "C768_grid.tile7.nc"), the "dx" is actually the resolution # of the supergrid, which is HALF of this dx (plus or minus some grid stretch factor) - JPgrid_DELX="3000.0" - JPgrid_DELY="3000.0" + ESGgrid_DELX="3000.0" + ESGgrid_DELY="3000.0" # Number of x and y points for your domain (halo not included); # Divide "supergrid" values from /scratch2/BMC/det/kavulich/fix/fix_sar/guam/C768_grid.tile7.halo4.nc by 2 and subtract 8 to eliminate halo - JPgrid_NX=432 # Supergrid value 880 - JPgrid_NY=360 # Supergrid value 736 + ESGgrid_NX=432 # Supergrid value 880 + ESGgrid_NY=360 # Supergrid value 736 # Number of halo points for a wide grid (before trimming)...this should almost always be 6 for now # Within the model we actually have a 4-point halo and a 3-point halo - JPgrid_WIDE_HALO_WIDTH=6 + ESGgrid_WIDE_HALO_WIDTH=6 # Side note: FV3 is lagrangian and vertical coordinates are dynamically remapped during model integration # 'ksplit' is the factor that determines the timestep for this process (divided @@ -1169,7 +1169,7 @@ predefined domain: DT_ATMOS="18" -#Factors for MPI decomposition. JPgrid_NX must be divisible by LAYOUT_X, JPgrid_NY must be divisible by LAYOUT_Y +#Factors for MPI decomposition. ESGgrid_NX must be divisible by LAYOUT_X, ESGgrid_NY must be divisible by LAYOUT_Y LAYOUT_X="16" LAYOUT_Y="12" #Take number of points on a tile (nx/lx*ny/ly), must divide by block size to get an integer. @@ -1187,18 +1187,18 @@ predefined domain: #lambert_conformal or rotated_latlon. lambert_conformal not well tested and probably doesn't work for our purposes WRTCMP_output_grid="lambert_conformal" #These should always be set the same as compute grid - WRTCMP_cen_lon="${JPgrid_LON_CTR}" - WRTCMP_cen_lat="${JPgrid_LAT_CTR}" - WRTCMP_stdlat1="${JPgrid_LAT_CTR}" - WRTCMP_stdlat2="${JPgrid_LAT_CTR}" + WRTCMP_cen_lon="${ESGgrid_LON_CTR}" + WRTCMP_cen_lat="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat1="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat2="${ESGgrid_LAT_CTR}" #Write component grid must always be <= compute grid (without haloes) WRTCMP_nx="420" WRTCMP_ny="348" #Lower left latlon (southwest corner) Used /scratch2/NCEPDEV/fv3-cam/Dusan.Jovic/dbrowse/fv3grid utility to find best value WRTCMP_lon_lwr_left="140" WRTCMP_lat_lwr_left="10" - WRTCMP_dx="$JPgrid_DELX" - WRTCMP_dy="$JPgrid_DELY" + WRTCMP_dx="$ESGgrid_DELX" + WRTCMP_dy="$ESGgrid_DELY" fi fi diff --git a/ush/setup.sh b/ush/setup.sh index 03a6cbd25..3ebc43be7 100755 --- a/ush/setup.sh +++ b/ush/setup.sh @@ -3,7 +3,7 @@ # # This file defines and then calls a function that sets a secondary set # of parameters needed by the various scripts that are called by the -# FV3SAR rocoto community workflow. This secondary set of parameters is +# FV3-LAM rocoto community workflow. This secondary set of parameters is # calculated using the primary set of user-defined parameters in the de- # fault and custom experiment/workflow configuration scripts (whose file # names are defined below). This script then saves both sets of parame- @@ -59,7 +59,7 @@ cd_vrfy ${scrfunc_dir} # . ./set_cycle_dates.sh . ./set_gridparams_GFDLgrid.sh -. ./set_gridparams_JPgrid.sh +. ./set_gridparams_ESGgrid.sh . ./link_fix.sh . ./set_ozone_param.sh # @@ -642,7 +642,7 @@ NUM_CYCLES="${#ALL_CDATES[@]}" # Set various directories. # # HOMErrfs: -# Top directory of the clone of the FV3SAR workflow git repository. +# Top directory of the clone of the FV3-LAM workflow git repository. # # USHDIR: # Directory containing the shell scripts called by the workflow. @@ -663,21 +663,14 @@ NUM_CYCLES="${#ALL_CDATES[@]}" # Directory containing various executable files. # # TEMPLATE_DIR: -# Directory in which templates of various FV3SAR input files are locat- +# Directory in which templates of various FV3-LAM input files are locat- # ed. # # UFS_WTHR_MDL_DIR: -# Directory in which the (NEMS-enabled) FV3SAR application is located. +# Directory in which the (NEMS-enabled) FV3-LAM application is located. # This directory includes subdirectories for FV3, NEMS, and FMS. If # USE_CCPP is set to "TRUE", it also includes a subdirectory for CCPP. # -# FIXupp: -# System directory from which to copy necessary fixed files for UPP. -# -# FIXgsd: -# System directory from which to copy GSD physics-associated fixed files -# needed when running CCPP. -# #----------------------------------------------------------------------- # @@ -700,8 +693,6 @@ PARMDIR="$HOMErrfs/parm" MODULES_DIR="$HOMErrfs/modulefiles" EXECDIR="${SR_WX_APP_TOP_DIR}/exec" FIXrrfs="$HOMErrfs/fix" -FIXupp="$FIXrrfs/fix_upp" -FIXgsd="$FIXrrfs/fix_gsd" TEMPLATE_DIR="$USHDIR/templates" case $MACHINE in @@ -737,8 +728,8 @@ case $MACHINE in ;; "JET") - FIXgsm=${FIXgsm:-"/lfs4/HFIP/gsd-fv3-hfip/FV3/fix/fix_am"} - TOPO_DIR=${TOPO_DIR:-"/lfs4/HFIP/gsd-fv3-hfip/FV3/fix/fix_orog"} + FIXgsm=${FIXgsm:-"/lfs4/HFIP/hfv3gfs/glopara/git/fv3gfs/fix/fix_am"} + TOPO_DIR=${TOPO_DIR:-"/lfs4/HFIP/hfv3gfs/glopara/git/fv3gfs/fix/fix_orog"} SFC_CLIMO_INPUT_DIR=${SFC_CLIMO_INPUT_DIR:-"/lfs1/HFIP/hwrf-data/git/fv3gfs/fix/fix_sfc_climo"} ;; @@ -985,12 +976,12 @@ check_for_preexist_dir_file "$EXPTDIR" "${PREEXISTING_DIR_METHOD}" # FIXam: # This is the directory that will contain the fixed files or symlinks to # the fixed files containing various fields on global grids (which are -# usually much coarser than the native FV3SAR grid). +# usually much coarser than the native FV3-LAM grid). # -# FIXsar: +# FIXLAM: # This is the directory that will contain the fixed files or symlinks to # the fixed files containing the grid, orography, and surface climatology -# on the native FV3SAR grid. +# on the native FV3-LAM grid. # # CYCLE_BASEDIR: # The base directory in which the directories for the various cycles will @@ -1046,24 +1037,24 @@ Please ensure that path_resolved is an existing directory and then rerun the experiment generation script." fi - FIXsar="${FIXrrfs}/fix_sar/${EMC_GRID_NAME}" + FIXLAM="${FIXrrfs}/fix_lam/${EMC_GRID_NAME}" # # In NCO mode (i.e. if RUN_ENVIR set to "nco"), it is assumed that before -# running the experiment generation script, the path specified in FIXsar +# running the experiment generation script, the path specified in FIXLAM # already exists and is either itself the directory in which the fixed # grid, orography, and surface climatology files are located, or it is a # symlink to such a directory. Resolve any symlinks in the path specified -# by FIXsar and check that this is the case. +# by FIXLAM and check that this is the case. # - path_resolved=$( readlink -m "$FIXsar" ) + path_resolved=$( readlink -m "$FIXLAM" ) if [ ! -d "${path_resolved}" ]; then print_err_msg_exit "\ In order to be able to generate a forecast experiment in NCO mode (i.e. -when RUN_ENVIR set to \"nco\"), the path specified by FIXsar after resolving +when RUN_ENVIR set to \"nco\"), the path specified by FIXLAM after resolving all symlinks (path_resolved) must be an existing directory (but in this case isn't): RUN_ENVIR = \"${RUN_ENVIR}\" - FIXsar = \"$FIXsar\" + FIXLAM = \"$FIXLAM\" path_resolved = \"${path_resolved}\" Please ensure that path_resolved is an existing directory and then rerun the experiment generation script." @@ -1080,7 +1071,7 @@ the experiment generation script." else FIXam="${EXPTDIR}/fix_am" - FIXsar="${EXPTDIR}/fix_sar" + FIXLAM="${EXPTDIR}/fix_lam" CYCLE_BASEDIR="$EXPTDIR" COMROOT="" COMOUT_BASEDIR="" @@ -1307,22 +1298,22 @@ if [ "${RUN_ENVIR}" = "nco" ]; then if [ "${RUN_TASK_MAKE_GRID}" = "TRUE" ] || \ [ "${RUN_TASK_MAKE_GRID}" = "FALSE" -a \ - "${GRID_DIR}" != "$FIXsar" ]; then + "${GRID_DIR}" != "$FIXLAM" ]; then msg=" When RUN_ENVIR is set to \"nco\", it is assumed that grid files already -exist in the directory specified by FIXsar. Thus, the grid file genera- +exist in the directory specified by FIXLAM. Thus, the grid file genera- tion task must not be run (i.e. RUN_TASK_MAKE_GRID must be set to FALSE), and the directory in which to look for the grid files (i.e. -GRID_DIR) must be set to FIXsar. Current values for these quantities +GRID_DIR) must be set to FIXLAM. Current values for these quantities are: RUN_TASK_MAKE_GRID = \"${RUN_TASK_MAKE_GRID}\" GRID_DIR = \"${GRID_DIR}\" Resetting RUN_TASK_MAKE_GRID to \"FALSE\" and GRID_DIR to the contents -of FIXsar. Reset values are:" +of FIXLAM. Reset values are:" RUN_TASK_MAKE_GRID="FALSE" - GRID_DIR="$FIXsar" + GRID_DIR="$FIXLAM" msg="$msg"" RUN_TASK_MAKE_GRID = \"${RUN_TASK_MAKE_GRID}\" @@ -1335,22 +1326,22 @@ of FIXsar. Reset values are:" if [ "${RUN_TASK_MAKE_OROG}" = "TRUE" ] || \ [ "${RUN_TASK_MAKE_OROG}" = "FALSE" -a \ - "${OROG_DIR}" != "$FIXsar" ]; then + "${OROG_DIR}" != "$FIXLAM" ]; then msg=" When RUN_ENVIR is set to \"nco\", it is assumed that orography files al- -ready exist in the directory specified by FIXsar. Thus, the orography +ready exist in the directory specified by FIXLAM. Thus, the orography file generation task must not be run (i.e. RUN_TASK_MAKE_OROG must be set to FALSE), and the directory in which to look for the orography -files (i.e. OROG_DIR) must be set to FIXsar. Current values for these +files (i.e. OROG_DIR) must be set to FIXLAM. Current values for these quantities are: RUN_TASK_MAKE_OROG = \"${RUN_TASK_MAKE_OROG}\" OROG_DIR = \"${OROG_DIR}\" Resetting RUN_TASK_MAKE_OROG to \"FALSE\" and OROG_DIR to the contents -of FIXsar. Reset values are:" +of FIXLAM. Reset values are:" RUN_TASK_MAKE_OROG="FALSE" - OROG_DIR="$FIXsar" + OROG_DIR="$FIXLAM" msg="$msg"" RUN_TASK_MAKE_OROG = \"${RUN_TASK_MAKE_OROG}\" @@ -1363,22 +1354,22 @@ of FIXsar. Reset values are:" if [ "${RUN_TASK_MAKE_SFC_CLIMO}" = "TRUE" ] || \ [ "${RUN_TASK_MAKE_SFC_CLIMO}" = "FALSE" -a \ - "${SFC_CLIMO_DIR}" != "$FIXsar" ]; then + "${SFC_CLIMO_DIR}" != "$FIXLAM" ]; then msg=" When RUN_ENVIR is set to \"nco\", it is assumed that surface climatology -files already exist in the directory specified by FIXsar. Thus, the +files already exist in the directory specified by FIXLAM. Thus, the surface climatology file generation task must not be run (i.e. RUN_- TASK_MAKE_SFC_CLIMO must be set to FALSE), and the directory in which to look for the surface climatology files (i.e. SFC_CLIMO_DIR) must be set -to FIXsar. Current values for these quantities are: +to FIXLAM. Current values for these quantities are: RUN_TASK_MAKE_SFC_CLIMO = \"${RUN_TASK_MAKE_SFC_CLIMO}\" SFC_CLIMO_DIR = \"${SFC_CLIMO_DIR}\" Resetting RUN_TASK_MAKE_SFC_CLIMO to \"FALSE\" and SFC_CLIMO_DIR to the -contents of FIXsar. Reset values are:" +contents of FIXLAM. Reset values are:" RUN_TASK_MAKE_SFC_CLIMO="FALSE" - SFC_CLIMO_DIR="$FIXsar" + SFC_CLIMO_DIR="$FIXLAM" msg="$msg"" RUN_TASK_MAKE_SFC_CLIMO = \"${RUN_TASK_MAKE_SFC_CLIMO}\" @@ -1463,7 +1454,7 @@ fi # err_msg="\ The external model specified in EXTRN_MDL_NAME_ICS that provides initial -conditions (ICs) and surface fields to the FV3SAR is not supported: +conditions (ICs) and surface fields to the FV3-LAM is not supported: EXTRN_MDL_NAME_ICS = \"${EXTRN_MDL_NAME_ICS}\"" check_var_valid_value \ "EXTRN_MDL_NAME_ICS" "valid_vals_EXTRN_MDL_NAME_ICS" "${err_msg}" @@ -1476,7 +1467,7 @@ check_var_valid_value \ # err_msg="\ The external model specified in EXTRN_MDL_NAME_ICS that provides lateral -boundary conditions (LBCs) to the FV3SAR is not supported: +boundary conditions (LBCs) to the FV3-LAM is not supported: EXTRN_MDL_NAME_LBCS = \"${EXTRN_MDL_NAME_LBCS}\"" check_var_valid_value \ "EXTRN_MDL_NAME_LBCS" "valid_vals_EXTRN_MDL_NAME_LBCS" "${err_msg}" @@ -1569,7 +1560,7 @@ fi # # Any regional model must be supplied lateral boundary conditions (in # addition to initial conditions) to be able to perform a forecast. In -# the FV3SAR model, these boundary conditions (BCs) are supplied using a +# the FV3-LAM model, these boundary conditions (BCs) are supplied using a # "halo" of grid cells around the regional domain that extend beyond the # boundary of the domain. The model is formulated such that along with # files containing these BCs, it needs as input the following files (in @@ -1654,18 +1645,18 @@ if [ "${GRID_GEN_METHOD}" = "GFDLgrid" ]; then # #----------------------------------------------------------------------- # -elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then +elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then - set_gridparams_JPgrid \ - lon_ctr="${JPgrid_LON_CTR}" \ - lat_ctr="${JPgrid_LAT_CTR}" \ - nx="${JPgrid_NX}" \ - ny="${JPgrid_NY}" \ - halo_width="${JPgrid_WIDE_HALO_WIDTH}" \ - delx="${JPgrid_DELX}" \ - dely="${JPgrid_DELY}" \ - alpha="${JPgrid_ALPHA_PARAM}" \ - kappa="${JPgrid_KAPPA_PARAM}" \ + set_gridparams_ESGgrid \ + lon_ctr="${ESGgrid_LON_CTR}" \ + lat_ctr="${ESGgrid_LAT_CTR}" \ + nx="${ESGgrid_NX}" \ + ny="${ESGgrid_NY}" \ + halo_width="${ESGgrid_WIDE_HALO_WIDTH}" \ + delx="${ESGgrid_DELX}" \ + dely="${ESGgrid_DELY}" \ + alpha="${ESGgrid_ALPHA_PARAM}" \ + kappa="${ESGgrid_KAPPA_PARAM}" \ output_varname_lon_ctr="LON_CTR" \ output_varname_lat_ctr="LAT_CTR" \ output_varname_nx="NX" \ @@ -1685,10 +1676,10 @@ fi # #----------------------------------------------------------------------- # -RES_IN_FIXSAR_FILENAMES="" +RES_IN_FIXLAM_FILENAMES="" if [ "${RUN_ENVIR}" != "nco" ]; then - mkdir_vrfy -p "$FIXsar" + mkdir_vrfy -p "$FIXLAM" fi # #----------------------------------------------------------------------- @@ -1701,28 +1692,28 @@ if [ "${RUN_ENVIR}" = "nco" ]; then suffix="${DOT_OR_USCORE}mosaic.halo${NH3}.nc" glob_pattern="C*$suffix" - cd_vrfy $FIXsar + cd_vrfy $FIXLAM num_files=$( ls -1 ${glob_pattern} 2>/dev/null | wc -l ) if [ "${num_files}" -ne "1" ]; then print_err_msg_exit "\ -Exactly one file must exist in directory FIXsar matching the globbing +Exactly one file must exist in directory FIXLAM matching the globbing pattern glob_pattern: - FIXsar = \"${FIXsar}\" + FIXLAM = \"${FIXLAM}\" glob_pattern = \"${glob_pattern}\" num_files = ${num_files}" fi fn=$( ls -1 ${glob_pattern} ) - RES_IN_FIXSAR_FILENAMES=$( \ + RES_IN_FIXLAM_FILENAMES=$( \ printf "%s" $fn | sed -n -r -e "s/^C([0-9]*)$suffix/\1/p" ) if [ "${GRID_GEN_METHOD}" = "GFDLgrid" ] && \ - [ "${GFDLgrid_RES}" -ne "${RES_IN_FIXSAR_FILENAMES}" ]; then + [ "${GFDLgrid_RES}" -ne "${RES_IN_FIXLAM_FILENAMES}" ]; then print_err_msg_exit "\ -The resolution extracted from the fixed file names (RES_IN_FIXSAR_FILENAMES) +The resolution extracted from the fixed file names (RES_IN_FIXLAM_FILENAMES) does not match the resolution specified by GFDLgrid_RES: GFDLgrid_RES = ${GFDLgrid_RES} - RES_IN_FIXSAR_FILENAMES = ${RES_IN_FIXSAR_FILENAMES}" + RES_IN_FIXLAM_FILENAMES = ${RES_IN_FIXLAM_FILENAMES}" fi else @@ -1730,7 +1721,7 @@ else #----------------------------------------------------------------------- # # If the grid file generation task in the workflow is going to be skipped -# (because pregenerated files are available), create links in the FIXsar +# (because pregenerated files are available), create links in the FIXLAM # directory to the pregenerated grid files. # #----------------------------------------------------------------------- @@ -1745,7 +1736,7 @@ else print_err_msg_exit "\ Call to function to create links to grid files failed." - RES_IN_FIXSAR_FILENAMES="${res_in_grid_fns}" + RES_IN_FIXLAM_FILENAMES="${res_in_grid_fns}" fi # @@ -1753,7 +1744,7 @@ else # # If the orography file generation task in the workflow is going to be # skipped (because pregenerated files are available), create links in -# the FIXsar directory to the pregenerated orography files. +# the FIXLAM directory to the pregenerated orography files. # #----------------------------------------------------------------------- # @@ -1767,16 +1758,16 @@ else print_err_msg_exit "\ Call to function to create links to orography files failed." - if [ ! -z "${RES_IN_FIXSAR_FILENAMES}" ] && \ - [ "${res_in_orog_fns}" -ne "${RES_IN_FIXSAR_FILENAMES}" ]; then + if [ ! -z "${RES_IN_FIXLAM_FILENAMES}" ] && \ + [ "${res_in_orog_fns}" -ne "${RES_IN_FIXLAM_FILENAMES}" ]; then print_err_msg_exit "\ The resolution extracted from the orography file names (res_in_orog_fns) does not match the resolution in other groups of files already consi- - dered (RES_IN_FIXSAR_FILENAMES): + dered (RES_IN_FIXLAM_FILENAMES): res_in_orog_fns = ${res_in_orog_fns} - RES_IN_FIXSAR_FILENAMES = ${RES_IN_FIXSAR_FILENAMES}" + RES_IN_FIXLAM_FILENAMES = ${RES_IN_FIXLAM_FILENAMES}" else - RES_IN_FIXSAR_FILENAMES="${res_in_orog_fns}" + RES_IN_FIXLAM_FILENAMES="${res_in_orog_fns}" fi fi @@ -1785,7 +1776,7 @@ else # # If the surface climatology file generation task in the workflow is # going to be skipped (because pregenerated files are available), create -# links in the FIXsar directory to the pregenerated surface climatology +# links in the FIXLAM directory to the pregenerated surface climatology # files. # #----------------------------------------------------------------------- @@ -1800,16 +1791,16 @@ else print_err_msg_exit "\ Call to function to create links to surface climatology files failed." - if [ ! -z "${RES_IN_FIXSAR_FILENAMES}" ] && \ - [ "${res_in_sfc_climo_fns}" -ne "${RES_IN_FIXSAR_FILENAMES}" ]; then + if [ ! -z "${RES_IN_FIXLAM_FILENAMES}" ] && \ + [ "${res_in_sfc_climo_fns}" -ne "${RES_IN_FIXLAM_FILENAMES}" ]; then print_err_msg_exit "\ The resolution extracted from the surface climatology file names (res_- in_sfc_climo_fns) does not match the resolution in other groups of files - already considered (RES_IN_FIXSAR_FILENAMES): + already considered (RES_IN_FIXLAM_FILENAMES): res_in_sfc_climo_fns = ${res_in_sfc_climo_fns} - RES_IN_FIXSAR_FILENAMES = ${RES_IN_FIXSAR_FILENAMES}" + RES_IN_FIXLAM_FILENAMES = ${RES_IN_FIXLAM_FILENAMES}" else - RES_IN_FIXSAR_FILENAMES="${res_in_sfc_climo_fns}" + RES_IN_FIXLAM_FILENAMES="${res_in_sfc_climo_fns}" fi fi @@ -1826,7 +1817,7 @@ fi # CRES="" if [ "${RUN_TASK_MAKE_GRID}" = "FALSE" ]; then - CRES="C${RES_IN_FIXSAR_FILENAMES}" + CRES="C${RES_IN_FIXLAM_FILENAMES}" fi @@ -2482,15 +2473,14 @@ MODULES_DIR="${MODULES_DIR}" EXECDIR="$EXECDIR" FIXrrfs="$FIXrrfs" FIXam="$FIXam" -FIXsar="$FIXsar" +FIXLAM="$FIXLAM" FIXgsm="$FIXgsm" -FIXupp="$FIXupp" -FIXgsd="$FIXgsd" COMROOT="$COMROOT" COMOUT_BASEDIR="${COMOUT_BASEDIR}" TEMPLATE_DIR="${TEMPLATE_DIR}" UFS_WTHR_MDL_DIR="${UFS_WTHR_MDL_DIR}" UFS_UTILS_DIR="${UFS_UTILS_DIR}" +EMC_POST_DIR="${EMC_POST_DIR}" CHGRES_DIR="${CHGRES_DIR}" SFC_CLIMO_INPUT_DIR="${SFC_CLIMO_INPUT_DIR}" TOPO_DIR=${TOPO_DIR} @@ -2568,7 +2558,7 @@ NY="${NY}" NHW="${NHW}" STRETCH_FAC="${STRETCH_FAC}" -RES_IN_FIXSAR_FILENAMES="${RES_IN_FIXSAR_FILENAMES}" +RES_IN_FIXLAM_FILENAMES="${RES_IN_FIXLAM_FILENAMES}" # # If running the make_grid task, CRES will be set to a null string du- # the grid generation step. It will later be set to an actual value af- @@ -2612,7 +2602,7 @@ EOM Heredoc (cat) command to append grid parameters to variable definitions file returned with a nonzero status." -elif [ "${GRID_GEN_METHOD}" = "JPgrid" ]; then +elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then { cat << EOM >> ${GLOBAL_VAR_DEFNS_FP} # @@ -2662,7 +2652,7 @@ OZONE_PARAM="${OZONE_PARAM}" # directory in which the workflow scripts will look for the files generated # by the external model specified in EXTRN_MDL_NAME_ICS. These files will # be used to generate the input initial condition and surface files for -# the FV3SAR. +# the FV3-LAM. # #----------------------------------------------------------------------- # @@ -2674,7 +2664,7 @@ EXTRN_MDL_SYSBASEDIR_ICS="${EXTRN_MDL_SYSBASEDIR_ICS}" # directory in which the workflow scripts will look for the files generated # by the external model specified in EXTRN_MDL_NAME_LBCS. These files # will be used to generate the input lateral boundary condition files for -# the FV3SAR. +# the FV3-LAM. # #----------------------------------------------------------------------- # diff --git a/ush/templates/FV3SAR_wflow.xml b/ush/templates/FV3LAM_wflow.xml similarity index 99% rename from ush/templates/FV3SAR_wflow.xml rename to ush/templates/FV3LAM_wflow.xml index 1fcb15aef..a5424a965 100644 --- a/ush/templates/FV3SAR_wflow.xml +++ b/ush/templates/FV3LAM_wflow.xml @@ -81,7 +81,7 @@ tasks; and the "FCST" type is used for the RUN_FCST_TN task. {%- endfor %} - &LOGDIR;/FV3SAR_wflow.log + &LOGDIR;/FV3LAM_wflow.log - {% for h in range(0, fcst_len_hrs+1) %}{{ " %02d" % h }}{% endfor %} + {% for h in range(0, fcst_len_hrs+1) %}{{ " %03d" % h }}{% endfor %} From a263718d8b2d464759a578153cec98759f67b1ff Mon Sep 17 00:00:00 2001 From: JeffBeck-NOAA <55201531+JeffBeck-NOAA@users.noreply.github.com> Date: Tue, 1 Sep 2020 17:21:11 -0600 Subject: [PATCH 10/19] Remove leading 0 from post task dependencies (#283) * Changes to post file names to make model lowercase and move ${fhr} to three values instead of two * Change "rrfs" to "${NET}" instead * Add missing "f" to file name * Remove restriction on ${fhr} being only two digits * Change fhour to three digit variable and at "f" to filename for Python plotting script. * Add new "post_fhr" variable to support dynamic 2- and 3-digit forecast hour formats in post filenames * Use "print_err_msg_exit" if forecast hour length is too long or short. * Fix indentations * Remove 0 from dynf0#fhr# and phyf0#fhr# dependencies for post task in XML template --- ush/templates/FV3LAM_wflow.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ush/templates/FV3LAM_wflow.xml b/ush/templates/FV3LAM_wflow.xml index 8f7ded626..19d3c2d71 100644 --- a/ush/templates/FV3LAM_wflow.xml +++ b/ush/templates/FV3LAM_wflow.xml @@ -399,8 +399,8 @@ MODULES_RUN_TASK_FP script. - &CYCLE_BASEDIR;/@Y@m@d@H{{ slash_ensmem_subdir }}/dynf0#fhr#.nc - &CYCLE_BASEDIR;/@Y@m@d@H{{ slash_ensmem_subdir }}/phyf0#fhr#.nc + &CYCLE_BASEDIR;/@Y@m@d@H{{ slash_ensmem_subdir }}/dynf#fhr#.nc + &CYCLE_BASEDIR;/@Y@m@d@H{{ slash_ensmem_subdir }}/phyf#fhr#.nc From e226e50162a8598da0c76419b53706d4d7490cc2 Mon Sep 17 00:00:00 2001 From: Siwei He <43216838+siwei-noaa@users.noreply.github.com> Date: Fri, 4 Sep 2020 16:19:03 -0600 Subject: [PATCH 11/19] WE2E test configuration for FV3_RRFS_v1beta (#280) * RRFS_v1beta test finished * remove config.sh * revoke change on DT_ATMOS * add if condition for RRFS_v1beta * bug fix for atmos_nthreads * FIXsar to FIXLAM * WE2E test configuration * update the temporary solution for copying the required files in using RRFS_v1beta * indents adjust --- scripts/exregional_make_orog.sh | 24 +++++++++- scripts/exregional_run_fcst.sh | 42 +++++++++-------- .../config.FV3_RRFS_v1beta.sh | 47 +++++++++++++++++++ ush/config_defaults.sh | 21 ++++++++- ush/setup.sh | 34 ++++++++++++++ 5 files changed, 145 insertions(+), 23 deletions(-) create mode 100644 tests/baseline_configs/config.FV3_RRFS_v1beta.sh diff --git a/scripts/exregional_make_orog.sh b/scripts/exregional_make_orog.sh index 0d074fd94..9b7684ad0 100755 --- a/scripts/exregional_make_orog.sh +++ b/scripts/exregional_make_orog.sh @@ -342,8 +342,28 @@ raw_orog_fn="${raw_orog_fn_prefix}.${fn_suffix_with_halo}" raw_orog_fp="${raw_dir}/${raw_orog_fn}" mv_vrfy "${raw_orog_fp_orig}" "${raw_orog_fp}" -# copy two files for drag_suite to the orog directory (temporary) -cp_vrfy /scratch2/BMC/gsd-fv3-test/she/orog/* ${OROG_DIR} # temporary code +# +#----------------------------------------------------------------------- +# +# Copy the two orography files needed for the drag suite in the FV3_RRFS_v1beta +# physics suite. +# +# Note that the following is a temporary fix. We need a long-term solution +# that calls a script or program to generates the necessary files (instead +# of copying them). +# +#----------------------------------------------------------------------- +# +if [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ]; then + cp_vrfy ${GWD_RRFS_v1beta_DIR}/* ${OROG_DIR} +else + print_err_msg_exit "\ +The location from which to copy the files needed by the gravity wave drag +parameterization in the current physics suite (CCPP_PHYS_SUITE) has not +been specified for this machine (MACHINE): + CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\" + MACHINE = \"${MACHINE}\"" +fi print_info_msg "$VERBOSE" " Orography file generation complete." diff --git a/scripts/exregional_run_fcst.sh b/scripts/exregional_run_fcst.sh index 8136710e9..a0e3f5ad9 100755 --- a/scripts/exregional_run_fcst.sh +++ b/scripts/exregional_run_fcst.sh @@ -251,28 +251,30 @@ else Cannot create symlink because target does not exist: target = \"$target\"" fi - +# # two files for drag_suite scheme +# this is only for the drag parameterization in the FV3_RRFS_v1beta physics suite +# if [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ]; then - # Symlink to orographic statistics fields file with "${CRES}_" and "halo0" stripped from name. - target="${FIXLAM}/${CRES}${DOT_OR_USCORE}oro_data_ls.tile${TILE_RGNL}.halo${NH0}.nc" - symlink="oro_data_ls.nc" - if [ -f "${target}" ]; then - ln_vrfy -sf ${relative_or_null} $target $symlink - else - print_err_msg_exit "\ - Cannot create symlink because target does not exist: - target = \"$target}\"" - fi - target="${FIXLAM}/${CRES}${DOT_OR_USCORE}oro_data_ss.tile${TILE_RGNL}.halo${NH0}.nc" - symlink="oro_data_ss.nc" - if [ -f "${target}" ]; then - ln_vrfy -sf ${relative_or_null} $target $symlink - else - print_err_msg_exit "\ - Cannot create symlink because target does not exist: - target = \"$target}\"" - fi + # Symlink to orographic statistics fields file with "${CRES}_" and "halo0" stripped from name. + target="${FIXLAM}/${CRES}${DOT_OR_USCORE}oro_data_ls.tile${TILE_RGNL}.halo${NH0}.nc" + symlink="oro_data_ls.nc" + if [ -f "${target}" ]; then + ln_vrfy -sf ${relative_or_null} $target $symlink + else + print_err_msg_exit "\ +Cannot create symlink because target does not exist: + target = \"$target}\"" + fi + target="${FIXLAM}/${CRES}${DOT_OR_USCORE}oro_data_ss.tile${TILE_RGNL}.halo${NH0}.nc" + symlink="oro_data_ss.nc" + if [ -f "${target}" ]; then + ln_vrfy -sf ${relative_or_null} $target $symlink + else + print_err_msg_exit "\ +Cannot create symlink because target does not exist: + target = \"$target}\"" + fi fi # # Symlink to halo-4 orography file with "${CRES}_" stripped from name. diff --git a/tests/baseline_configs/config.FV3_RRFS_v1beta.sh b/tests/baseline_configs/config.FV3_RRFS_v1beta.sh new file mode 100644 index 000000000..270c5a37a --- /dev/null +++ b/tests/baseline_configs/config.FV3_RRFS_v1beta.sh @@ -0,0 +1,47 @@ +# +# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required +# inputs to the script that launces the WE2E test experiments. That script +# will use those inputs to fill in the values of these variables below. +# +MACHINE="" +ACCOUNT="" +EXPT_SUBDIR="" +# +# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS +# are optional inputs to the script that launces the WE2E test experiments. +# If one or both of these values are specified, then that script will +# replace the default values of these variables below with those values. +# Otherwise, it will keep the default values. +# +USE_CRON_TO_RELAUNCH="TRUE" +CRON_RELAUNCH_INTVL_MNTS="02" + + +QUEUE_DEFAULT="batch" +QUEUE_HPSS="service" +QUEUE_FCST="batch" + +VERBOSE="TRUE" + +RUN_ENVIR="community" +PREEXISTING_DIR_METHOD="rename" + +PREDEF_GRID_NAME="GSD_HRRR25km" +GRID_GEN_METHOD="ESGgrid" +QUILTING="TRUE" +USE_CCPP="TRUE" +CCPP_PHYS_SUITE="FV3_RRFS_v1beta" +FCST_LEN_HRS="06" +LBC_SPEC_INTVL_HRS="6" + +DATE_FIRST_CYCL="20190520" +DATE_LAST_CYCL="20190520" +CYCL_HRS=( "00" ) + +EXTRN_MDL_NAME_ICS="HRRRX" +EXTRN_MDL_NAME_LBCS="RAPX" + +RUN_TASK_MAKE_GRID="TRUE" +RUN_TASK_MAKE_OROG="TRUE" +RUN_TASK_MAKE_SFC_CLIMO="TRUE" +GWD_RRFS_v1beta_BASEDIR="/scratch2/BMC/gsd-fv3-test/she/orog" diff --git a/ush/config_defaults.sh b/ush/config_defaults.sh index 8fbabb3d1..be318c59c 100644 --- a/ush/config_defaults.sh +++ b/ush/config_defaults.sh @@ -1204,4 +1204,23 @@ SKEB_TSCALE="21600" #Variable "skeb_tau" in input.nml SKEB_INT="3600" #Variable "skebint" in input.nml SKEB_VDOF="10" USE_ZMTNBLCK="false" - +# +#----------------------------------------------------------------------- +# +# GWD_RRFS_v1beta_BASEDIR: +# Temporary workflow variable specifies the base directory in which to +# look for certain fixed orography files needed only by the gravity wave +# drag parameterization in the FV3_RRFS_v1beta physics suite. This variable +# is added in order to avoid including hard-coded paths in the workflow +# scripts. Currently, the workflow simply copies the necessary files +# from a subdirectory under this directory (named according to the specified +# predefined grid) to the orography directory (OROG_DIR) under the +# experiment directory. +# +# Note that this variable is only used when using the FV3_RRFS_v1beta +# physics suite. This variable should be removed from the workflow once +# there is a script that generates these files for any grid. +# +#----------------------------------------------------------------------- +# +GWD_RRFS_v1beta_BASEDIR="" diff --git a/ush/setup.sh b/ush/setup.sh index b30601d32..00d1559e0 100755 --- a/ush/setup.sh +++ b/ush/setup.sh @@ -932,6 +932,39 @@ fi # #----------------------------------------------------------------------- # +# If using the FV3_RRFS_v1beta physics suite, make sure that the directory +# from which certain fixed orography files will be copied to the experiment +# directory actually exists. Note that this is temporary code. It should +# be removed once there is a script that will create these orography files +# for any grid. +# +#----------------------------------------------------------------------- +# +GWD_RRFS_v1beta_DIR="${GWD_RRFS_v1beta_BASEDIR}/${PREDEF_GRID_NAME}" +if [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ]; then + if [ -z "${PREDEF_GRID_NAME}" ]; then + print_err_msg_exit "\ +A predefined grid name (PREDEF_GRID_NAME) must be specified when using +the FV3_RRFS_v1beta physic suite: + CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\" + PREDEF_GRID_NAME = \"${PREDEF_GRID_NAME}\"" + else + if [ ! -d "${GWD_RRFS_v1beta_DIR}" ]; then + print_err_msg_exit "\ +The directory (GWD_RRFS_v1beta_DIR) that should contain the gravity wave +drag-related orography files for the FV3_RRFS_v1beta does not exist: +GWD_RRFS_v1beta_DIR = \"${GWD_RRFS_v1beta_DIR}\"" + elif [ ! "$( ls -A ${GWD_RRFS_v1beta_DIR} )" ]; then + print_err_msg_exit "\ +The directory (GWD_RRFS_v1beta_DIR) that should contain the gravity wave +drag related orography files for the FV3_RRFS_v1beta is empty: +GWD_RRFS_v1beta_DIR = \"${GWD_RRFS_v1beta_DIR}\"" + fi + fi +fi +# +#----------------------------------------------------------------------- +# # If the base directory (EXPT_BASEDIR) in which the experiment subdirec- # tory (EXPT_SUBDIR) will be located is not set or is set to an empty # string, set it to a default location that is at the same level as the @@ -2476,6 +2509,7 @@ CYCLE_BASEDIR="${CYCLE_BASEDIR}" GRID_DIR="${GRID_DIR}" OROG_DIR="${OROG_DIR}" SFC_CLIMO_DIR="${SFC_CLIMO_DIR}" +GWD_RRFS_v1beta_DIR="${GWD_RRFS_v1beta_DIR}" NDIGITS_ENSMEM_NAMES="${NDIGITS_ENSMEM_NAMES}" ENSMEM_NAMES=( $( printf "\"%s\" " "${ENSMEM_NAMES[@]}" )) From 91480763e5241a9f518df856f8b8224c998a7420 Mon Sep 17 00:00:00 2001 From: panll Date: Tue, 8 Sep 2020 16:29:26 -0600 Subject: [PATCH 12/19] adding scripts for getting nomads data (#249) * adding files for getting nomads data new files: ush/NOMADS_get_extrn_mdl_files_grib.sh ush/NOMADS_get_extrn_mdl_files_nemsio.sh * updated code for getting data online in one file new file: ush/NOMADS_get_extrn_mdl_files.sh deleted files: ush/NOMADS_get_extrn_mdl_files_grib.sh ush/NOMADS_get_extrn_mdl_files_nemsio.sh * Enable ensemble forecasts (#245) * Modify workflow to enable ensemble forecasts. Summary of modifications: ------------------------ * Introduce the new workflow variables DO_ENSEMBLE and NUM_ENS_MEMBERS. The user can enable ensemble forecasts by setting DO_ENSEMBLE to "TRUE" and NUM_ENS_MEMBERS to the number of ensemble members to use. * When running ensemble forecasts, create/insert a set of ensemble member directories and create the cycle directories under these member directories. These ensemble member directories are placed at the directory level that cycle directory levels would be placed when not running ensemble forecasts. * Regardless of whether or not ensembles are enabled, change location where external model files are staged so that they are not in the cycle directories but instead one (without ensembles) or two (with ensembles) directory levels up. In the case with ensembles, this needs to be done so that the external model files are not duplicated within each ensemble member directory; they do not need to be because all ensemble members use the same external model files. This is also done for the case without ensembles in order to minimize the difference in worklfow behavior between the with and without ensemble cases. To make this change of location of external model files, the new workflow variable EXTRN_MDL_FILES_BASEDIR is introduced (it is not a user-specified variable but a secondary one). * Add two new WE2E tests for running ensemble forecasts, one in community mode (community_ensemble) and another in NCO mode (nco_ensemble). Modifications common to more than one file (used below in listing of file-by-file modifications): ------------------------------------------------------------------------------------------------ (A) Fix/add/delete comments and/or informational and/or error messages. (B) Remove commented out code. (C) Change location where external model files are staged so that they are not in the cycle directories (which are now underneath each ensemble member directory) but instead one level up. This needs to be done so that the external model files are not duplicated within each ensemble member directory; they do not need to be because all ensemble members use the same external model files. (D) Add a call to the new function set_FV3nml_stoch_params() that takes a base FV3 namelist file and generates from it a new FV3 namelist file for each ensemble member containing a unique set of stochastic parameters (relative to other ensemble members) and places it at the top level of that ensemble member's directory (so that all cycles in that member directory can create symlinks to it). (E) Rename the variable FV3_NML_BASE_FN to FV3_NML_BASE_SUITE_FN to clarify that it specifies the name of the FV3 namelist file for the base physics suite (which is used to generate the namelist file specific to the user-specified physic suite). This is done to better distinguish this base namelist file from the base namelist file used to generate namelist files for the various ensemble members. (The name of the latter is specified in the new workflow variable FV3_NML_BASE_ENS_FN.) (F) Introduce the new workflow variable FV3_NML_BASE_ENS_FN that specifies the name to use for the base FV3 namelist file from which to generate the namelist file for each ensemble member. This variable is not used if not running ensemble forecasts (i.e. if DO_ENSEMBLE is not set to "TRUE"). (G) Add the local variable dummy_cyc_dir that specifies the (dummy) directory with respect to which to set the relaive paths of the fixed files (i.e. those in the FIXam directory) in the FV3 namelist file. When running ensembles, this path is two levels up from the cycle directory; without ensembles, it is only one level up (as was originally the case). File-by-file description of modifications: ----------------------------------------- jobs/JREGIONAL_GET_EXTRN_MDL_FILES: (C) jobs/JREGIONAL_RUN_FCST: * Change CYCLE_DIR to cycle_dir since it is a local variable in this context (it is an argument to the script exregional_run_fcst.sh). jobs/JREGIONAL_RUN_POST: * For NCO mode, change directory in which output from the RUN_POST_TN task is stored such that if running ensemble forecasts, subdirectories are created under COMOUT_BASEDIR for each ensemble member. This is done via the variable SLASH_ENSMEM_DIR, which is set to either "/mem$NN" where $NN is the member number (if running ensemble forecasts) or to a null string (if not running ensemble forecasts). For community mode, the output from the post task is under CYCLE_DIR, which now gets set in the rocoto XML such that it is under an ensemble member directory (see below description of modifications to ush/templates/FV3SAR_wflow.xml). modulefiles/tasks/hera/make_ics.local: * Add wgrib2 (must have been removed by mistake?). modulefiles/tasks/hera/make_lbcs.local: * Add wgrib2 (must have been removed by mistake?). scripts/exregional_make_grid.sh: (A), (D) scripts/exregional_make_ics.sh: (C) scripts/exregional_make_lbcs.sh: (C) scripts/exregional_run_fcst.sh: * Change CYCLE_DIR to cycle_dir since it is a local variable. * Add a check such that if running ensemble forecasts, the symlink for the FV3 namelist file that must be present in the cycle directory points to the namelist file at the top level of the ensemble directory under which that cycle directory is located. tests/baseline_configs/config.community_ensemble.sh: * New workflow configuration file to perform WE2E test of ensemble forecasts in community mode. tests/baseline_configs/config.nco_ensemble.sh: * New workflow configuration file to perform WE2E test of ensemble forecasts in NCO mode. tests/baselines_list.txt: * Add two new WE2E tests for running ensemble forecasts, one in community mode (community_ensemble) and another in NCO mode (nco_ensemble). ush/config_defaults.sh: (A), (E), (F) * Introduce the new workflow variable DO_ENSEMBLE that specifies whether or not to run ensemble forecasts. Enable ensemble forecasts by setting DO_ENSEMBLE to "TRUE". * Introduce the new workflow variable NUM_ENS_MEMBERS that specifies the number of ensemble members. This variable is not used if DO_ENSEMBLE is not set to "TRUE". ush/generate_FV3SAR_wflow.sh: (A), (B), (D), (E), (G) * Add new ensemble-related parameters to the "settings" variable that is used to customize the jinja2 template for the rocoto XML file. These new parameters allow the resulting XML to loop over ensemble members, rename rocoto tasks and log files such that they contain the member number (and are thus unique), and modify cycle directories so that they are member-specific. ush/set_FV3nml_sfc_climo_filenames.sh: (G) ush/set_FV3nml_stoch_params.sh * File to define new function that takes a base FV3 namelist file and generates from it a new FV3 namelist file for each ensemble member containing a unique set of stochastic parameters (relative to other ensemble members) and places it at the top level of that ensemble member's directory (so that all cycles in that member directory can create symlinks to it). ush/setup.sh: (E), (F) * Rename FCST_LEN_HRS_MAX to fcst_len_hrs_max since it is a local variable. * Introduce the new workflow variable EXTRN_MDL_FILES_BASEDIR that specifies the base directory under which the external model files will be staged. Under this directory, a subdirectory will be created for each external model (one for ICs, another for LBCs if different from the one for ICs), and under these, subdirectories will be created for each cycle in which to stage the files. Note that EXTRN_MDL_FILES_BASEDIR is a secondary variable in the sense that it is not user-specifiable. * Rename FV3_NML_BASE_FP to FV3_NML_BASE_SUITE_FP for the same reason as renaming of FV3_NML_BASE_FN to FV3_NML_BASE_SUITE_FN (see (E) above). * Create new workflow variable FV3_NML_BASE_ENS_FP that specifies the full path to the base FV3 namelist file from which the namelist files for the individual ensemble members are generated. * Introduce the new workflow array variable ENS_MEMBER_DIRS. If running ensemble forecasts, set its elements to the ensemble member directories immediately under the experiment directory. * If running ensemble forecasts, create the ensemble directories specified in the new workflow array variable ENS_MEMBER_DIRS. * Record new variables to the workflow variable definitions file. ush/templates/FV3SAR_wflow.xml: * Bug fix - Change file name "make_grid_task_complete.txt" to "&MAKE_GRID_TN;_task_complete.txt" to make it changeable with the task name. * Remove CYCLE_BASEDIR as an environment variable from the GET_EXTRN_ICS_TN and GET_EXTRN_LBCS_TN tasks. This variable is no longer needed because the external model files are now staged outside of the cycle directories (under EXTRN_MDL_FILES_BASEDIR). * Place a jinja2-controlled metatask around all tasks starting with MAKE_ICS_TN that loops over all ensemble members if do_ensemble is set to TRUE. * For tasks that are within the metatask that loops over the ensemble members, add a string (uscore_ensmem_name) that identifies the ensemble member to task names, corresponding job names, and log file names. Note that this variable is set to an empty string if not running ensemble forecasts. * For tasks that are within the metatask that loops over the ensemble members, add a string (slash_ensmem_dir) that inserts the ensemble member directory to the definition of CYCLE_DIR (since when running ensembles, the cycle directories are under the member directories). Note that this variable is set to an empty string if not running ensemble forecasts. * Set the ensemble index (ENSMEM_INDX) as an environment variable in the RUN_FCST_TN task. This is needed in the ex-script exregional_run_fcst.sh to be able to the symlink in the cycle directory to the FV3 namelist file in the correct ensemble member directory. Note that this variable is set to an empty string if not running ensemble forecasts (in that case, it is not used). * Set the ensemble member subdirectory preceded by a slash (SLASH_ENSMEM_DIR) as an environment variable in the RUN_POST_TN task. This is needed in NCO mode when setting the directory in which to place the output of UPP. Note that this variable is set to an empty string if not running ensemble forecasts. ush/valid_param_vals.sh: * Specify valid values for the new workflow variable DO_ENSEMBLE. * Minor changes to code comments. * Apparently there is now a requirement in the FV3 code that consv_te be set to 0 on any regional grid. Make this change for the FV3_CPT_v0 suite (which is the only one for which consv_te had been set to a nonzero value). * Bug fix in a diag_table that should already be in the develop branch. * Bug fix -- Fix inconsistency in the way the ensemble member directories are named in different scripts. The workflow generation scripts create ensemble directories named, e.g., mem1, mem2, ..., mem8, but the exregional_run_fcst.sh script assumes they are mem01, mem02, ..., mem08. Make these consistent. Now, the naming convention used depends on whether or not leading zeros are included in NUM_ENS_MEMBERS. For example, if NUM_ENS_MEMBERS is set to "8", then the member directory names will be mem1, mem2, ..., mem8; and if NUM_ENS_MEMBERS is set to "08", then the member directory names will be mem01, mem02, ..., mem08. * Add new WE2E test to test use of leading zeros in ensemble member names. * Change directory structure so that ensemble member directories are beneath the cycle directories (instead of the opposite). Details below. Summary of modifications: ------------------------ * Place cycle directories above ensemble member directories, i.e. each cycle directory will contain a full set of ensemble member subdirectories that are used as the run directories. Previously, it was the other way around, i.e. each member directory contained all cycle subdirectories. * Move the external model directories into each cycle directory (instead of being in their own directory called extrn_mdl_files under the main experiment directory). * During the experiment generation step, generate the full list of cycle dates/times to run and create a directory for each cycle. * Add capability to have more than one cycle. This capability was previously present but was inadvertently disabled during transition to generating the rocoto XML using a jinja2 template. * In order to test the capability of the workflow to run multiple cycles (possibly on different days), modify the WE2E tests community_ensemble_2mems and nco_ensemble so that there are two cycle hours per day. Also, modify community_ensemble_2mems so that the starting and ending days are different (one day later). Modifications common to more than one file (used below in listing of file-by-file modifications): ------------------------------------------------------------------------------------------------ (A) Change the location where external model files are stored to be under each cycle directory (instead of a separate directory specified by EXTRN_MDL_FILES_BASEDIR under the main experiment directory). (B) Insert the new environment variable SLASH_ENSMEM_SUBDIR anywhere CYCLE_DIR appears. This variable is passed in by the rocoto XML. If not running ensemble forecasts, it is simply set to an empty string, and if running ensembles, it is set to the string "/${ensmem_subdir}" where ensmem_subdir is the subdirectory of the current ensemble member under the current cycle directory. This allows the subdirectories containing ICS, LBCS, and RESTART files to be placed directly under the current cycle directory when NOT running ensembles and for them to be placed under the current ensemble member directory (which is one level down from the current cycle directory) when running ensembles. (C) For clarity, add new local variable run_dir that gets set to the run directory based on the current cycle and, if applicable, the ensemble member. (D) Call the new function create_diag_table_files (in the new file create_diag_table_files.sh) to create diagnostics table files. (D) For correctness, rename the local variable dummy_cyc_dir to dummy_run_dir. (E) Remove any use of EXTRN_MDL_FILES_BASEDIR since it is no longer needed as a workflow variable. (F) Remove any use of ENS_MEMBER_DIRS since it is no longer needed as a workflow variable. (V) Remove unused code. (W) Edit informational and/or error messages. (X) Remove trailing whitespace. (Y) Remove commented out code. (Z) Edit comments. File-by-file description of modifications: ----------------------------------------- jobs/JREGIONAL_GET_EXTRN_MDL_FILES: (A) jobs/JREGIONAL_MAKE_ICS: (B) jobs/JREGIONAL_MAKE_LBCS: (B) jobs/JREGIONAL_RUN_FCST: (B), (C), (Z) * Pass in ENSMEM_INDX and SLASH_ENSMEM_SUBDIR as arguments to the function exregional_run_fcst(). jobs/JREGIONAL_RUN_POST: (B), (Z) * Create the new local variable run_dir in which to store the path to the run directory (for the current cycle and possibly ensemble member). * In NCO mode, change location where ensemble directories are created to be under the cycle directory instead of above it (analogous change to NCO mode as is done in (B) for community mode). * In community mode, place the postprd subdirectory under the run directory instead of under CYCLE_DIR (since now, cycle directories are one level up if running ensembles and thus would be the incorrect place to create postprd). * Create the new argument cdate to the function exregional_run_post() and pass in the environment variable CDATE for its value (this is instead of using CDATE directly in exregional_run_post()). * Change the argument cycle_dir of the function exregional_run_post to run_dir since that's what we really want in that function. This is instead of passing in cycle_dir and then forming run_dir. scripts/exregional_make_grid.sh: (D) scripts/exregional_make_ics.sh: (A), (X) scripts/exregional_make_lbcs.sh: (A), (X) scripts/exregional_run_fcst.sh: (C), (W) * Introduce new input arguments ensmem_indx and slash_ensmem_subdir that get set to the rocoto-specified environment variables ENSMEM_INDX and SLASH_ENSMEM_SUBDIR, respectively, in the call to this function in jobs/JREGIONAL_RUN_FCST. * Change cycle_dir to run_dir in most places to make the directory name more general. This is because the run directory will be the cycle directory only when not running ensembles. When running ensembles, the run directory will be one of the ensemble member directories, which will be one level down from the current cycle directory. * Fix typo where there is an extra "}" printed after $target in error messages. * Use the new workflow array variable FV3_NML_ENSMEM_FPS (which contains the full paths to the FV3 namelist files for each ensemble member) when creating a link in the run directory to the FV3 namelist file for the current ensemble member. Note that these namelist files are cycle-independent and thus are created only once during the experiment generation step. * Move the creation of diagnostics table files to a new function (in ush/create_diag_table_files.sh), and call that function during experiment generation (in ush/generate_FV3SAR_wflow.sh) instead of here in exregional_run_fcst.sh. We do this because the diagnostics table files depend only on the cycle, not the ensemble member. Thus, since we know the cycles to run at experiment generation time, we generate the diagnostics file for each cycle then and place each in its corresponding cycle directory. * If running ensembles, create symlinks in the run directory to the diagnostics table and model configure files in the cycle directory (which will be one level up from the run directory). We don't do this when NOT running ensembles because in that case, the run directory is the cycle directory (and these two files already exist in that directory; they are created during experiment generation time). scripts/exregional_run_post.sh: (C), (Y) * Create the new input argument cdate (which gets set to the global variable CDATE in the call to this function (exregional_run_post)) and use it instead of the global variable CDATE. * Change the argument cycle_dir to run_dir since that's more useful in this function. This is instead of passing in cycle_dir and then forming run_dir. * Make the local variables "POST_..." lowercase to follow the convention that local variables be in lower case. tests/baseline_configs/config.community_ensemble_2mems.sh: * Modify settings in this test configuration so that the starting and ending days of the cycles are not the same and so that there are two cycle hours per day. This is to have more thorough testing of the ensembles feature in community mode. tests/baseline_configs/config.nco_ensemble.sh: * Modify settings in this test configuration so that there are two cycle hours per day. This is to have more thorough testing of the ensembles feature in NCO mode. ush/create_diag_table_files.sh: * New file containing a function that creates a diagnostics table file for each cycle date and places it in the corresponding cycle directory. ush/create_model_config_files.sh: * New file containing a function that creates a model configuration file for each cycle date and places it in the corresponding cycle directory. ush/set_cycle_dates.sh: * New function that sets all the cycle dates/times to run. ush/generate_FV3SAR_wflow.sh: (D) * For clarity and consistency with other scripts, change variable name from slash_ensmem_dir to slash_ensmem_subdir. * Change "settings" variable used to set parameters in the jinja template for the rocoto XML to add capability to have more than one cycle. This capability was previously present but was inadvertently disabled during transition to generating the rocoto XML using a jinja2 template. * Use the new workflow array variable ALL_CDATES (containing all the cycle dates/times to run) to create all the cycle directories. Previously, the cycle directories were created during the make_ics or make_lbcs task, but it is clearer to do it during experiment generation. Also, it now must be done during experiment generation because now, the model configuration file(s) and possibly also the diagnostics table file(s) (if the MAKE_GRID_TN step is being skipped), which are cycle-dependent but ensemble-member-independent, are created and placed in the cycle directories during experiment generation. * Call the new function create_model_config_files() to create a model configuration file within each cycle directory. * If not running the MAKE_GRID_TN task, call the new function create_diag_table_files() to create a diagnostics table file within each cycle directory. ush/set_FV3nml_sfc_climo_filenames.sh: (D) ush/set_FV3nml_stoch_params.sh: (Z) * For consistency with other scripts, rename the variable fv3_nml_ens_fp to fv3_nml_ensmem_fp. * Use the new workflow array variable FV3_NML_ENSMEM_FPS (which contains the full paths to the FV3 namelist files for each ensemble member) to set the full path to the current ensemble member's FV3 namelist file. ush/setup.sh: (E), (F), (V), (Z) * Call the new function set_cycle_dates() to set the new worklow array variable ALL_CDATES containing all the cycle days/times to be run. * Set the new workflow variable NUM_CYCLES to the number of elements in ALL_CDATES. * Set the new workflow array variable ENSMEM_NAMES containing the names of the ensemble members. * Set the new workflow array variable FV3_NML_ENSMEM_FPS containing the full paths to the FV3 namelist files of the ensemble members. * Remove creation of ensemble member directories. These are now created in the j-jobs of the MAKE_ICS_TN or the MAKE_LBCS_TN task (whichever runs first). ush/templates/FV3SAR_wflow.xml: (Y) * Modify jinja code to allow for multiple cycles to be run. This capability was previously present but was inadvertently disabled during transition to generating the rocoto XML using a jinja2 template. * Add CYCLE_DIR as an environment variable to the GET_EXTRN_ICS_TN and GET_EXTRN_LBCS_TN tasks. * In the MAKE_ICS_TN, MAKE_LBCS_TN, RUN_FCST_TN, and RUN_POST_TN tasks, change the way CYCLE_DIR is set so that it does not include the ensemble member subdirectory. * In the MAKE_ICS_TN, MAKE_LBCS_TN, RUN_FCST_TN, and RUN_POST_TN tasks, create the new environment variable SLASH_ENSMEM_SUBDIR that gets set to a null string if not running ensembles and to the string "/${name_of_ensemble_member}" when running ensembles. * Bug fixes. These bugs were introduced during the previous merge of the develop branch into this fork (feature/ensemble). * To test the multiple-days and multiple-cycle-hours capabilities with ensemble forecasts in community mode, change WE2E test "community_ensemble_008" to include 2 days and 2 cycle hours per day (instead of 1 and 1, respectively). * Add WCOSS changes for the feature/ensemble branch * Minor changes to code comments. Co-authored-by: Benjamin.Blake EMC * updated codes according to the comments modified files: scripts/exregional_get_extrn_mdl_files.sh ush/NOMADS_get_extrn_mdl_files.sh ush/config_defaults.sh ush/generate_FV3SAR_wflow.sh ush/valid_param_vals.sh * Change filename: ush/generate_FV3SAR_wflow.sh -> ush/generate_FV3LAM_wflow.sh * adding one test to WE2W for downloading files new file for the test: tests/baseline_configs/config.user_download_extrn_files.sh modified file for the test: tests/baselines_list.txt modified files for recent changes(SAR to LAM, JPgrid to ESGgrid) scripts/exregional_get_extrn_mdl_files.sh ush/config_defaults.sh ush/valid_param_vals.sh Co-authored-by: Linlin.Pan Co-authored-by: gsketefian <31046882+gsketefian@users.noreply.github.com> Co-authored-by: Benjamin.Blake EMC --- scripts/exregional_get_extrn_mdl_files.sh | 38 ++++ scripts/exregional_run_fcst.sh | 11 ++ .../config.user_download_extrn_files.sh | 49 +++++ tests/baselines_list.txt | 1 + ush/NOMADS_get_extrn_mdl_files.sh | 70 +++++++ ush/config_defaults.sh | 13 ++ ush/create_model_config_files.sh | 182 ++++++++++++++++++ ush/generate_FV3LAM_wflow.sh | 7 + ush/valid_param_vals.sh | 2 + 9 files changed, 373 insertions(+) create mode 100755 tests/baseline_configs/config.user_download_extrn_files.sh create mode 100755 ush/NOMADS_get_extrn_mdl_files.sh create mode 100644 ush/create_model_config_files.sh diff --git a/scripts/exregional_get_extrn_mdl_files.sh b/scripts/exregional_get_extrn_mdl_files.sh index ab54da812..a356f9d5c 100755 --- a/scripts/exregional_get_extrn_mdl_files.sh +++ b/scripts/exregional_get_extrn_mdl_files.sh @@ -214,6 +214,10 @@ if [ "${num_files_found_on_disk}" -eq "${num_files_to_copy}" ]; then else data_src="HPSS" fi + +if [ ${NOMADS} == "TRUE" ]; then + data_src="online" +fi # #----------------------------------------------------------------------- # @@ -710,6 +714,38 @@ In directory: \"${scrfunc_dir}\" fi +elif [ "${data_src}" = "online" ]; then + print_info_msg " +======================================================================== +getting data from online nomads data sources +========================================================================" + +# +#----------------------------------------------------------------------- +# +# Set extrn_mdl_fps to the full paths within the archive files of the +# external model output files. +# +#----------------------------------------------------------------------- +# + prefix=${extrn_mdl_arcvrel_dir:+${extrn_mdl_arcvrel_dir}/} + extrn_mdl_fps=( "${extrn_mdl_fns_on_disk[@]/#/$prefix}" ) + + extrn_mdl_fps_str="( "$( printf "\"%s\" " "${extrn_mdl_fps[@]}" )")" + + print_info_msg " +Getting external model files from nomads: + extrn_mdl_fps= ${extrn_mdl_fps_str}" + + num_files_to_extract="${#extrn_mdl_fps[@]}" + wget_LOG_FN="log.wget.txt" + for (( nfile=0; nfile<${num_files_to_extract}; nfile++ )); do + cp ../../../${extrn_mdl_fps[$nfile]} . || \ + print_err_msg_exit "\ + onlie file ${extrn_mdl_fps[$nfile]} not found." + done + + fi # #----------------------------------------------------------------------- @@ -732,6 +768,8 @@ if [ "${data_src}" = "disk" ]; then extrn_mdl_fns_str="( "$( printf "\"%s\" " "${extrn_mdl_fns_on_disk[@]}" )")" elif [ "${data_src}" = "HPSS" ]; then extrn_mdl_fns_str="( "$( printf "\"%s\" " "${extrn_mdl_fns_in_arcv[@]}" )")" +elif [ "${data_src}" = "online" ]; then + extrn_mdl_fns_str="( "$( printf "\"%s\" " "${extrn_mdl_fns_on_disk[@]}" )")" fi settings="\ diff --git a/scripts/exregional_run_fcst.sh b/scripts/exregional_run_fcst.sh index a0e3f5ad9..54f9fad0c 100755 --- a/scripts/exregional_run_fcst.sh +++ b/scripts/exregional_run_fcst.sh @@ -447,6 +447,15 @@ if [ "${USE_CCPP}" = "TRUE" ]; then fi #----------------------------------------------------------------------- # +# If running enemble forecasts, create links to the cycle-specific +# diagnostic tables file and model configuration file in the cycle +# directory. Note that these links should not be made if not running +# ensemble forecasts because in that case, the cycle directory is the +# run directory (and we would be creating a symlink with the name of a +# file that already exists). +# +#----------------------------------------------------------------------- +# # Call the function that creates the model configuration file within each # cycle directory. # @@ -475,6 +484,8 @@ if [ "${DO_ENSEMBLE}" = "TRUE" ]; then relative_or_null="--relative" diag_table_fp="${cycle_dir}/${DIAG_TABLE_FN}" ln_vrfy -sf ${relative_or_null} ${diag_table_fp} ${run_dir} + model_config_fp="${cycle_dir}/${MODEL_CONFIG_FN}" + ln_vrfy -sf ${relative_or_null} ${model_config_fp} ${run_dir} fi # #----------------------------------------------------------------------- diff --git a/tests/baseline_configs/config.user_download_extrn_files.sh b/tests/baseline_configs/config.user_download_extrn_files.sh new file mode 100755 index 000000000..86376e96b --- /dev/null +++ b/tests/baseline_configs/config.user_download_extrn_files.sh @@ -0,0 +1,49 @@ +# +# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required +# inputs to the script that launces the WE2E test experiments. That script +# will use those inputs to fill in the values of these variables below. +# +MACHINE="" +ACCOUNT="" +EXPT_SUBDIR="" +# +# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS +# are optional inputs to the script that launces the WE2E test experiments. +# If one or both of these values are specified, then that script will +# replace the default values of these variables below with those values. +# Otherwise, it will keep the default values. +# +USE_CRON_TO_RELAUNCH="TRUE" +CRON_RELAUNCH_INTVL_MNTS="02" + + +QUEUE_DEFAULT="batch" +QUEUE_HPSS="service" +QUEUE_FCST="batch" + +VERBOSE="TRUE" + +RUN_ENVIR="community" +PREEXISTING_DIR_METHOD="rename" + +PREDEF_GRID_NAME="GSD_HRRR25km" +GRID_GEN_METHOD="ESGgrid" +QUILTING="TRUE" +USE_CCPP="TRUE" +CCPP_PHYS_SUITE="FV3_GFS_2017_gfdlmp" +FCST_LEN_HRS="06" +LBC_SPEC_INTVL_HRS="3" + +DATE_FIRST_CYCL="20200826" +DATE_LAST_CYCL="20200826" +CYCL_HRS=( "00" ) + +EXTRN_MDL_NAME_ICS="FV3GFS" +EXTRN_MDL_NAME_LBCS="FV3GFS" + +RUN_TASK_MAKE_GRID="TRUE" +RUN_TASK_MAKE_OROG="TRUE" +RUN_TASK_MAKE_SFC_CLIMO="TRUE" + +NOMADS="TRUE" +NOMADS_file_type="NEMSIO" diff --git a/tests/baselines_list.txt b/tests/baselines_list.txt index a145fa578..002818dbe 100644 --- a/tests/baselines_list.txt +++ b/tests/baselines_list.txt @@ -24,3 +24,4 @@ regional_014 regional_015 regional_016 user_staged_extrn_files +user_download_extrn_files diff --git a/ush/NOMADS_get_extrn_mdl_files.sh b/ush/NOMADS_get_extrn_mdl_files.sh new file mode 100755 index 000000000..308aa8082 --- /dev/null +++ b/ush/NOMADS_get_extrn_mdl_files.sh @@ -0,0 +1,70 @@ +#!/bin/bash +# Command line arguments +if [ -z "$1" -o -z "$2" ]; then + echo "Usage: $0 yyyymmdd hh file_fmt nfcst nfcst_int" + echo "yyymmdd and hh are required and other variables are optional" + exit +fi +## date (year month day) and time (hour) +yyyymmdd=$1 #i.e. "20191224" +hh=$2 #i.e. "12" +## +## file format (grib2 or nemsio), the default format is grib2 +if [ "$#" -ge 3 ]; then + file_fmt=$3 +else + file_fmt="grib2" +fi +## forecast length, the default value are 6 hours +if [ "$#" -ge 4 ]; then + nfcst=$4 +else + nfcst=6 +fi +## forecast interval, the default interval are 3 hours +if [ "$#" -ge 5 ]; then + nfcst_int=$5 +else + nfcst_int=3 +fi + +# Get the data (do not need to edit anything after this point!) +yyyymm=$((yyyymmdd/100)) +#din_loc_ic=`./xmlquery DIN_LOC_IC --value` +mkdir -p gfs.$yyyymmdd/$hh +echo "Download files to $din_loc_ic/$yyyymm/$yyyymmdd ..." +cd gfs.$yyyymmdd/$hh + +#getting online analysis data +if [ $file_fmt == "grib2" ] || [ $file_fmt == "GRIB2" ]; then + wget -c https://nomads.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/gfs.$yyyymmdd/$hh/gfs.t${hh}z.pgrb2.0p25.f000 +else + wget -c https://nomads.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/gfs.$yyyymmdd/$hh/gfs.t${hh}z.atmanl.nemsio + wget -c https://nomads.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/gfs.$yyyymmdd/$hh/gfs.t${hh}z.sfcanl.nemsio +fi + +#getting online forecast data +ifcst=$nfcst_int +while [ $ifcst -le $nfcst ] +do +echo $ifcst + if [ $ifcst -le 99 ]; then + if [ $ifcst -le 9 ]; then + ifcst_str="00"$ifcst + else + ifcst_str="0"$ifcst + fi + else + ifcst_str="$ifcst" + fi + echo $ifcst_str +# +if [ $file_fmt == "grib2" ] || [ $file_fmt == "GRIB2" ]; then + wget -c https://nomads.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/gfs.$yyyymmdd/$hh/gfs.t${hh}z.pgrb2.0p25.f${ifcst_str} +else + wget -c https://nomads.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/gfs.$yyyymmdd/$hh/gfs.t${hh}z.atmf${ifcst_str}.nemsio + wget -c https://nomads.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/gfs.$yyyymmdd/$hh/gfs.t${hh}z.sfcf${ifcst_str}.nemsio +fi +# +ifcst=$[$ifcst+$nfcst_int] +done diff --git a/ush/config_defaults.sh b/ush/config_defaults.sh index be318c59c..23254e7da 100644 --- a/ush/config_defaults.sh +++ b/ush/config_defaults.sh @@ -397,6 +397,19 @@ FV3GFS_FILE_FMT_LBCS="nemsio" # #----------------------------------------------------------------------- # +# Set NOMADS online data associated parameters. Definitions: +# +# NOMADS: +# Flag controlling whether or not using NOMADS online data +# +# NOMADS_file_type +# Flag controlling the format of data +# +NOMADS="FALSE" +NOMADS_file_type="nemsio" +# +#----------------------------------------------------------------------- +# # User-staged external model directories and files. Definitions: # # EXTRN_MDL_SOURCE_DIR_ICS: diff --git a/ush/create_model_config_files.sh b/ush/create_model_config_files.sh new file mode 100644 index 000000000..d2f9fd357 --- /dev/null +++ b/ush/create_model_config_files.sh @@ -0,0 +1,182 @@ +# +#----------------------------------------------------------------------- +# +# This file defines a function that creates a model configuration file +# for each cycle to be run. +# +#----------------------------------------------------------------------- +# +function create_model_config_files() { +# +#----------------------------------------------------------------------- +# +# Save current shell options (in a global array). Then set new options +# for this script/function. +# +#----------------------------------------------------------------------- +# + { save_shell_opts; set -u -x; } > /dev/null 2>&1 +# +#----------------------------------------------------------------------- +# +# Get the full path to the file in which this script/function is located +# (scrfunc_fp), the name of that file (scrfunc_fn), and the directory in +# which the file is located (scrfunc_dir). +# +#----------------------------------------------------------------------- +# + local scrfunc_fp=$( readlink -f "${BASH_SOURCE[0]}" ) + local scrfunc_fn=$( basename "${scrfunc_fp}" ) + local scrfunc_dir=$( dirname "${scrfunc_fp}" ) +# +#----------------------------------------------------------------------- +# +# Get the name of this function. +# +#----------------------------------------------------------------------- +# + local func_name="${FUNCNAME[0]}" +# +#----------------------------------------------------------------------- +# +# Specify the set of valid argument names for this script/function. Then +# process the arguments provided to this script/function (which should +# consist of a set of name-value pairs of the form arg1="value1", etc). +# +#----------------------------------------------------------------------- +# + local valid_args=() + process_args valid_args "$@" +# +#----------------------------------------------------------------------- +# +# For debugging purposes, print out values of arguments passed to this +# script. Note that these will be printed out only if VERBOSE is set to +# TRUE. +# +#----------------------------------------------------------------------- +# + print_input_args valid_args +# +#----------------------------------------------------------------------- +# +# Declare local variables. +# +#----------------------------------------------------------------------- +# + local i \ + cdate \ + cycle_dir \ + model_config_fp \ + yyyy \ + mm \ + dd \ + hh \ + mm \ + dot_quilting_dot \ + dot_print_esmf_dot +# +#----------------------------------------------------------------------- +# +# Create a model configuration file within each cycle directory. +# +#----------------------------------------------------------------------- +# + print_info_msg "$VERBOSE" " +Creating a model configuration file (\"${MODEL_CONFIG_FN}\") within each +cycle directory..." + + for (( i=0; i<${NUM_CYCLES}; i++ )); do + + cdate="${ALL_CDATES[$i]}" + cycle_dir="${CYCLE_BASEDIR}/$cdate" +# +# Copy template of cycle-dependent model configure files from the templates +# directory to the current cycle directory. +# + model_config_fp="${cycle_dir}/${MODEL_CONFIG_FN}" + cp_vrfy "${MODEL_CONFIG_TMPL_FP}" "${model_config_fp}" +# +# Extract from cdate the starting year, month, day, and hour of the forecast. +# + yyyy=${cdate:0:4} + mm=${cdate:4:2} + dd=${cdate:6:2} + hh=${cdate:8:2} +# +# Set parameters in the model configure file. +# + dot_quilting_dot="."${QUILTING,,}"." + dot_print_esmf_dot="."${PRINT_ESMF,,}"." + + set_file_param "${model_config_fp}" "PE_MEMBER01" "${PE_MEMBER01}" + set_file_param "${model_config_fp}" "dt_atmos" "${DT_ATMOS}" + set_file_param "${model_config_fp}" "start_year" "$yyyy" + set_file_param "${model_config_fp}" "start_month" "$mm" + set_file_param "${model_config_fp}" "start_day" "$dd" + set_file_param "${model_config_fp}" "start_hour" "$hh" + set_file_param "${model_config_fp}" "nhours_fcst" "${FCST_LEN_HRS}" + set_file_param "${model_config_fp}" "ncores_per_node" "${NCORES_PER_NODE}" + set_file_param "${model_config_fp}" "quilting" "${dot_quilting_dot}" + set_file_param "${model_config_fp}" "print_esmf" "${dot_print_esmf_dot}" +# +#----------------------------------------------------------------------- +# +# If the write component is to be used, then a set of parameters, in- +# cluding those that define the write component's output grid, need to +# be specified in the model configuration file (model_config_fp). This +# is done by appending a template file (in which some write-component +# parameters are set to actual values while others are set to placehol- +# ders) to model_config_fp and then replacing the placeholder values in +# the (new) model_config_fp file with actual values. The full path of +# this template file is specified in the variable WRTCMP_PA RAMS_TEMP- +# LATE_FP. +# +#----------------------------------------------------------------------- +# + if [ "$QUILTING" = "TRUE" ]; then + + cat ${WRTCMP_PARAMS_TMPL_FP} >> ${model_config_fp} + + set_file_param "${model_config_fp}" "write_groups" "$WRTCMP_write_groups" + set_file_param "${model_config_fp}" "write_tasks_per_group" "$WRTCMP_write_tasks_per_group" + + set_file_param "${model_config_fp}" "output_grid" "\'$WRTCMP_output_grid\'" + set_file_param "${model_config_fp}" "cen_lon" "$WRTCMP_cen_lon" + set_file_param "${model_config_fp}" "cen_lat" "$WRTCMP_cen_lat" + set_file_param "${model_config_fp}" "lon1" "$WRTCMP_lon_lwr_left" + set_file_param "${model_config_fp}" "lat1" "$WRTCMP_lat_lwr_left" + + if [ "${WRTCMP_output_grid}" = "rotated_latlon" ]; then + set_file_param "${model_config_fp}" "lon2" "$WRTCMP_lon_upr_rght" + set_file_param "${model_config_fp}" "lat2" "$WRTCMP_lat_upr_rght" + set_file_param "${model_config_fp}" "dlon" "$WRTCMP_dlon" + set_file_param "${model_config_fp}" "dlat" "$WRTCMP_dlat" + elif [ "${WRTCMP_output_grid}" = "lambert_conformal" ]; then + set_file_param "${model_config_fp}" "stdlat1" "$WRTCMP_stdlat1" + set_file_param "${model_config_fp}" "stdlat2" "$WRTCMP_stdlat2" + set_file_param "${model_config_fp}" "nx" "$WRTCMP_nx" + set_file_param "${model_config_fp}" "ny" "$WRTCMP_ny" + set_file_param "${model_config_fp}" "dx" "$WRTCMP_dx" + set_file_param "${model_config_fp}" "dy" "$WRTCMP_dy" + elif [ "${WRTCMP_output_grid}" = "regional_latlon" ]; then + set_file_param "${model_config_fp}" "lon2" "$WRTCMP_lon_upr_rght" + set_file_param "${model_config_fp}" "lat2" "$WRTCMP_lat_upr_rght" + set_file_param "${model_config_fp}" "dlon" "$WRTCMP_dlon" + set_file_param "${model_config_fp}" "dlat" "$WRTCMP_dlat" + fi + + fi + + done +# +#----------------------------------------------------------------------- +# +# Restore the shell options saved at the beginning of this script/function. +# +#----------------------------------------------------------------------- +# + { restore_shell_opts; } > /dev/null 2>&1 + +} + diff --git a/ush/generate_FV3LAM_wflow.sh b/ush/generate_FV3LAM_wflow.sh index 8cf974704..6d9ce5798 100755 --- a/ush/generate_FV3LAM_wflow.sh +++ b/ush/generate_FV3LAM_wflow.sh @@ -1038,6 +1038,13 @@ Stopping. " exit 1 fi +source $exptdir/var_defns.sh +if [ "${NOMADS}" = "TRUE" ]; then + echo "Getting NOMADS online data" + echo "NOMADS_file_type=" $NOMADS_file_type +cd $exptdir +$ushdir/NOMADS_get_extrn_mdl_files.sh $DATE_FIRST_CYCL $CYCL_HRS $NOMADS_file_type $FCST_LEN_HRS $LBC_SPEC_INTVL_HRS +fi diff --git a/ush/valid_param_vals.sh b/ush/valid_param_vals.sh index fd5acf70b..fbd0cbb6f 100644 --- a/ush/valid_param_vals.sh +++ b/ush/valid_param_vals.sh @@ -48,6 +48,8 @@ valid_vals_QUILTING=("TRUE" "true" "YES" "yes" "FALSE" "false" "NO" "no") valid_vals_PRINT_ESMF=("TRUE" "true" "YES" "yes" "FALSE" "false" "NO" "no") valid_vals_USE_CRON_TO_RELAUNCH=("TRUE" "true" "YES" "yes" "FALSE" "false" "NO" "no") valid_vals_DOT_OR_USCORE=("." "_") +valid_vals_NOMADS=("TRUE" "true" "YES" "yes" "FALSE" "false" "NO" "no") +valid_vals_NOMADS_file_type=("GRIB2" "grib2" "NEMSIO" "nemsio") valid_vals_DO_ENSEMBLE=("TRUE" "true" "YES" "yes" "FALSE" "false" "NO" "no") valid_vals_DO_SHUM=("TRUE" "true" "YES" "yes" "FALSE" "false" "NO" "no") valid_vals_DO_SPPT=("TRUE" "true" "YES" "yes" "FALSE" "false" "NO" "no") From 465416ffce2bd428f20483734df4658e1d422f9f Mon Sep 17 00:00:00 2001 From: JeffBeck-NOAA <55201531+JeffBeck-NOAA@users.noreply.github.com> Date: Thu, 10 Sep 2020 16:21:25 -0600 Subject: [PATCH 13/19] Activation/deactivation of ad-hoc stochastic physics schemes (#284) * Remove all references to /lfs3 on Jet * Add Ben and Ratko to the CODEOWNERS file * Replace hard-coded make_orog module file with build-level module file in UFS_UTILS * Remove hard-coded make_sfc_climo module file * Add changes for merged chgres_cube code * Add changes for merged chgres_cube code * Minor tweak to FCST_LEN_HRS default in config.community.sh * Changes to make the release version of chgres_cube run in regional_workflow * Changes for regional_grid build on Jet * Changes to regional_grid build for Hera * Change regional_grid makefile for hera * Remove leading zero from FCST_LEN_HRS in config.community.sh * Remove /sorc directory * Remove build module files for codes originally in the regional_workflow repository. Remove run-time make_grid module file for all platforms. Will be sourced from UFS_UTILS from now on. * Update regional grid template for newest code * Copy make_grid module file from UFS_UTILS * Add make_grid.local file for most platforms * Remove alpha and kappa parameters from the regional_grid namelist * Modifications to file type conventions in the chgres_cube namelist for FV3GFS and GSMGFS nemsio files * Set convert_nst=False for global grib2 FV3GFS files when running chgres_cube * Add tracers back into nemsio file processing * Changes to the make_lbcs ex-script (remove all surface-related variables) * Fix for modulefiles * Fixes after merging authoritative repo into fork * Add Thompson climo to chgres_cube namelist for appropriate external model/SDF combinations * Commit new locations for Thompson climo fix file * Change FIXsar to FIXLAM * Change gfs_bndy.nc to gfs.bndy.nc * Move file * Bug fixes to setup.sh and exregional_make_ics.sh * Add support for NAM grib2 files * Path fix * Typo fix * Fix extension on UPP grib2 files * Bug fix for if statement * Add .grib2 extension to soft links * Fix nsoill_out values based on LSM scheme in CCPP suite * Fix grib2 extensions * Add if statement for varmap tables when using Thompson MP and initializing from non-RAP/HRRR data * Final modifications to support NAM grib2 files in regional_workflow * Set climo as default for soil variables when using HRRRX (user will need change this if they know these variables are available for the dates they are running). * Add FV3_CPT_v0 to varmap if statement * Changes to post file names to make model lowercase and move ${fhr} to three values instead of two * Change "rrfs" to "${NET}" instead * Revert "Add FV3_CPT_v0 to varmap if statement" This reverts commit b04ad0b3c8c554f664c6790030a4f33b5a395023. * Add if statement to set all ad-hoc scheme magnitudes to -999.0 if not being used. --- jobs/JREGIONAL_MAKE_ICS | 11 - jobs/JREGIONAL_MAKE_LBCS | 11 - modulefiles/codes/cheyenne/global_equiv_resol | 10 - modulefiles/codes/cheyenne/mosaic_file | 10 - modulefiles/codes/cheyenne/regional_grid | 10 - modulefiles/codes/hera/global_equiv_resol | 7 - modulefiles/codes/hera/mosaic_file | 7 - modulefiles/codes/hera/regional_grid | 7 - modulefiles/codes/jet/global_equiv_resol | 7 - modulefiles/codes/jet/mosaic_file | 7 - modulefiles/codes/jet/regional_grid | 8 - modulefiles/codes/odin/global_equiv_resol | 13 - modulefiles/codes/odin/mosaic_file | 13 - modulefiles/codes/odin/regional_grid | 11 - modulefiles/codes/stampede/global_equiv_resol | 10 - modulefiles/codes/stampede/mosaic_file | 12 - modulefiles/codes/stampede/regional_grid | 10 - modulefiles/tasks/cheyenne/make_grid | 15 - modulefiles/tasks/cheyenne/make_grid.local | 2 + modulefiles/tasks/hera/make_grid | 15 - modulefiles/tasks/hera/make_grid.local | 6 + modulefiles/tasks/hera/make_ics.local | 4 +- modulefiles/tasks/hera/make_lbcs.local | 4 +- modulefiles/tasks/jet/make_grid | 15 - modulefiles/tasks/jet/make_grid.local | 6 + modulefiles/tasks/jet/make_ics.local | 4 +- modulefiles/tasks/jet/make_lbcs.local | 4 +- modulefiles/tasks/odin/make_grid | 14 - modulefiles/tasks/stampede/make_grid | 11 - modulefiles/tasks/wcoss_cray/make_grid.local | 33 + .../tasks/wcoss_dell_p3/make_grid.local | 2 + scripts/exregional_make_grid.sh | 4 +- scripts/exregional_make_ics.sh | 389 ++-- scripts/exregional_make_lbcs.sh | 260 +-- sorc/global_equiv_resol.fd/Makefile_cheyenne | 29 - sorc/global_equiv_resol.fd/Makefile_hera | 29 - sorc/global_equiv_resol.fd/Makefile_jet | 29 - sorc/global_equiv_resol.fd/Makefile_odin | 29 - sorc/global_equiv_resol.fd/Makefile_stampede | 29 - sorc/global_equiv_resol.fd/Makefile_theia | 29 - sorc/global_equiv_resol.fd/compile.sh | 9 - .../global_equiv_resol.f90 | 185 -- sorc/mosaic_file.fd/Makefile_cheyenne | 29 - sorc/mosaic_file.fd/Makefile_hera | 29 - sorc/mosaic_file.fd/Makefile_jet | 29 - sorc/mosaic_file.fd/Makefile_odin | 29 - sorc/mosaic_file.fd/Makefile_stampede | 29 - sorc/mosaic_file.fd/Makefile_theia | 29 - sorc/mosaic_file.fd/compile.sh | 9 - sorc/mosaic_file.fd/mosaic_file.f90 | 126 -- sorc/regional_grid.fd/Makefile_cheyenne | 29 - sorc/regional_grid.fd/Makefile_hera | 29 - sorc/regional_grid.fd/Makefile_jet | 29 - sorc/regional_grid.fd/Makefile_odin | 29 - sorc/regional_grid.fd/Makefile_stampede | 29 - sorc/regional_grid.fd/Makefile_theia | 29 - sorc/regional_grid.fd/compile.sh | 9 - sorc/regional_grid.fd/gen_schmidt.f90 | 477 ---- sorc/regional_grid.fd/hgrid_ak.f90 | 104 - sorc/regional_grid.fd/pietc.f90 | 95 - sorc/regional_grid.fd/pkind.f90 | 8 - sorc/regional_grid.fd/pmat.f90 | 1082 --------- sorc/regional_grid.fd/pmat4.f90 | 1924 ----------------- sorc/regional_grid.fd/pmat5.f90 | 791 ------- sorc/regional_grid.fd/psym2.f90 | 498 ----- sorc/regional_grid.fd/regional_grid.f90 | 125 -- sorc/regional_grid.fd/regional_grid.nml | 100 - ush/config.community.sh | 3 +- ush/config_defaults.sh | 10 + ush/generate_FV3LAM_wflow.sh | 39 +- ush/get_extrn_mdl_file_dir_info.sh | 57 + ush/load_modules_run_task.sh | 38 +- ush/set_extrn_mdl_params.sh | 44 +- ush/setup.sh | 26 +- ush/templates/regional_grid.nml | 14 - ush/valid_param_vals.sh | 4 +- 76 files changed, 509 insertions(+), 6742 deletions(-) delete mode 100644 modulefiles/codes/cheyenne/global_equiv_resol delete mode 100644 modulefiles/codes/cheyenne/mosaic_file delete mode 100644 modulefiles/codes/cheyenne/regional_grid delete mode 100644 modulefiles/codes/hera/global_equiv_resol delete mode 100644 modulefiles/codes/hera/mosaic_file delete mode 100644 modulefiles/codes/hera/regional_grid delete mode 100644 modulefiles/codes/jet/global_equiv_resol delete mode 100644 modulefiles/codes/jet/mosaic_file delete mode 100644 modulefiles/codes/jet/regional_grid delete mode 100644 modulefiles/codes/odin/global_equiv_resol delete mode 100644 modulefiles/codes/odin/mosaic_file delete mode 100644 modulefiles/codes/odin/regional_grid delete mode 100644 modulefiles/codes/stampede/global_equiv_resol delete mode 100644 modulefiles/codes/stampede/mosaic_file delete mode 100644 modulefiles/codes/stampede/regional_grid delete mode 100644 modulefiles/tasks/cheyenne/make_grid create mode 100644 modulefiles/tasks/cheyenne/make_grid.local delete mode 100644 modulefiles/tasks/hera/make_grid create mode 100644 modulefiles/tasks/hera/make_grid.local delete mode 100644 modulefiles/tasks/jet/make_grid create mode 100644 modulefiles/tasks/jet/make_grid.local delete mode 100644 modulefiles/tasks/odin/make_grid delete mode 100644 modulefiles/tasks/stampede/make_grid create mode 100644 modulefiles/tasks/wcoss_cray/make_grid.local create mode 100644 modulefiles/tasks/wcoss_dell_p3/make_grid.local delete mode 100644 sorc/global_equiv_resol.fd/Makefile_cheyenne delete mode 100644 sorc/global_equiv_resol.fd/Makefile_hera delete mode 100644 sorc/global_equiv_resol.fd/Makefile_jet delete mode 100644 sorc/global_equiv_resol.fd/Makefile_odin delete mode 100644 sorc/global_equiv_resol.fd/Makefile_stampede delete mode 100644 sorc/global_equiv_resol.fd/Makefile_theia delete mode 100755 sorc/global_equiv_resol.fd/compile.sh delete mode 100644 sorc/global_equiv_resol.fd/global_equiv_resol.f90 delete mode 100644 sorc/mosaic_file.fd/Makefile_cheyenne delete mode 100644 sorc/mosaic_file.fd/Makefile_hera delete mode 100644 sorc/mosaic_file.fd/Makefile_jet delete mode 100644 sorc/mosaic_file.fd/Makefile_odin delete mode 100644 sorc/mosaic_file.fd/Makefile_stampede delete mode 100644 sorc/mosaic_file.fd/Makefile_theia delete mode 100755 sorc/mosaic_file.fd/compile.sh delete mode 100644 sorc/mosaic_file.fd/mosaic_file.f90 delete mode 100644 sorc/regional_grid.fd/Makefile_cheyenne delete mode 100644 sorc/regional_grid.fd/Makefile_hera delete mode 100644 sorc/regional_grid.fd/Makefile_jet delete mode 100644 sorc/regional_grid.fd/Makefile_odin delete mode 100644 sorc/regional_grid.fd/Makefile_stampede delete mode 100644 sorc/regional_grid.fd/Makefile_theia delete mode 100755 sorc/regional_grid.fd/compile.sh delete mode 100644 sorc/regional_grid.fd/gen_schmidt.f90 delete mode 100644 sorc/regional_grid.fd/hgrid_ak.f90 delete mode 100644 sorc/regional_grid.fd/pietc.f90 delete mode 100644 sorc/regional_grid.fd/pkind.f90 delete mode 100644 sorc/regional_grid.fd/pmat.f90 delete mode 100644 sorc/regional_grid.fd/pmat4.f90 delete mode 100644 sorc/regional_grid.fd/pmat5.f90 delete mode 100644 sorc/regional_grid.fd/psym2.f90 delete mode 100644 sorc/regional_grid.fd/regional_grid.f90 delete mode 100644 sorc/regional_grid.fd/regional_grid.nml diff --git a/jobs/JREGIONAL_MAKE_ICS b/jobs/JREGIONAL_MAKE_ICS index 2ddf94bac..4ca00af53 100755 --- a/jobs/JREGIONAL_MAKE_ICS +++ b/jobs/JREGIONAL_MAKE_ICS @@ -91,16 +91,6 @@ esac # #----------------------------------------------------------------------- # -# Find the directory in which the wgrib2 executable is located. -# -#----------------------------------------------------------------------- -# -wgrib2_dir=$( which wgrib2 ) || print_err_msg_exit "\ -Directory in which the wgrib2 executable is located could not be found: - wgrib2_dir = \"${wgrib2_dir}\"" -# -#----------------------------------------------------------------------- -# # Set the name of and create the directory in which the output from this # script will be placed (if that directory doesn't already exist). # @@ -117,7 +107,6 @@ mkdir_vrfy -p "${ics_dir}" # $SCRIPTSDIR/exregional_make_ics.sh \ ics_dir="${ics_dir}" \ - wgrib2_dir="${wgrib2_dir}" \ APRUN="${APRUN}" || \ print_err_msg_exit "\ Call to ex-script corresponding to J-job \"${scrfunc_fn}\" failed." diff --git a/jobs/JREGIONAL_MAKE_LBCS b/jobs/JREGIONAL_MAKE_LBCS index 49923a0db..43bd27b5d 100755 --- a/jobs/JREGIONAL_MAKE_LBCS +++ b/jobs/JREGIONAL_MAKE_LBCS @@ -92,16 +92,6 @@ esac # #----------------------------------------------------------------------- # -# Find the directory in which the wgrib2 executable is located. -# -#----------------------------------------------------------------------- -# -wgrib2_dir=$( which wgrib2 ) || print_err_msg_exit "\ -Directory in which the wgrib2 executable is located could not be found: - wgrib2_dir = \"${wgrib2_dir}\"" -# -#----------------------------------------------------------------------- -# # Set the name of and create the directory in which the output from this # script will be placed (if it doesn't already exist). # @@ -118,7 +108,6 @@ mkdir_vrfy -p "${lbcs_dir}" # $SCRIPTSDIR/exregional_make_lbcs.sh \ lbcs_dir="${lbcs_dir}" \ - wgrib2_dir="${wgrib2_dir}" \ APRUN="${APRUN}" || \ print_err_msg_exit "\ Call to ex-script corresponding to J-job \"${scrfunc_fn}\" failed." diff --git a/modulefiles/codes/cheyenne/global_equiv_resol b/modulefiles/codes/cheyenne/global_equiv_resol deleted file mode 100644 index d50a83ea0..000000000 --- a/modulefiles/codes/cheyenne/global_equiv_resol +++ /dev/null @@ -1,10 +0,0 @@ -#%Module##################################################### -## Module file for global_equiv_resol on NCAR/UCAR Cheyenne -############################################################# -module purge -module load ncarenv/1.3 -module load intel/18.0.5 -module load ncarcompilers/0.5.0 -module load netcdf/4.6.3 -# No hdf5 loaded since netcdf and hdf5 reside together on cheyenne - diff --git a/modulefiles/codes/cheyenne/mosaic_file b/modulefiles/codes/cheyenne/mosaic_file deleted file mode 100644 index a24cf1ce6..000000000 --- a/modulefiles/codes/cheyenne/mosaic_file +++ /dev/null @@ -1,10 +0,0 @@ -#%Module##################################################### -## Module file for mosaic_file on NCAR/UCAR Cheyenne -############################################################# -module purge -module load ncarenv/1.3 -module load intel/18.0.5 -module load ncarcompilers/0.5.0 -module load impi/2018.4.274 -module load netcdf/4.6.3 -# No hdf5 loaded since netcdf and hdf5 reside together on cheyenne diff --git a/modulefiles/codes/cheyenne/regional_grid b/modulefiles/codes/cheyenne/regional_grid deleted file mode 100644 index bd3d7874c..000000000 --- a/modulefiles/codes/cheyenne/regional_grid +++ /dev/null @@ -1,10 +0,0 @@ -#%Module##################################################### -## Module file for regional_grid on NCAR/UCAR Cheyenne -############################################################# -module purge -module load ncarenv/1.3 -module load intel/18.0.5 -module load ncarcompilers/0.5.0 -module load impi/2018.4.274 -module load netcdf/4.6.3 -# No hdf5 loaded since netcdf and hdf5 reside together on cheyenne diff --git a/modulefiles/codes/hera/global_equiv_resol b/modulefiles/codes/hera/global_equiv_resol deleted file mode 100644 index 532e7fb65..000000000 --- a/modulefiles/codes/hera/global_equiv_resol +++ /dev/null @@ -1,7 +0,0 @@ -#%Module##################################################### -## Module file for regional_grid -############################################################# -module purge -module load intel/18.0.5.274 -module load netcdf/4.6.1 -module load hdf5/1.10.4 diff --git a/modulefiles/codes/hera/mosaic_file b/modulefiles/codes/hera/mosaic_file deleted file mode 100644 index 532e7fb65..000000000 --- a/modulefiles/codes/hera/mosaic_file +++ /dev/null @@ -1,7 +0,0 @@ -#%Module##################################################### -## Module file for regional_grid -############################################################# -module purge -module load intel/18.0.5.274 -module load netcdf/4.6.1 -module load hdf5/1.10.4 diff --git a/modulefiles/codes/hera/regional_grid b/modulefiles/codes/hera/regional_grid deleted file mode 100644 index 532e7fb65..000000000 --- a/modulefiles/codes/hera/regional_grid +++ /dev/null @@ -1,7 +0,0 @@ -#%Module##################################################### -## Module file for regional_grid -############################################################# -module purge -module load intel/18.0.5.274 -module load netcdf/4.6.1 -module load hdf5/1.10.4 diff --git a/modulefiles/codes/jet/global_equiv_resol b/modulefiles/codes/jet/global_equiv_resol deleted file mode 100644 index 532e7fb65..000000000 --- a/modulefiles/codes/jet/global_equiv_resol +++ /dev/null @@ -1,7 +0,0 @@ -#%Module##################################################### -## Module file for regional_grid -############################################################# -module purge -module load intel/18.0.5.274 -module load netcdf/4.6.1 -module load hdf5/1.10.4 diff --git a/modulefiles/codes/jet/mosaic_file b/modulefiles/codes/jet/mosaic_file deleted file mode 100644 index 532e7fb65..000000000 --- a/modulefiles/codes/jet/mosaic_file +++ /dev/null @@ -1,7 +0,0 @@ -#%Module##################################################### -## Module file for regional_grid -############################################################# -module purge -module load intel/18.0.5.274 -module load netcdf/4.6.1 -module load hdf5/1.10.4 diff --git a/modulefiles/codes/jet/regional_grid b/modulefiles/codes/jet/regional_grid deleted file mode 100644 index c5efa3218..000000000 --- a/modulefiles/codes/jet/regional_grid +++ /dev/null @@ -1,8 +0,0 @@ -#%Module##################################################### -## Module file for regional_grid -############################################################# -module purge -module load intel/18.0.5.274 -module load netcdf/4.7.0 -module load hdf5/1.10.5 - diff --git a/modulefiles/codes/odin/global_equiv_resol b/modulefiles/codes/odin/global_equiv_resol deleted file mode 100644 index 123d202ea..000000000 --- a/modulefiles/codes/odin/global_equiv_resol +++ /dev/null @@ -1,13 +0,0 @@ -#%Module##################################################### -## Module file for regional_grid -############################################################# -module load PrgEnv-intel -module swap intel/19.0.5.281 -module load cray-mpich/7.7.10 -module load cray-libsci -module load cray-netcdf-hdf5parallel -module load cray-parallel-netcdf -module load cray-hdf5-parallel - -export NETCDF=/opt/cray/pe/netcdf-hdf5parallel/4.6.3.2/INTEL/19.0 -export HDF5=/opt/cray/pe/hdf5-parallel/1.10.5.2/INTEL/19.0 diff --git a/modulefiles/codes/odin/mosaic_file b/modulefiles/codes/odin/mosaic_file deleted file mode 100644 index 123d202ea..000000000 --- a/modulefiles/codes/odin/mosaic_file +++ /dev/null @@ -1,13 +0,0 @@ -#%Module##################################################### -## Module file for regional_grid -############################################################# -module load PrgEnv-intel -module swap intel/19.0.5.281 -module load cray-mpich/7.7.10 -module load cray-libsci -module load cray-netcdf-hdf5parallel -module load cray-parallel-netcdf -module load cray-hdf5-parallel - -export NETCDF=/opt/cray/pe/netcdf-hdf5parallel/4.6.3.2/INTEL/19.0 -export HDF5=/opt/cray/pe/hdf5-parallel/1.10.5.2/INTEL/19.0 diff --git a/modulefiles/codes/odin/regional_grid b/modulefiles/codes/odin/regional_grid deleted file mode 100644 index 2d4b9a9a3..000000000 --- a/modulefiles/codes/odin/regional_grid +++ /dev/null @@ -1,11 +0,0 @@ -#%Module##################################################### -## Module file for regional_grid -############################################################# -module load PrgEnv-intel -module swap intel/19.0.5.281 -module load cray-mpich/7.7.10 -module load cray-libsci -module load cray-netcdf-hdf5parallel -module load cray-parallel-netcdf -module load cray-hdf5-parallel - diff --git a/modulefiles/codes/stampede/global_equiv_resol b/modulefiles/codes/stampede/global_equiv_resol deleted file mode 100644 index 0f78231fa..000000000 --- a/modulefiles/codes/stampede/global_equiv_resol +++ /dev/null @@ -1,10 +0,0 @@ -#%Module##################################################### -## Module file for regional_grid -############################################################# -module load intel/18.0.2 -module load impi/18.0.2 -module load hdf5/1.10.4 -module load netcdf/4.6.2 - -setenv NETCDF /opt/apps/intel18/netcdf/4.6.2/x86_64 -setenv HDF5 /opt/apps/intel18/hdf5/1.10.4/x86_64 diff --git a/modulefiles/codes/stampede/mosaic_file b/modulefiles/codes/stampede/mosaic_file deleted file mode 100644 index bab633db7..000000000 --- a/modulefiles/codes/stampede/mosaic_file +++ /dev/null @@ -1,12 +0,0 @@ -#%Module##################################################### -## Module file for regional_grid -############################################################# - - -module load intel/18.0.2 -module load impi/18.0.2 -module load hdf5/1.10.4 -module load netcdf/4.6.2 - -setenv NETCDF /opt/apps/intel18/netcdf/4.6.2/x86_64 -setenv HDF5 /opt/apps/intel18/hdf5/1.10.4/x86_64 diff --git a/modulefiles/codes/stampede/regional_grid b/modulefiles/codes/stampede/regional_grid deleted file mode 100644 index 0f78231fa..000000000 --- a/modulefiles/codes/stampede/regional_grid +++ /dev/null @@ -1,10 +0,0 @@ -#%Module##################################################### -## Module file for regional_grid -############################################################# -module load intel/18.0.2 -module load impi/18.0.2 -module load hdf5/1.10.4 -module load netcdf/4.6.2 - -setenv NETCDF /opt/apps/intel18/netcdf/4.6.2/x86_64 -setenv HDF5 /opt/apps/intel18/hdf5/1.10.4/x86_64 diff --git a/modulefiles/tasks/cheyenne/make_grid b/modulefiles/tasks/cheyenne/make_grid deleted file mode 100644 index aeb62bab7..000000000 --- a/modulefiles/tasks/cheyenne/make_grid +++ /dev/null @@ -1,15 +0,0 @@ -#%Module##################################################### - -module purge - -module load ncarenv/1.3 -module load intel/19.0.2 -module load ncarcompilers/0.5.0 -module load netcdf/4.6.3 - -if [module-info mode load] { - system "ncar_pylib /glade/p/ral/jntp/UFS_CAM/ncar_pylib_20200427" -} -if [module-info mode remove] { - system "deactivate" -} diff --git a/modulefiles/tasks/cheyenne/make_grid.local b/modulefiles/tasks/cheyenne/make_grid.local new file mode 100644 index 000000000..4a271536c --- /dev/null +++ b/modulefiles/tasks/cheyenne/make_grid.local @@ -0,0 +1,2 @@ + +ncar_pylib /glade/p/ral/jntp/UFS_CAM/ncar_pylib_20200427 diff --git a/modulefiles/tasks/hera/make_grid b/modulefiles/tasks/hera/make_grid deleted file mode 100644 index 12dc7ae10..000000000 --- a/modulefiles/tasks/hera/make_grid +++ /dev/null @@ -1,15 +0,0 @@ -#%Module##################################################### -## Module file for make_grid task. -############################################################# - -module purge - -module load intel/18.0.5.274 -module load netcdf/4.7.0 -module load hdf5/1.10.5 - -module use -a /contrib/miniconda3/modulefiles -module load miniconda3 -if [module-info mode load] { - system "conda activate regional_workflow" -} diff --git a/modulefiles/tasks/hera/make_grid.local b/modulefiles/tasks/hera/make_grid.local new file mode 100644 index 000000000..e7d11ba40 --- /dev/null +++ b/modulefiles/tasks/hera/make_grid.local @@ -0,0 +1,6 @@ + +module use -a /contrib/miniconda3/modulefiles +module load miniconda3 +if [module-info mode load] { + system "conda activate regional_workflow" +} diff --git a/modulefiles/tasks/hera/make_ics.local b/modulefiles/tasks/hera/make_ics.local index ff1cad391..aab8f50ad 100644 --- a/modulefiles/tasks/hera/make_ics.local +++ b/modulefiles/tasks/hera/make_ics.local @@ -2,4 +2,6 @@ module load wgrib2 module use -a /contrib/miniconda3/modulefiles module load miniconda3 -conda activate regional_workflow +if [module-info mode load] { + system "conda activate regional_workflow" +} diff --git a/modulefiles/tasks/hera/make_lbcs.local b/modulefiles/tasks/hera/make_lbcs.local index ff1cad391..aab8f50ad 100644 --- a/modulefiles/tasks/hera/make_lbcs.local +++ b/modulefiles/tasks/hera/make_lbcs.local @@ -2,4 +2,6 @@ module load wgrib2 module use -a /contrib/miniconda3/modulefiles module load miniconda3 -conda activate regional_workflow +if [module-info mode load] { + system "conda activate regional_workflow" +} diff --git a/modulefiles/tasks/jet/make_grid b/modulefiles/tasks/jet/make_grid deleted file mode 100644 index 12dc7ae10..000000000 --- a/modulefiles/tasks/jet/make_grid +++ /dev/null @@ -1,15 +0,0 @@ -#%Module##################################################### -## Module file for make_grid task. -############################################################# - -module purge - -module load intel/18.0.5.274 -module load netcdf/4.7.0 -module load hdf5/1.10.5 - -module use -a /contrib/miniconda3/modulefiles -module load miniconda3 -if [module-info mode load] { - system "conda activate regional_workflow" -} diff --git a/modulefiles/tasks/jet/make_grid.local b/modulefiles/tasks/jet/make_grid.local new file mode 100644 index 000000000..e7d11ba40 --- /dev/null +++ b/modulefiles/tasks/jet/make_grid.local @@ -0,0 +1,6 @@ + +module use -a /contrib/miniconda3/modulefiles +module load miniconda3 +if [module-info mode load] { + system "conda activate regional_workflow" +} diff --git a/modulefiles/tasks/jet/make_ics.local b/modulefiles/tasks/jet/make_ics.local index d5fa8e56b..d5e37266b 100644 --- a/modulefiles/tasks/jet/make_ics.local +++ b/modulefiles/tasks/jet/make_ics.local @@ -2,4 +2,6 @@ module load wgrib2/2.0.8 module use -a /contrib/miniconda3/modulefiles module load miniconda3 -conda activate regional_workflow +if [module-info mode load] { + system "conda activate regional_workflow" +} diff --git a/modulefiles/tasks/jet/make_lbcs.local b/modulefiles/tasks/jet/make_lbcs.local index d5fa8e56b..d5e37266b 100644 --- a/modulefiles/tasks/jet/make_lbcs.local +++ b/modulefiles/tasks/jet/make_lbcs.local @@ -2,4 +2,6 @@ module load wgrib2/2.0.8 module use -a /contrib/miniconda3/modulefiles module load miniconda3 -conda activate regional_workflow +if [module-info mode load] { + system "conda activate regional_workflow" +} diff --git a/modulefiles/tasks/odin/make_grid b/modulefiles/tasks/odin/make_grid deleted file mode 100644 index d37cb0e9d..000000000 --- a/modulefiles/tasks/odin/make_grid +++ /dev/null @@ -1,14 +0,0 @@ -#%Module##################################################### -## Module file for make_grid task. -############################################################# - -#module purge - -module load PrgEnv-intel -module swap intel/19.0.5.281 -module load cray-libsci -module load cray-netcdf-hdf5parallel -module load cray-parallel-netcdf -module load cray-hdf5-parallel -module load gcc/6.1.0 -module load slurm diff --git a/modulefiles/tasks/stampede/make_grid b/modulefiles/tasks/stampede/make_grid deleted file mode 100644 index aa867cfbf..000000000 --- a/modulefiles/tasks/stampede/make_grid +++ /dev/null @@ -1,11 +0,0 @@ -#%Module##################################################### -## Module file for make_grid task. -############################################################# - -module purge - -module load intel/18.0.2 -module load impi/18.0.2 -module load hdf5/1.10.4 -module load netcdf/4.6.2 -module load python3/3.7.0 diff --git a/modulefiles/tasks/wcoss_cray/make_grid.local b/modulefiles/tasks/wcoss_cray/make_grid.local new file mode 100644 index 000000000..4bebfc5e7 --- /dev/null +++ b/modulefiles/tasks/wcoss_cray/make_grid.local @@ -0,0 +1,33 @@ +module load modules + +module load xt-lsfhpc +module load ncep +module load alps +module load dvs +module load xpmem +module load ugni +module load craype-network-aries +module load switch +module load rca +module load gni-headers +module load udreg +module load hpss + +module load prod_util +module load g2tmpl-intel/1.4.0 +module load crtm-intel/2.2.6 +module load iobuf/2.0.7 +module load gempak/7.3.0 + +module load nco-gnu-sandybridge/4.4.4 +module load NetCDF-intel-sandybridge/4.2 +module load cfp-intel-sandybridge/1.1.0 +export USE_CFP=YES + +module load grib_util/1.1.0 + +module use -a /gpfs/hps3/emc/nems/noscrub/emc.nemspara/soft/modulefiles +module load esmf/8.0.0 + +module load python/3.6.3 + diff --git a/modulefiles/tasks/wcoss_dell_p3/make_grid.local b/modulefiles/tasks/wcoss_dell_p3/make_grid.local new file mode 100644 index 000000000..b93479d8c --- /dev/null +++ b/modulefiles/tasks/wcoss_dell_p3/make_grid.local @@ -0,0 +1,2 @@ +module load lsf/10.1 +module load python/3.6.3 diff --git a/scripts/exregional_make_grid.sh b/scripts/exregional_make_grid.sh index 977c9c99c..2128e9ddb 100755 --- a/scripts/exregional_make_grid.sh +++ b/scripts/exregional_make_grid.sh @@ -372,9 +372,7 @@ generation executable (exec_fp): 'dely': ${DEL_ANGLE_Y_SG}, 'lx': ${NEG_NX_OF_DOM_WITH_WIDE_HALO}, 'ly': ${NEG_NY_OF_DOM_WITH_WIDE_HALO}, - 'a': ${ESGgrid_ALPHA_PARAM}, - 'k': ${ESGgrid_KAPPA_PARAM}, -} + } " # # Call the python script to create the namelist file. diff --git a/scripts/exregional_make_ics.sh b/scripts/exregional_make_ics.sh index 78ea18949..3549d41c2 100755 --- a/scripts/exregional_make_ics.sh +++ b/scripts/exregional_make_ics.sh @@ -44,7 +44,7 @@ In directory: \"${scrfunc_dir}\" This is the ex-script for the task that generates initial condition (IC), surface, and zeroth hour lateral boundary condition (LBC0) files -for FV3 (in NetCDF format). +(in NetCDF format) for the FV3-LAM. ========================================================================" # #----------------------------------------------------------------------- @@ -56,7 +56,6 @@ for FV3 (in NetCDF format). #----------------------------------------------------------------------- # valid_args=( \ -"wgrib2_dir" \ "ics_dir" \ "APRUN" \ ) @@ -95,34 +94,31 @@ cd_vrfy $workdir # #----------------------------------------------------------------------- # -# Set physics-suite-dependent variables that are needed in the FORTRAN -# namelist file that the chgres executable will read in. +# Set physics-suite-dependent variable mapping table needed in the FORTRAN +# namelist file that the chgres_cube executable will read in. # #----------------------------------------------------------------------- # -phys_suite="" +varmap_file="" case "${CCPP_PHYS_SUITE}" in -"FV3_GFS_2017_gfdlmp" | "FV3_GFS_2017_gfdlmp_regional" ) - phys_suite="GFS" +"FV3_GFS_2017_gfdlmp" | "FV3_GFS_2017_gfdlmp_regional" | "FV3_GFS_v16beta" | \ +"FV3_GFS_v15p2" ) + varmap_file="GFSphys_var_map.txt" ;; -"FV3_GSD_v0" | "FV3_GSD_SAR" | "FV3_GSD_SAR_v1" |"FV3_RRFS_v0" |"FV3_RRFS_v1beta") - phys_suite="GSD" - ;; -"FV3_CPT_v0") - phys_suite="CPT" - ;; -"FV3_GFS_v15p2") - phys_suite="v15p2" - ;; -"FV3_GFS_v16beta") - phys_suite="v16beta" +"FV3_GSD_v0" | "FV3_GSD_SAR" | "FV3_GSD_SAR_v1" | "FV3_RRFS_v0" | \ +"FV3_RRFS_v1beta" ) + if [ "${EXTRN_MDL_NAME_ICS}" = "RAPX" ] || [ "${EXTRN_MDL_NAME_ICS}" = "HRRRX" ]; then + varmap_file="GSDphys_var_map.txt" + elif [ "${EXTRN_MDL_NAME_ICS}" = "NAM" ] || [ "${EXTRN_MDL_NAME_ICS}" = "FV3GFS" ] || \ + [ "${EXTRN_MDL_NAME_ICS}" = "GSMGFS" ]; then + varmap_file="GFSphys_var_map.txt" + fi ;; *) print_err_msg_exit "\ -Physics-suite-dependent namelist variables have not yet been specified -for this physics suite: +A variable mapping table has not yet been defined for this physics suite: CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\"" ;; @@ -131,7 +127,7 @@ esac #----------------------------------------------------------------------- # # Set external-model-dependent variables that are needed in the FORTRAN -# namelist file that the chgres executable will read in. These are de- +# namelist file that the chgres_cube executable will read in. These are de- # scribed below. Note that for a given external model, usually only a # subset of these all variables are set (since some may be irrelevant). # @@ -148,10 +144,10 @@ esac # model that contains the surface fields. # # input_type: -# The "type" of input being provided to chgres. This contains a combi- +# The "type" of input being provided to chgres_cube. This contains a combi- # nation of information on the external model, external model file for- # mat, and maybe other parameters. For clarity, it would be best to -# eliminate this variable in chgres and replace with with 2 or 3 others +# eliminate this variable in chgres_cube and replace with with 2 or 3 others # (e.g. extrn_mdl, extrn_mdl_file_format, etc). # # tracers_input: @@ -167,26 +163,24 @@ esac # ment of tracers should be the name to use for the O3 mixing ratio in # the output file. For GSD physics, three additional tracers -- ice, # rain, and water number concentrations -- may be specified at the end -# of tracers, and these will be calculated by chgres. -# -# internal_GSD: -# Logical variable indicating whether or not to try to read in land sur- -# face model (LSM) variables available in the HRRRX grib2 files created -# after about 2019111500. +# of tracers, and these will be calculated by chgres_cube. # -# numsoil_out: +# nsoill_out: # The number of soil layers to include in the output NetCDF file. # -# replace_FIELD, where FIELD="vgtyp", "sotyp", or "vgfrc": -# Logical variable indicating whether or not to obtain the field in +# FIELD_from_climo, where FIELD = "vgtyp", "sotyp", "vgfrc", "lai", or +# "minmax_vgfrc": +# Logical variable indicating whether or not to obtain the field in # question from climatology instead of the external model. The field in # question is one of vegetation type (FIELD="vgtyp"), soil type (FIELD= -# "sotyp"), and vegetation fraction (FIELD="vgfrc"). If replace_FIELD -# is set to ".true.", then the field is obtained from climatology (re- -# gardless of whether or not it exists in an external model file). If -# it is set to ".false.", then the field is obtained from the external -# model. If the external model file does not provide this field, then -# chgres prints out an error message and stops. +# "sotyp"), vegetation fraction (FIELD="vgfrc"), leaf area index +# (FIELD="lai"), or min/max areal fractional coverage of annual green +# vegetation (FIELD="minmax_vfrr"). If FIELD_from_climo is set to +# ".true.", then the field is obtained from climatology (regardless of +# whether or not it exists in an external model file). If it is set +# to ".false.", then the field is obtained from the external model. +# If "false" is chosen and the external model file does not provide +# this field, then chgres_cube prints out an error message and stops. # # tg3_from_soil: # Logical variable indicating whether or not to set the tg3 soil tempe- # Needs to be verified. @@ -194,8 +188,7 @@ esac # #----------------------------------------------------------------------- # - -# GSK comments about chgres: +# GSK comments about chgres_cube: # # The following are the three atmsopheric tracers that are in the atmo- # spheric analysis (atmanl) nemsio file for CDATE=2017100700: @@ -228,7 +221,6 @@ esac # A non-prognostic variable that appears in the field_table for GSD physics # is cld_amt. Why is that in the field_table at all (since it is a non- # prognostic field), and how should we handle it here?? - # I guess this works for FV3GFS but not for the spectral GFS since these # variables won't exist in the spectral GFS atmanl files. # tracers_input="\"sphum\",\"liq_wat\",\"ice_wat\",\"rainwat\",\"snowwat\",\"graupel\",\"o3mr\"" @@ -243,15 +235,16 @@ fn_grib2="" input_type="" tracers_input="\"\"" tracers="\"\"" -internal_GSD="" -numsoil_out="" +nsoill_out="" geogrid_file_input_grid="\"\"" -replace_vgtyp="" -replace_sotyp="" -replace_vgfrc="" +vgtyp_from_climo="" +sotyp_from_climo="" +vgfrc_from_climo="" +minmax_vgfrc_from_climo="" +lai_from_climo="" tg3_from_soil="" convert_nst="" - +thomp_mp_climo_file="" case "${EXTRN_MDL_NAME_ICS}" in @@ -262,72 +255,77 @@ case "${EXTRN_MDL_NAME_ICS}" in fn_atm_nemsio="${EXTRN_MDL_FNS[0]}" fn_sfc_nemsio="${EXTRN_MDL_FNS[1]}" - input_type="gfs_gaussian" # For spectral GFS Gaussian grid in nemsio format. + input_type="gfs_gaussian_nemsio" # For spectral GFS Gaussian grid in nemsio format. + convert_nst=False tracers_input="[\"spfh\",\"clwmr\",\"o3mr\"]" tracers="[\"sphum\",\"liq_wat\",\"o3mr\"]" +# +# Use Thompson climatology for ice- and water-friendly aerosols if CCPP suite uses Thompson MP +# + if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then + thomp_mp_climo_file="" + elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then + thomp_mp_climo_file="${FIXam}/Thompson_MP_MONTHLY_CLIMO.nc" + else + print_err_msg_exit "\ + The chosen CCPP physics suite is unsupported at this time: + CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\"" + fi - internal_GSD=False - numsoil_out="4" - replace_vgtyp=True - replace_sotyp=True - replace_vgfrc=True + nsoill_out="4" #If the CCPP suites uses RUC-LSM, the scheme will interpolate from 4 to 9 soil levels. + vgtyp_from_climo=True + sotyp_from_climo=True + vgfrc_from_climo=True + minmax_vgfrc_from_climo=True + lai_from_climo=True tg3_from_soil=False - convert_nst=False ;; "FV3GFS") +# +# Use Thompson climatology for ice- and water-friendly aerosols if CCPP suite uses Thompson MP +# + if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then + thomp_mp_climo_file="" + elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then + thomp_mp_climo_file="${FIXam}/Thompson_MP_MONTHLY_CLIMO.nc" + else + print_err_msg_exit "\ + The chosen CCPP physics suite is unsupported as this time: + CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\"" + fi + if [ "${FV3GFS_FILE_FMT_ICS}" = "nemsio" ]; then external_model="FV3GFS" - fn_atm_nemsio="${EXTRN_MDL_FNS[0]}" - fn_sfc_nemsio="${EXTRN_MDL_FNS[1]}" - input_type="gaussian" # For FV3-GFS Gaussian grid in nemsio format. - tracers_input="[\"spfh\",\"clwmr\",\"o3mr\",\"icmr\",\"rwmr\",\"snmr\",\"grle\"]" + tracers="[\"sphum\",\"liq_wat\",\"o3mr\",\"ice_wat\",\"rainwat\",\"snowwat\",\"graupel\"]" -# -# If CCPP is being used, then the list of atmospheric tracers to include -# in the output file depends on the physics suite. Hopefully, this me- -# thod of specifying output tracers will be replaced with a variable -# table (which should be specific to each combination of external model, -# external model file type, and physics suite). -# - if [ "${USE_CCPP}" = "TRUE" ]; then - if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then - tracers="[\"sphum\",\"liq_wat\",\"o3mr\",\"ice_wat\",\"rainwat\",\"snowwat\",\"graupel\"]" - elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then -# For GSD physics, add three additional tracers (the ice, rain and water -# number concentrations) that are required for Thompson microphysics. - tracers="[\"sphum\",\"liq_wat\",\"o3mr\",\"ice_wat\",\"rainwat\",\"snowwat\",\"graupel\",\"ice_nc\",\"rain_nc\",\"water_nc\"]" - else - print_err_msg_exit "\ -The parameter \"tracers\" has not been defined for this combination of -external model (EXTRN_MDL_NAME_ICS), physics suite (CCPP_PHYS_SUITE), and -FV3GFS file type (FV3GFS_FILE_FMT_ICS): - EXTRN_MDL_NAME_ICS = \"${EXTRN_MDL_NAME_ICS}\" - CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\" - FV3GFS_FILE_FMT_ICS = \"${FV3GFS_FILE_FMT_ICS}\"" - fi -# -# If CCPP is not being used, the only physics suite that can be used is -# GFS. -# - else - tracers="[\"sphum\",\"liq_wat\",\"o3mr\",\"ice_wat\",\"rainwat\",\"snowwat\",\"graupel\"]" - fi + fn_atm_nemsio="${EXTRN_MDL_FNS[0]}" + fn_sfc_nemsio="${EXTRN_MDL_FNS[1]}" + input_type="gaussian_nemsio" # For FV3-GFS Gaussian grid in nemsio format. + convert_nst=True elif [ "${FV3GFS_FILE_FMT_ICS}" = "grib2" ]; then @@ -335,16 +333,17 @@ FV3GFS file type (FV3GFS_FILE_FMT_ICS): fn_grib2="${EXTRN_MDL_FNS[0]}" input_type="grib2" - + convert_nst=False + fi - - internal_GSD=False - numsoil_out="4" - replace_vgtyp=True - replace_sotyp=True - replace_vgfrc=True + + nsoill_out="4" #If the CCPP suites uses RUC-LSM, the scheme will interpolate from 4 to 9 soil levels. + vgtyp_from_climo=True + sotyp_from_climo=True + vgfrc_from_climo=True + minmax_vgfrc_from_climo=True + lai_from_climo=True tg3_from_soil=False - convert_nst=True ;; @@ -355,38 +354,23 @@ FV3GFS file type (FV3GFS_FILE_FMT_ICS): fn_grib2="${EXTRN_MDL_FNS[0]}" input_type="grib2" - - internal_GSD=False - cdate_min_HRRRX="2019111500" - if [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" -o \ - "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ] && \ - [ ${CDATE} -gt ${cdate_min_HRRRX} ]; then - print_info_msg " -Setting the chgres_cube namelist setting \"internal_GSD\" to \".true.\" in -order to read in land surface model (LSM) variables available in the -HRRRX grib2 files created after about \"${cdate_min_HRRRX}\"..." - internal_GSD=True - fi - +# +# Set soil levels based on LSM in CCPP SDF (RUC-LSM or Noah/Noah MP) +# if [ "${USE_CCPP}" = "TRUE" ]; then if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then - numsoil_out="4" + nsoill_out="4" elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then - numsoil_out="9" - else - print_err_msg_exit "\ -The parameter \"numsoil_out\" has not been defined for this combination -of external model (EXTRN_MDL_NAME_ICS) and physics suite (CCPP_PHYS_SUITE): - EXTRN_MDL_NAME_ICS = \"${EXTRN_MDL_NAME_ICS}\" - CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\"" + [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ + nsoill_out="9" fi fi # @@ -398,9 +382,14 @@ of external model (EXTRN_MDL_NAME_ICS) and physics suite (CCPP_PHYS_SUITE): geogrid_file_input_grid="/misc/whome/rtrr/HRRR/static/WPS/geo_em.d01.nc" fi - replace_vgtyp=False - replace_sotyp=False - replace_vgfrc=False + #Note that vgfrc, shdmin/shdmax (minmax_vgfrc), and lai fields are only available in HRRRX + #files after mid-July 2019, and only so long as the record order didn't change afterward + + vgtyp_from_climo=True + sotyp_from_climo=True + vgfrc_from_climo=True + minmax_vgfrc_from_climo=True + lai_from_climo=True tg3_from_soil=True convert_nst=False @@ -412,28 +401,22 @@ of external model (EXTRN_MDL_NAME_ICS) and physics suite (CCPP_PHYS_SUITE): fn_grib2="${EXTRN_MDL_FNS[0]}" input_type="grib2" - - internal_GSD=False - +# +# Set soil levels based on CCPP SDF +# if [ "${USE_CCPP}" = "TRUE" ]; then if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then - numsoil_out="4" + nsoill_out="4" elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then - numsoil_out="9" - else - print_err_msg_exit "\ -The parameter \"numsoil_out\" has not been defined for this combination -of external model (EXTRN_MDL_NAME_ICS) and physics suite (CCPP_PHYS_SUITE): - EXTRN_MDL_NAME_ICS = \"${EXTRN_MDL_NAME_ICS}\" - CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\"" + [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ + nsoill_out="9" fi fi # @@ -445,14 +428,53 @@ of external model (EXTRN_MDL_NAME_ICS) and physics suite (CCPP_PHYS_SUITE): geogrid_file_input_grid="/misc/whome/rtrr/HRRR/static/WPS/geo_em.d01.nc" fi - replace_vgtyp=False - replace_sotyp=False - replace_vgfrc=False + vgtyp_from_climo=True + sotyp_from_climo=False + vgfrc_from_climo=True + minmax_vgfrc_from_climo=True + lai_from_climo=True tg3_from_soil=True convert_nst=False ;; +"NAM") + + external_model="NAM" + + fn_grib2="${EXTRN_MDL_FNS[0]}" + input_type="grib2" + +# +# Use Thompson climatology for ice- and water-friendly aerosols if CCPP suite uses Thompson MP +# + if [ "${USE_CCPP}" = "TRUE" ]; then + if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then + thomp_mp_climo_file="" + elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then + [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ + thomp_mp_climo_file="${FIXam}/Thompson_MP_MONTHLY_CLIMO.nc" + fi + fi + + nsoill_out="4" #If the CCPP suites uses RUC-LSM, the scheme will interpolate from 4 to 9 soil levels. + vgtyp_from_climo=True + sotyp_from_climo=True + vgfrc_from_climo=True + minmax_vgfrc_from_climo=True + lai_from_climo=True + tg3_from_soil=False + convert_nst=False + + ;; + *) print_err_msg_exit "\ External-model-dependent namelist variables have not yet been specified @@ -493,49 +515,6 @@ fi # Build the FORTRAN namelist file that chgres_cube will read in. # #----------------------------------------------------------------------- -# -# For GFS physics, the character arrays tracers_input(:) and tracers(:) -# must be specified in the namelist file. tracers_input(:) contains the -# tracer name to look for in the external model file(s), while tracers(:) -# contains the names to use for the tracers in the output NetCDF files -# that chgres creates (that will be read in by FV3). Since when FV3 -# reads these NetCDF files it looks for atmospheric traces as specified -# in the file field_table, tracers(:) should be set to the names in -# field_table. -# -# NOTE: This process should be automated where the set of elements that -# tracers(:) should be set to is obtained from reading in field_table. -# -# To know how to set tracers_input(:), you have to know the names of the -# variables in the input atmospheric nemsio file (usually this file is -# named gfs.t00z.atmanl.nemsio). -# -# It is not quite clear how these should be specified. Here are a list -# of examples: -# -# [Gerard.Ketefian@tfe05] /scratch3/.../chgres_cube.fd/run (feature/chgres_grib2_gsk) -# $ grep -n -i "tracers" * | grep theia -# config.C1152.l91.atm.theia.nml:24: tracers="sphum","liq_wat","o3mr","ice_wat","rainwat","snowwat","graupel" -# config.C1152.l91.atm.theia.nml:25: tracers_input="sphum","liq_wat","o3mr","ice_wat","rainwat","snowwat","graupel" -# config.C48.gaussian.theia.nml:20: tracers="sphum","liq_wat","o3mr","ice_wat","rainwat","snowwat","graupel" -# config.C48.gaussian.theia.nml:21: tracers_input="spfh","clwmr","o3mr","icmr","rwmr","snmr","grle" -# config.C48.gfs.gaussian.theia.nml:21: tracers="sphum","liq_wat","o3mr" -# config.C48.gfs.gaussian.theia.nml:22: tracers_input="spfh","clwmr","o3mr" -# config.C48.gfs.spectral.theia.nml:21: tracers_input="spfh","o3mr","clwmr" -# config.C48.gfs.spectral.theia.nml:22: tracers="sphum","o3mr","liq_wat" -# config.C48.theia.nml:21: tracers="sphum","liq_wat","o3mr" -# config.C48.theia.nml:22: tracers_input="spfh","clwmr","o3mr" -# config.C768.atm.theia.nml:24: tracers="sphum","liq_wat","o3mr","ice_wat","rainwat","snowwat","graupel" -# config.C768.atm.theia.nml:25: tracers_input="sphum","liq_wat","o3mr","ice_wat","rainwat","snowwat","graupel" -# config.C768.l91.atm.theia.nml:24: tracers="sphum","liq_wat","o3mr","ice_wat","rainwat","snowwat","graupel" -# config.C768.l91.atm.theia.nml:25: tracers_input="sphum","liq_wat","o3mr","ice_wat","rainwat","snowwat","graupel" -# config.C768.nest.atm.theia.nml:22: tracers="sphum","liq_wat","o3mr","ice_wat","rainwat","snowwat","graupel" -# config.C768.nest.atm.theia.nml:23: tracers_input="sphum","liq_wat","o3mr","ice_wat","rainwat","snowwat","graupel" - - -# fix_dir_target_grid="${BASEDIR}/ESG_grid_HRRR_like_fix_files_chgres_cube" -# base_install_dir="${SORCDIR}/chgres_cube.fd" - # # Create a multiline variable that consists of a yaml-compliant string # specifying the values that the namelist variables need to be set to @@ -545,39 +524,39 @@ fi # settings=" 'config': { + 'fix_dir_input_grid': ${UFS_UTILS_DIR}/fix/fix_chgres, 'fix_dir_target_grid': ${FIXLAM}, - 'mosaic_file_target_grid': ${FIXLAM}/${CRES}${DOT_OR_USCORE}mosaic.halo${NH4}.nc, + 'mosaic_file_target_grid': ${FIXLAM}/${CRES}${DOT_OR_USCORE}mosaic.halo$((10#${NH4})).nc, 'orog_dir_target_grid': ${FIXLAM}, - 'orog_files_target_grid': ${CRES}${DOT_OR_USCORE}oro_data.tile${TILE_RGNL}.halo${NH4}.nc, + 'orog_files_target_grid': ${CRES}${DOT_OR_USCORE}oro_data.tile${TILE_RGNL}.halo$((10#${NH4})).nc, 'vcoord_file_target_grid': ${FIXam}/global_hyblev.l65.txt, - 'mosaic_file_input_grid': '', - 'orog_dir_input_grid': '', - 'base_install_dir': ${CHGRES_DIR}, - 'wgrib2_path': ${wgrib2_dir}, + 'varmap_file': ${UFS_UTILS_DIR}/parm/varmap_tables/${varmap_file}, 'data_dir_input_grid': ${extrn_mdl_staging_dir}, 'atm_files_input_grid': ${fn_atm_nemsio}, 'sfc_files_input_grid': ${fn_sfc_nemsio}, 'grib2_file_input_grid': \"${fn_grib2}\", - 'cycle_mon': $((10#$mm)), - 'cycle_day': $((10#$dd)), - 'cycle_hour': $((10#$hh)), + 'cycle_mon': $((10#${mm})), + 'cycle_day': $((10#${dd})), + 'cycle_hour': $((10#${hh})), 'convert_atm': True, 'convert_sfc': True, 'convert_nst': ${convert_nst}, 'regional': 1, - 'halo_bndy': ${NH4}, + 'halo_bndy': $((10#${NH4})), + 'halo_blend': $((10#${HALO_BLEND})), 'input_type': ${input_type}, 'external_model': ${external_model}, 'tracers_input': ${tracers_input}, - 'tracers': ${tracers}, - 'phys_suite': ${phys_suite}, - 'internal_GSD': ${internal_GSD}, - 'numsoil_out': ${numsoil_out}, + 'tracers': ${tracers}, + 'nsoill_out': $((10#${nsoill_out})), 'geogrid_file_input_grid': ${geogrid_file_input_grid}, - 'replace_vgtyp': ${replace_vgtyp}, - 'replace_sotyp': ${replace_sotyp}, - 'replace_vgfrc': ${replace_vgfrc}, + 'vgtyp_from_climo': ${vgtyp_from_climo}, + 'sotyp_from_climo': ${sotyp_from_climo}, + 'vgfrc_from_climo': ${vgfrc_from_climo}, + 'minmax_vgfrc_from_climo': ${minmax_vgfrc_from_climo}, + 'lai_from_climo': ${lai_from_climo}, 'tg3_from_soil': ${tg3_from_soil}, + 'thomp_mp_climo_file': ${thomp_mp_climo_file}, } " # @@ -635,7 +614,7 @@ mv_vrfy out.sfc.tile${TILE_RGNL}.nc \ mv_vrfy gfs_ctrl.nc ${ics_dir} -mv_vrfy gfs_bndy.nc ${ics_dir}/gfs_bndy.tile${TILE_RGNL}.000.nc +mv_vrfy gfs.bndy.nc ${ics_dir}/gfs_bndy.tile${TILE_RGNL}.000.nc # #----------------------------------------------------------------------- # diff --git a/scripts/exregional_make_lbcs.sh b/scripts/exregional_make_lbcs.sh index 31b37a623..f5da9eb16 100755 --- a/scripts/exregional_make_lbcs.sh +++ b/scripts/exregional_make_lbcs.sh @@ -57,7 +57,6 @@ hour zero). # valid_args=( \ "lbcs_dir" \ -"wgrib2_dir" \ "APRUN" \ ) process_args valid_args "$@" @@ -95,34 +94,31 @@ cd_vrfy $workdir # #----------------------------------------------------------------------- # -# Set physics-suite-dependent variables that are needed in the FORTRAN -# namelist file that the chgres executable will read in. +# Set physics-suite-dependent variable mapping table needed in the FORTRAN +# namelist file that the chgres_cube executable will read in. # #----------------------------------------------------------------------- # -phys_suite="" +varmap_file="" case "${CCPP_PHYS_SUITE}" in -"FV3_GFS_2017_gfdlmp" | "FV3_GFS_2017_gfdlmp_regional") - phys_suite="GFS" - ;; -"FV3_GSD_v0" | "FV3_GSD_SAR" | "FV3_GSD_SAR_v1" | "FV3_RRFS_v0" | "FV3_RRFS_v1beta" ) - phys_suite="GSD" - ;; -"FV3_CPT_v0" ) - phys_suite="CPT" - ;; +"FV3_GFS_2017_gfdlmp" | "FV3_GFS_2017_gfdlmp_regional" | "FV3_GFS_v16beta" | \ "FV3_GFS_v15p2" ) - phys_suite="v15p2" + varmap_file="GFSphys_var_map.txt" ;; -"FV3_GFS_v16beta" ) - phys_suite="v16beta" +"FV3_GSD_v0" | "FV3_GSD_SAR" | "FV3_GSD_SAR_v1" | "FV3_RRFS_v0" | \ +"FV3_RRFS_v1beta" ) + if [ "${EXTRN_MDL_NAME_LBCS}" = "RAPX" ] || [ "${EXTRN_MDL_NAME_LBCS}" = "HRRRX" ]; then + varmap_file="GSDphys_var_map.txt" + elif [ "${EXTRN_MDL_NAME_LBCS}" = "NAM" ] || [ "${EXTRN_MDL_NAME_LBCS}" = "FV3GFS" ] || \ + [ "${EXTRN_MDL_NAME_LBCS}" = "GSMGFS" ]; then + varmap_file="GFSphys_var_map.txt" + fi ;; *) print_err_msg_exit "\ -Physics-suite-dependent namelist variables have not yet been specified -for this physics suite: +A variable mapping table has not yet been defined for this physics suite: CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\"" ;; @@ -131,7 +127,7 @@ esac #----------------------------------------------------------------------- # # Set external-model-dependent variables that are needed in the FORTRAN -# namelist file that the chgres executable will read in. These are de- +# namelist file that the chgres_cube executable will read in. These are de- # scribed below. Note that for a given external model, usually only a # subset of these all variables are set (since some may be irrelevant). # @@ -139,15 +135,19 @@ esac # Name of the external model from which we are obtaining the fields # needed to generate the LBCs. # +# fn_atm_nemsio: +# Name (not including path) of the nemsio file generated by the external +# model that contains the atmospheric fields. +# # fn_sfc_nemsio: # Name (not including path) of the nemsio file generated by the external # model that contains the surface fields. # # input_type: -# The "type" of input being provided to chgres. This contains a combi- +# The "type" of input being provided to chgres_cube. This contains a combi- # nation of information on the external model, external model file for- # mat, and maybe other parameters. For clarity, it would be best to -# eliminate this variable in chgres and replace with with 2 or 3 others +# eliminate this variable in chgres_cube and replace with with 2 or 3 others # (e.g. extrn_mdl, extrn_mdl_file_format, etc). # # tracers_input: @@ -163,30 +163,12 @@ esac # ment of tracers should be the name to use for the O3 mixing ratio in # the output file. For GSD physics, three additional tracers -- ice, # rain, and water number concentrations -- may be specified at the end -# of tracers, and these will be calculated by chgres. -# -# numsoil_out: -# The number of soil layers to include in the output NetCDF file. -# -# replace_FIELD, where FIELD="vgtyp", "sotyp", or "vgfrc": -# Logical variable indicating whether or not to obtain the field in -# question from climatology instead of the external model. The field in -# question is one of vegetation type (FIELD="vgtyp"), soil type (FIELD= -# "sotyp"), and vegetation fraction (FIELD="vgfrc"). If replace_FIELD -# is set to ".true.", then the field is obtained from climatology (re- -# gardless of whether or not it exists in an external model file). If -# it is set to ".false.", then the field is obtained from the external -# model. If the external model file does not provide this field, then -# chgres prints out an error message and stops. -# -# tg3_from_soil: -# Logical variable indicating whether or not to set the tg3 soil tempe- # Needs to be verified. -# rature field to the temperature of the deepest soil layer. +# of tracers, and these will be calculated by chgres_cube. # #----------------------------------------------------------------------- # -# GSK comments about chgres: +# GSK comments about chgres_cube: # # The following are the three atmsopheric tracers that are in the atmo- # spheric analysis (atmanl) nemsio file for CDATE=2017100700: @@ -235,13 +217,7 @@ fn_grib2="" input_type="" tracers_input="\"\"" tracers="\"\"" -numsoil_out="" -geogrid_file_input_grid="\"\"" -replace_vgtyp="" -replace_sotyp="" -replace_vgfrc="" -tg3_from_soil="" - +thomp_mp_climo_file="" case "${EXTRN_MDL_NAME_LBCS}" in @@ -250,122 +226,114 @@ case "${EXTRN_MDL_NAME_LBCS}" in external_model="GSMGFS" - input_type="gfs_gaussian" # For spectral GFS Gaussian grid in nemsio format. + input_type="gfs_gaussian_nemsio" # For spectral GFS Gaussian grid in nemsio format. tracers_input="[\"spfh\",\"clwmr\",\"o3mr\"]" tracers="[\"sphum\",\"liq_wat\",\"o3mr\"]" +# +# Use Thompson climatology for ice- and water-friendly aerosols if CCPP suite uses Thompson MP +# + if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then + thomp_mp_climo_file="" + elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then + thomp_mp_climo_file="${FIXam}/Thompson_MP_MONTHLY_CLIMO.nc" + else + print_err_msg_exit "\ + The chosen CCPP physics suite is unsupported at this time: + CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\"" + fi - numsoil_out="4" - replace_vgtyp=".true." - replace_sotyp=".true." - replace_vgfrc=".true." - tg3_from_soil=".false." ;; "FV3GFS") +# +# Use Thompson climatology for ice- and water-friendly aerosols if CCPP suite uses Thompson MP +# + if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then + thomp_mp_climo_file="" + elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then + thomp_mp_climo_file="${FIXam}/Thompson_MP_MONTHLY_CLIMO.nc" + else + print_err_msg_exit "\ + The chosen CCPP physics suite is unsupported at this time: + CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\"" + fi + if [ "${FV3GFS_FILE_FMT_LBCS}" = "nemsio" ]; then external_model="FV3GFS" - input_type="gaussian" # For FV3-GFS Gaussian grid in nemsio format. + input_type="gaussian_nemsio" # For FV3-GFS Gaussian grid in nemsio format. tracers_input="[\"spfh\",\"clwmr\",\"o3mr\",\"icmr\",\"rwmr\",\"snmr\",\"grle\"]" -# -# If CCPP is being used, then the list of atmospheric tracers to include -# in the output file depends on the physics suite. Hopefully, this me- -# thod of specifying output tracers will be replaced with a variable -# table (which should be specific to each combination of external model, -# external model file type, and physics suite). -# - if [ "${USE_CCPP}" = "TRUE" ]; then - if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then - tracers="[\"sphum\",\"liq_wat\",\"o3mr\",\"ice_wat\",\"rainwat\",\"snowwat\",\"graupel\"]" - elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then -# For GSD physics, add three additional tracers (the ice, rain and water -# number concentrations) that are required for Thompson microphysics. - tracers="[\"sphum\",\"liq_wat\",\"o3mr\",\"ice_wat\",\"rainwat\",\"snowwat\",\"graupel\",\"ice_nc\",\"rain_nc\",\"water_nc\"]" - else - print_err_msg_exit "\ -The parameter \"tracers\" has not been defined for this combination of -external model (EXTRN_MDL_NAME_LBCS), physics suite (CCPP_PHYS_SUITE), -and FV3GFS file type (FV3GFS_FILE_FMT_LBCS): - EXTRN_MDL_NAME_LBCS = \"${EXTRN_MDL_NAME_LBCS}\" - CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\" - FV3GFS_FILE_FMT_LBCS = \"${FV3GFS_FILE_FMT_LBCS}\"" - fi -# -# If CCPP is not being used, the only physics suite that can be used is -# GFS. -# - else - tracers="[\"sphum\",\"liq_wat\",\"o3mr\",\"ice_wat\",\"rainwat\",\"snowwat\",\"graupel\"]" - fi + tracers="[\"sphum\",\"liq_wat\",\"o3mr\",\"ice_wat\",\"rainwat\",\"snowwat\",\"graupel\"]" elif [ "${FV3GFS_FILE_FMT_LBCS}" = "grib2" ]; then external_model="GFS" - input_type="grib2" fn_grib2="${EXTRN_MDL_FNS[0]}" + input_type="grib2" fi - numsoil_out="4" - replace_vgtyp=".true." - replace_sotyp=".true." - replace_vgfrc=".true." - tg3_from_soil=".false." - ;; "RAPX") external_model="RAP" - input_type="grib2" - if [ "${USE_CCPP}" = "TRUE" ]; then - if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ + ;; + + +"NAM") + + external_model="NAM" + input_type="grib2" +# +# Use Thompson climatology for ice- and water-friendly aerosols if CCPP suite uses Thompson MP +# + if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then + thomp_mp_climo_file="" + elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then - numsoil_out="4" - elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then - numsoil_out="9" - else - print_err_msg_exit "\ -The parameter \"numsoil_out\" has not been defined for this combination -of external model (EXTRN_MDL_NAME_LBCS) and physics suite (CCPP_PHYS_SUITE): - EXTRN_MDL_NAME_LBCS = \"${EXTRN_MDL_NAME_LBCS}\" - CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\"" - fi + [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then + thomp_mp_climo_file="${FIXam}/Thompson_MP_MONTHLY_CLIMO.nc" + else + print_err_msg_exit "\ + The chosen CCPP physics suite is unsupported at this time: + CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\"" fi - replace_vgtyp=".false." - replace_sotyp=".false." - replace_vgfrc=".false." - tg3_from_soil=".true." - ;; - *) print_err_msg_exit "\ External-model-dependent namelist variables have not yet been specified @@ -394,7 +362,7 @@ fi # #----------------------------------------------------------------------- # -# Loop through the LBC update times and run chgres for each such time to +# Loop through the LBC update times and run chgres_cube for each such time to # obtain an LBC file for each that can be used as input to the FV3-LAM. # #----------------------------------------------------------------------- @@ -407,7 +375,7 @@ for (( i=0; i<${num_fhrs}; i++ )); do fhr="${EXTRN_MDL_LBC_SPEC_FHRS[$i]}" # # Set external model output file name and file type/format. Note that -# these are now inputs into chgres. +# these are now inputs into chgres_cube. # fn_atm_nemsio="" fn_grib2="" @@ -424,11 +392,17 @@ for (( i=0; i<${num_fhrs}; i++ )); do fi ;; "RAPX") + fn_grib2="${EXTRN_MDL_FNS[$i]}" + ;; + "HRRRX") + fn_grib2="${EXTRN_MDL_FNS[$i]}" + ;; + "NAM") fn_grib2="${EXTRN_MDL_FNS[$i]}" ;; *) print_err_msg_exit "\ -The external model output file name to use in the chgres FORTRAN name- +The external model output file name to use in the chgres_cube FORTRAN name- list file has not specified for this external model: EXTRN_MDL_NAME_LBCS = \"${EXTRN_MDL_NAME_LBCS}\"" ;; @@ -454,9 +428,6 @@ list file has not specified for this external model: # # Build the FORTRAN namelist file that chgres_cube will read in. # -# QUESTION: -# Do numsoil_out, ..., tg3_from_soil need to be in this namelist (as -# they are for the ICs namelist)? # # Create a multiline variable that consists of a yaml-compliant string @@ -465,35 +436,32 @@ list file has not specified for this external model: # this variable will be passed to a python script that will create the # namelist file. # - settings=" +settings=" 'config': { + 'fix_dir_input_grid': ${UFS_UTILS_DIR}/fix/fix_chgres, 'fix_dir_target_grid': ${FIXLAM}, - 'mosaic_file_target_grid': ${FIXLAM}/${CRES}${DOT_OR_USCORE}mosaic.halo${NH4}.nc, + 'mosaic_file_target_grid': ${FIXLAM}/${CRES}${DOT_OR_USCORE}mosaic.halo$((10#${NH4})).nc, 'orog_dir_target_grid': ${FIXLAM}, - 'orog_files_target_grid': ${CRES}${DOT_OR_USCORE}oro_data.tile7.halo${NH4}.nc, + 'orog_files_target_grid': ${CRES}${DOT_OR_USCORE}oro_data.tile${TILE_RGNL}.halo$((10#${NH4})).nc, 'vcoord_file_target_grid': ${FIXam}/global_hyblev.l65.txt, - 'mosaic_file_input_grid': '', - 'orog_dir_input_grid': '', - 'base_install_dir': ${CHGRES_DIR}, - 'wgrib2_path': ${wgrib2_dir}, + 'varmap_file': ${UFS_UTILS_DIR}/parm/varmap_tables/${varmap_file}, 'data_dir_input_grid': ${extrn_mdl_staging_dir}, 'atm_files_input_grid': ${fn_atm_nemsio}, 'sfc_files_input_grid': ${fn_sfc_nemsio}, 'grib2_file_input_grid': \"${fn_grib2}\", - 'cycle_mon': $((10#$mm)), - 'cycle_day': $((10#$dd)), - 'cycle_hour': $((10#$hh)), + 'cycle_mon': $((10#${mm})), + 'cycle_day': $((10#${dd})), + 'cycle_hour': $((10#${hh})), 'convert_atm': True, - 'convert_sfc': False, - 'convert_nst': False, 'regional': 2, - 'halo_bndy': ${NH4}, + 'halo_bndy': $((10#${NH4})), + 'halo_blend': $((10#${HALO_BLEND})), 'input_type': ${input_type}, 'external_model': ${external_model}, 'tracers_input': ${tracers_input}, 'tracers': ${tracers}, - 'phys_suite': ${phys_suite}, - } + 'thomp_mp_climo_file': ${thomp_mp_climo_file}, +} " # # Call the python script to create the namelist file. @@ -542,7 +510,7 @@ located in the following directory: # that of the external model since their start times may be offset). # fcst_hhh_FV3LAM=$( printf "%03d" "${LBC_SPEC_FCST_HRS[$i]}" ) - mv_vrfy gfs_bndy.nc ${lbcs_dir}/gfs_bndy.tile7.${fcst_hhh_FV3LAM}.nc + mv_vrfy gfs.bndy.nc ${lbcs_dir}/gfs_bndy.tile7.${fcst_hhh_FV3LAM}.nc done # diff --git a/sorc/global_equiv_resol.fd/Makefile_cheyenne b/sorc/global_equiv_resol.fd/Makefile_cheyenne deleted file mode 100644 index 456bb3fed..000000000 --- a/sorc/global_equiv_resol.fd/Makefile_cheyenne +++ /dev/null @@ -1,29 +0,0 @@ -SHELL := bash - -MAKEFLAGS += --warn-undefined-variables - -INC = -I${NETCDF}/include - -LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ - ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a ${NETCDF}/lib/libsz.a -lz - -FC = ifort -FFLAGS = -g -O2 $(INC) - -EXEC = global_equiv_resol - -.PHONY: all -all : $(EXEC) - -$(EXEC): global_equiv_resol.o $(LIBS) - $(FC) $(FFLAGS) -o $@ $^ - -.SUFFIXES: -.SUFFIXES: .f90 .o - -.f90.o: - $(FC) $(FFLAGS) -c $< - -.PHONY: clean -clean: - rm -f *.o *.mod $(EXEC) diff --git a/sorc/global_equiv_resol.fd/Makefile_hera b/sorc/global_equiv_resol.fd/Makefile_hera deleted file mode 100644 index c1f884090..000000000 --- a/sorc/global_equiv_resol.fd/Makefile_hera +++ /dev/null @@ -1,29 +0,0 @@ -SHELL := bash - -MAKEFLAGS += --warn-undefined-variables - -INC = -I${NETCDF}/include - -LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ - ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a /apps/szip/2.1/lib/libsz.a -lz - -FC = ifort -FFLAGS = -g -O2 $(INC) - -EXEC = global_equiv_resol - -.PHONY: all -all : $(EXEC) - -$(EXEC): global_equiv_resol.o $(LIBS) - $(FC) $(FFLAGS) -o $@ $^ - -.SUFFIXES: -.SUFFIXES: .f90 .o - -.f90.o: - $(FC) $(FFLAGS) -c $< - -.PHONY: clean -clean: - rm -f *.o *.mod $(EXEC) diff --git a/sorc/global_equiv_resol.fd/Makefile_jet b/sorc/global_equiv_resol.fd/Makefile_jet deleted file mode 100644 index c1f884090..000000000 --- a/sorc/global_equiv_resol.fd/Makefile_jet +++ /dev/null @@ -1,29 +0,0 @@ -SHELL := bash - -MAKEFLAGS += --warn-undefined-variables - -INC = -I${NETCDF}/include - -LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ - ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a /apps/szip/2.1/lib/libsz.a -lz - -FC = ifort -FFLAGS = -g -O2 $(INC) - -EXEC = global_equiv_resol - -.PHONY: all -all : $(EXEC) - -$(EXEC): global_equiv_resol.o $(LIBS) - $(FC) $(FFLAGS) -o $@ $^ - -.SUFFIXES: -.SUFFIXES: .f90 .o - -.f90.o: - $(FC) $(FFLAGS) -c $< - -.PHONY: clean -clean: - rm -f *.o *.mod $(EXEC) diff --git a/sorc/global_equiv_resol.fd/Makefile_odin b/sorc/global_equiv_resol.fd/Makefile_odin deleted file mode 100644 index 9a6073837..000000000 --- a/sorc/global_equiv_resol.fd/Makefile_odin +++ /dev/null @@ -1,29 +0,0 @@ -SHELL := bash - -MAKEFLAGS += --warn-undefined-variables - -INC = -I${NETCDF}/include - -LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ - ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a -lz - -FC = ftn -FFLAGS = -g -O2 $(INC) - -EXEC = global_equiv_resol - -.PHONY: all -all : $(EXEC) - -$(EXEC): global_equiv_resol.o - $(FC) $(FFLAGS) -o $@ $^ $(LIBS) - -.SUFFIXES: -.SUFFIXES: .f90 .o - -.f90.o: - $(FC) $(FFLAGS) -c $< - -.PHONY: clean -clean: - rm -f *.o *.mod $(EXEC) diff --git a/sorc/global_equiv_resol.fd/Makefile_stampede b/sorc/global_equiv_resol.fd/Makefile_stampede deleted file mode 100644 index ee9355051..000000000 --- a/sorc/global_equiv_resol.fd/Makefile_stampede +++ /dev/null @@ -1,29 +0,0 @@ -SHELL := bash - -MAKEFLAGS += --warn-undefined-variables - -INC = -I${NETCDF}/include - -LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ - ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a ${HDF5}/lib/libsz.a -lz - -FC = mpiifort -FFLAGS = -g -O2 $(INC) - -EXEC = global_equiv_resol - -.PHONY: all -all : $(EXEC) - -$(EXEC): global_equiv_resol.o - $(FC) $(FFLAGS) -o $@ $^ $(LIBS) - -.SUFFIXES: -.SUFFIXES: .f90 .o - -.f90.o: - $(FC) $(FFLAGS) -c $< - -.PHONY: clean -clean: - rm -f *.o *.mod $(EXEC) diff --git a/sorc/global_equiv_resol.fd/Makefile_theia b/sorc/global_equiv_resol.fd/Makefile_theia deleted file mode 100644 index c1f884090..000000000 --- a/sorc/global_equiv_resol.fd/Makefile_theia +++ /dev/null @@ -1,29 +0,0 @@ -SHELL := bash - -MAKEFLAGS += --warn-undefined-variables - -INC = -I${NETCDF}/include - -LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ - ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a /apps/szip/2.1/lib/libsz.a -lz - -FC = ifort -FFLAGS = -g -O2 $(INC) - -EXEC = global_equiv_resol - -.PHONY: all -all : $(EXEC) - -$(EXEC): global_equiv_resol.o $(LIBS) - $(FC) $(FFLAGS) -o $@ $^ - -.SUFFIXES: -.SUFFIXES: .f90 .o - -.f90.o: - $(FC) $(FFLAGS) -c $< - -.PHONY: clean -clean: - rm -f *.o *.mod $(EXEC) diff --git a/sorc/global_equiv_resol.fd/compile.sh b/sorc/global_equiv_resol.fd/compile.sh deleted file mode 100755 index 7edd72c3b..000000000 --- a/sorc/global_equiv_resol.fd/compile.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -module purge -module load intel/18.1.163 -module load netcdf/4.6.1 -module load hdf5/1.10.4 -module list - -make diff --git a/sorc/global_equiv_resol.fd/global_equiv_resol.f90 b/sorc/global_equiv_resol.fd/global_equiv_resol.f90 deleted file mode 100644 index 7bd9c813f..000000000 --- a/sorc/global_equiv_resol.fd/global_equiv_resol.f90 +++ /dev/null @@ -1,185 +0,0 @@ -!======================================================================= -program global_equiv_resol -!======================================================================= - - use netcdf - - implicit none - - integer, parameter :: dp = kind(1.0d0) - real(dp), parameter :: pi_geom = 4.0*atan(1.0), & - radius_Earth = 6371000.0 - - character(len=256) :: grid_fn - integer :: ncid, nxSG_dimid, nySG_dimid, dASG_varid, num_args - integer :: nxSG, nySG, nx, ny, RES_equiv - real(dp) :: avg_cell_size, min_cell_size, max_cell_size - real(dp), dimension(:,:), allocatable :: & - quarter_dA_ll, quarter_dA_lr, quarter_dA_ur, quarter_dA_ul, & - dASG, dA, sqrt_dA -! -!======================================================================= -! -! Read in the name of the file from the command line. The command-line -! call to this program should have exactly one argument consisting of -! the path to the NetCDF grid specification file to be read in. If this -! is not the case, print out a usage message and exit. -! -!======================================================================= -! - num_args = command_argument_count() - if (num_args == 1) then - call get_command_argument(1, grid_fn) - else - WRITE(*,500) - WRITE(*,500) "Exactly one argument must be specified to program global_equiv_resol." - WRITE(*,500) "Usage:" - WRITE(*,500) - WRITE(*,500) " global_equiv_resol path_to_grid_file" - WRITE(*,500) - WRITE(*,500) "where path_to_grid_file is the path to the NetCDF grid file. Actual " - WRITE(*,500) "number of specified command line arguments is:" - WRITE(*,510) " num_args = ", num_args - WRITE(*,500) "Stopping." -500 FORMAT(A) -510 FORMAT(A, I3) - STOP - end if -! -!======================================================================= -! -! Open the grid file and read in the dimensions of the supergrid. The -! supergrid is a grid that has twice the resolution of the actual/compu- -! tational grid. In the file, the names of the supergrid dimensions are -! nx and ny. Here, however, we reserve those names for the dimensions -! of the actual grid (since in the FV3 code and in other data files, nx -! and ny are used to denote the dimensions of the actual grid) and in- -! stead use the variables nxSG and nySG to denote the dimensions of the -! supergrid. -! -!======================================================================= -! - WRITE(*,500) - WRITE(*,500) "Opening NetCDF grid file for reading/writing:" - WRITE(*,500) " grid_fn = " // trim(grid_fn) - - call check( nf90_open(trim(grid_fn), NF90_WRITE, ncid) ) - - call check( nf90_inq_dimid(ncid, "nx", nxSG_dimid) ) - call check( nf90_inquire_dimension(ncid, nxSG_dimid, len=nxSG) ) - - call check( nf90_inq_dimid(ncid, "ny", nySG_dimid) ) - call check( nf90_inquire_dimension(ncid, nySG_dimid, len=nySG) ) - - WRITE(*,500) - WRITE(*,500) "Dimensions of supergrid are:" - WRITE(*,520) " nxSG = ", nxSG - WRITE(*,520) " nySG = ", nySG -520 FORMAT(A, I7) -! -!======================================================================= -! -! Read in the cell areas on the supergrid. Then add the areas of the -! four supergrid cells that make up one grid cell to obtain the cell -! areas on the actual grid. -! -!======================================================================= -! - allocate(dASG(0:nxSG-1, 0:nySG-1)) - call check( nf90_inq_varid(ncid, "area", dASG_varid) ) - call check( nf90_get_var(ncid, dASG_varid, dASG) ) - - nx = nxSG/2 - ny = nySG/2 - - WRITE(*,500) - WRITE(*,500) "Dimensions of (actual, i.e. computational) grid are:" - WRITE(*,520) " nx = ", nx - WRITE(*,520) " ny = ", ny - - allocate(quarter_dA_ll(0:nx-1, 0:ny-1)) - allocate(quarter_dA_lr(0:nx-1, 0:ny-1)) - allocate(quarter_dA_ul(0:nx-1, 0:ny-1)) - allocate(quarter_dA_ur(0:nx-1, 0:ny-1)) - - quarter_dA_ll = dASG(0:nxSG-1:2, 0:nySG-1:2) - quarter_dA_lr = dASG(0:nxSG-1:2, 1:nySG-1:2) - quarter_dA_ur = dASG(1:nxSG-1:2, 1:nySG-1:2) - quarter_dA_ul = dASG(1:nxSG-1:2, 0:nySG-1:2) - - allocate(dA(0:nx-1, 0:ny-1)) - allocate(sqrt_dA(0:nx-1, 0:ny-1)) - - dA = quarter_dA_ll + quarter_dA_lr + quarter_dA_ur + quarter_dA_ul -! -!======================================================================= -! -! Calculate a typical/representative cell size for each cell by taking -! the square root of the area of the cell. Then calculate the minimum, -! maximum, and average cell sizes over the whole grid. -! -!======================================================================= -! - sqrt_dA = sqrt(dA) - min_cell_size = minval(sqrt_dA) - max_cell_size = maxval(sqrt_dA) - avg_cell_size = sum(sqrt_dA)/(nx*ny) - - WRITE(*,500) - WRITE(*,500) "Minimum, maximum, and average cell sizes are (based on square" - WRITE(*,500) "root of cell area):" - WRITE(*,530) " min_cell_size = ", min_cell_size - WRITE(*,530) " max_cell_size = ", max_cell_size - WRITE(*,530) " avg_cell_size = ", avg_cell_size -530 FORMAT(A, G) -! -!======================================================================= -! -! Use the average cell size to calculate an equivalent global uniform -! cubed-sphere resolution (in units of number of cells) for the regional -! grid. This is the RES that a global uniform (i.e. stretch factor of -! 1) cubed-sphere grid would need to have in order to have the same no- -! minal cell size as the average cell size of the regional grid. -! -!======================================================================= -! - RES_equiv = nint( (2.0*pi_geom*radius_Earth)/(4.0*avg_cell_size) ) - - WRITE(*,500) - WRITE(*,500) "Equivalent global uniform cubed-sphere resolution is:" - WRITE(*,530) " RES_equiv = ", RES_equiv -! -!======================================================================= -! -! Write the average cell size and equivalent global resolution to the -! grid file as a global attributes. -! -!======================================================================= -! - WRITE(*,500) - WRITE(*,500) "Writing avg_cell_size and RES_equiv to the grid specification" - WRITE(*,500) "file as global attributes..." - - call check( nf90_redef(ncid) ) - call check( nf90_put_att(ncid, NF90_GLOBAL, "avg_cell_size", avg_cell_size) ) - call check( nf90_put_att(ncid, NF90_GLOBAL, "RES_equiv", RES_equiv) ) - call check( nf90_enddef(ncid) ) - - call check( nf90_close(ncid) ) - - WRITE(*,500) - WRITE(*,500) "Done." - -end program global_equiv_resol - - -subroutine check(status) - use netcdf - integer,intent(in) :: status -! - if(status /= nf90_noerr) then - write(0,*) ' check netcdf status = ', status - write(0,'("error ", a)') trim(nf90_strerror(status)) - stop "Stopped" - endif -end subroutine check diff --git a/sorc/mosaic_file.fd/Makefile_cheyenne b/sorc/mosaic_file.fd/Makefile_cheyenne deleted file mode 100644 index b7d132ffc..000000000 --- a/sorc/mosaic_file.fd/Makefile_cheyenne +++ /dev/null @@ -1,29 +0,0 @@ -SHELL := bash - -MAKEFLAGS += --warn-undefined-variables - -INC = -I${NETCDF}/include - -LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ - ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a ${NETCDF}/lib/libsz.a -lz - -FC = ifort -FFLAGS = -g -O2 $(INC) - -EXEC = mosaic_file - -.PHONY: all -all : $(EXEC) - -$(EXEC): mosaic_file.o $(LIBS) - $(FC) $(FFLAGS) -o $@ $^ - -.SUFFIXES: -.SUFFIXES: .f90 .o - -.f90.o: - $(FC) $(FFLAGS) -c $< - -.PHONY: clean -clean: - rm -f *.o *.mod $(EXEC) diff --git a/sorc/mosaic_file.fd/Makefile_hera b/sorc/mosaic_file.fd/Makefile_hera deleted file mode 100644 index 9a405799c..000000000 --- a/sorc/mosaic_file.fd/Makefile_hera +++ /dev/null @@ -1,29 +0,0 @@ -SHELL := bash - -MAKEFLAGS += --warn-undefined-variables - -INC = -I${NETCDF}/include - -LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ - ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a /apps/szip/2.1/lib/libsz.a -lz - -FC = ifort -FFLAGS = -g -O2 $(INC) - -EXEC = mosaic_file - -.PHONY: all -all : $(EXEC) - -$(EXEC): mosaic_file.o $(LIBS) - $(FC) $(FFLAGS) -o $@ $^ - -.SUFFIXES: -.SUFFIXES: .f90 .o - -.f90.o: - $(FC) $(FFLAGS) -c $< - -.PHONY: clean -clean: - rm -f *.o *.mod $(EXEC) diff --git a/sorc/mosaic_file.fd/Makefile_jet b/sorc/mosaic_file.fd/Makefile_jet deleted file mode 100644 index 9a405799c..000000000 --- a/sorc/mosaic_file.fd/Makefile_jet +++ /dev/null @@ -1,29 +0,0 @@ -SHELL := bash - -MAKEFLAGS += --warn-undefined-variables - -INC = -I${NETCDF}/include - -LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ - ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a /apps/szip/2.1/lib/libsz.a -lz - -FC = ifort -FFLAGS = -g -O2 $(INC) - -EXEC = mosaic_file - -.PHONY: all -all : $(EXEC) - -$(EXEC): mosaic_file.o $(LIBS) - $(FC) $(FFLAGS) -o $@ $^ - -.SUFFIXES: -.SUFFIXES: .f90 .o - -.f90.o: - $(FC) $(FFLAGS) -c $< - -.PHONY: clean -clean: - rm -f *.o *.mod $(EXEC) diff --git a/sorc/mosaic_file.fd/Makefile_odin b/sorc/mosaic_file.fd/Makefile_odin deleted file mode 100644 index 97c191a3b..000000000 --- a/sorc/mosaic_file.fd/Makefile_odin +++ /dev/null @@ -1,29 +0,0 @@ -SHELL := bash - -MAKEFLAGS += --warn-undefined-variables - -INC = -I${NETCDF}/include - -LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ - ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a -lz - -FC = ftn -FFLAGS = -g -O2 $(INC) - -EXEC = mosaic_file - -.PHONY: all -all : $(EXEC) - -$(EXEC): mosaic_file.o - $(FC) $(FFLAGS) -o $@ $^ $(LIBS) - -.SUFFIXES: -.SUFFIXES: .f90 .o - -.f90.o: - $(FC) $(FFLAGS) -c $< - -.PHONY: clean -clean: - rm -f *.o *.mod $(EXEC) diff --git a/sorc/mosaic_file.fd/Makefile_stampede b/sorc/mosaic_file.fd/Makefile_stampede deleted file mode 100644 index 8a3b1a83a..000000000 --- a/sorc/mosaic_file.fd/Makefile_stampede +++ /dev/null @@ -1,29 +0,0 @@ -SHELL := bash - -MAKEFLAGS += --warn-undefined-variables - -INC = -I${NETCDF}/include - -LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ - ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a ${HDF5}/lib/libsz.a -lz - -FC = mpiifort -FFLAGS = -g -O2 $(INC) - -EXEC = mosaic_file - -.PHONY: all -all : $(EXEC) - -$(EXEC): mosaic_file.o - $(FC) $(FFLAGS) -o $@ $^ $(LIBS) - -.SUFFIXES: -.SUFFIXES: .f90 .o - -.f90.o: - $(FC) $(FFLAGS) -c $< - -.PHONY: clean -clean: - rm -f *.o *.mod $(EXEC) diff --git a/sorc/mosaic_file.fd/Makefile_theia b/sorc/mosaic_file.fd/Makefile_theia deleted file mode 100644 index 9a405799c..000000000 --- a/sorc/mosaic_file.fd/Makefile_theia +++ /dev/null @@ -1,29 +0,0 @@ -SHELL := bash - -MAKEFLAGS += --warn-undefined-variables - -INC = -I${NETCDF}/include - -LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ - ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a /apps/szip/2.1/lib/libsz.a -lz - -FC = ifort -FFLAGS = -g -O2 $(INC) - -EXEC = mosaic_file - -.PHONY: all -all : $(EXEC) - -$(EXEC): mosaic_file.o $(LIBS) - $(FC) $(FFLAGS) -o $@ $^ - -.SUFFIXES: -.SUFFIXES: .f90 .o - -.f90.o: - $(FC) $(FFLAGS) -c $< - -.PHONY: clean -clean: - rm -f *.o *.mod $(EXEC) diff --git a/sorc/mosaic_file.fd/compile.sh b/sorc/mosaic_file.fd/compile.sh deleted file mode 100755 index 7edd72c3b..000000000 --- a/sorc/mosaic_file.fd/compile.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -module purge -module load intel/18.1.163 -module load netcdf/4.6.1 -module load hdf5/1.10.4 -module list - -make diff --git a/sorc/mosaic_file.fd/mosaic_file.f90 b/sorc/mosaic_file.fd/mosaic_file.f90 deleted file mode 100644 index 7263e45bd..000000000 --- a/sorc/mosaic_file.fd/mosaic_file.f90 +++ /dev/null @@ -1,126 +0,0 @@ -!======================================================================= -program mosaic_file -!======================================================================= - - use netcdf - - implicit none - - integer, parameter:: dp=kind(1.0d0) - - integer, parameter :: ntiles = 1 - integer, parameter :: string = 255 - - logical :: file_exists - integer :: num_args, i, ncid, & - ntiles_dimid, string_dimid, & - mosaic_varid, gridlocation_varid, & - gridfiles_varid, gridtiles_varid - integer, dimension(1) :: dimids1D - integer, dimension(2) :: dimids2D - integer, dimension(ntiles) :: tile_inds - character(len=string) :: mosaic_fn, mosaic, gridlocation, CRES, tmp_str -! -!======================================================================= -! -! Create the grid mosaic file that FV3 expects to be present in the IN- -! PUT subdirectory of the run directory. -! -!======================================================================= -! - num_args = command_argument_count() - if (num_args == 1) then - call get_command_argument(1, CRES) - else - WRITE(*,500) - WRITE(*,500) "Exactly one argument must be specified to program mosaic_file." - WRITE(*,500) "Usage:" - WRITE(*,500) - WRITE(*,500) " mosaic_file CRES" - WRITE(*,500) - WRITE(*,500) "where CRES is the cubed-sphere grid resolution that will" - WRITE(*,500) "be used to form the name of the grid specification file(s)" - WRITE(*,500) "stored in the variable gridfiles in the grid mosaic file." - WRITE(*,500) "Actual number of specified command line arguments is:" - WRITE(*,510) " num_args = ", num_args - WRITE(*,500) "Stopping." -500 FORMAT(A) -510 FORMAT(A, I3) - STOP - end if -! -!======================================================================= -! -! Create the grid mosaic file that FV3 expects to be present in the IN- -! PUT subdirectory of the run directory. Then create dimensions, varia- -! bles, and attributes within it. -! -!======================================================================= -! - mosaic_fn = trim(CRES) // "_mosaic.nc" - - call check( nf90_create(mosaic_fn, NF90_64BIT_OFFSET, ncid) ) - call check( nf90_def_dim(ncid, "ntiles", ntiles, ntiles_dimid) ) - call check( nf90_def_dim(ncid, "string", string, string_dimid) ) - - dimids1D = (/ string_dimid /) - call check( nf90_def_var(ncid, "mosaic", NF90_CHAR, dimids1D, mosaic_varid) ) - call check( nf90_put_att(ncid, mosaic_varid, "standard_name", "grid_mosaic_spec") ) - call check( nf90_put_att(ncid, mosaic_varid, "children", "gridtiles")) - call check( nf90_put_att(ncid, mosaic_varid, "contact_regions", "contacts") ) - call check( nf90_put_att(ncid, mosaic_varid, "grid_descriptor", "") ) - - dimids1D = (/ string_dimid /) - call check( nf90_def_var(ncid, "gridlocation", NF90_CHAR, dimids1D, gridlocation_varid) ) - call check( nf90_put_att(ncid, gridlocation_varid, "standard_name", "grid_file_location") ) - - dimids2D = (/ string_dimid, ntiles_dimid /) - call check( nf90_def_var(ncid, "gridfiles", NF90_CHAR, dimids2D, gridfiles_varid) ) - call check( nf90_def_var(ncid, "gridtiles", NF90_CHAR, dimids2D, gridtiles_varid) ) - - call check( nf90_put_att(ncid, NF90_GLOBAL, "grid_version", "") ) - call check( nf90_put_att(ncid, NF90_GLOBAL, "code_version", "") ) - call check( nf90_put_att(ncid, NF90_GLOBAL, "history", "") ) - - call check( nf90_enddef(ncid) ) -! -!======================================================================= -! -! Assign values to variables in the grid mosaic file. The only one that -! seems to be read by the FV3 code (at least in regional mode) is the -! string variable "gridfiles" that contains the name of the grid speci- -! fication file. -! -!======================================================================= -! - mosaic = mosaic_fn - gridlocation = "/path/to/directory" - - call check( nf90_put_var(ncid, mosaic_varid, trim(mosaic)) ) - call check( nf90_put_var(ncid, gridlocation_varid, trim(gridlocation))) - - tile_inds(1) = 7 - do i=1, ntiles - write(tmp_str, 520) "tile", tile_inds(i) - call check( nf90_put_var(ncid, gridtiles_varid, trim(tmp_str), start=(/1,i/)) ) - tmp_str = trim(CRES) // "_grid." // trim(tmp_str) // ".nc" - call check( nf90_put_var(ncid, gridfiles_varid, trim(tmp_str), start=(/1,i/)) ) - end do -520 FORMAT(A, I1) -530 FORMAT(4A) - - call check( nf90_close(ncid) ) - -end program mosaic_file - - -subroutine check(status) - use netcdf - integer,intent(in) :: status -! - if(status /= nf90_noerr) then - write(0,*) ' check netcdf status = ', status - write(0,'("error ", a)') trim(nf90_strerror(status)) - stop "Stopped" - endif -end subroutine check diff --git a/sorc/regional_grid.fd/Makefile_cheyenne b/sorc/regional_grid.fd/Makefile_cheyenne deleted file mode 100644 index 95f68ca54..000000000 --- a/sorc/regional_grid.fd/Makefile_cheyenne +++ /dev/null @@ -1,29 +0,0 @@ -SHELL := bash - -MAKEFLAGS += --warn-undefined-variables - -INC = -I${NETCDF}/include - -LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ - ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a ${NETCDF}/lib/libsz.a -lz - -FC = ifort -FFLAGS = -g -O2 $(INC) - -REGIONAL_GRID = regional_grid - -.PHONY: all -all : $(REGIONAL_GRID) - -$(REGIONAL_GRID): pkind.o pietc.o pmat.o pmat4.o pmat5.o psym2.o gen_schmidt.o hgrid_ak.o regional_grid.o $(LIBS) - $(FC) $(FFLAGS) -o $@ $^ - -.SUFFIXES: -.SUFFIXES: .f90 .o - -.f90.o: - $(FC) $(FFLAGS) -c $< - -.PHONY: clean -clean: - rm -f *.o *.mod $(REGIONAL_GRID) diff --git a/sorc/regional_grid.fd/Makefile_hera b/sorc/regional_grid.fd/Makefile_hera deleted file mode 100644 index cdcb21494..000000000 --- a/sorc/regional_grid.fd/Makefile_hera +++ /dev/null @@ -1,29 +0,0 @@ -SHELL := bash - -MAKEFLAGS += --warn-undefined-variables - -INC = -I${NETCDF}/include - -LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ - ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a /apps/szip/2.1/lib/libsz.a -lz - -FC = ifort -FFLAGS = -g -O2 $(INC) - -REGIONAL_GRID = regional_grid - -.PHONY: all -all : $(REGIONAL_GRID) - -$(REGIONAL_GRID): pkind.o pietc.o pmat.o pmat4.o pmat5.o psym2.o gen_schmidt.o hgrid_ak.o regional_grid.o $(LIBS) - $(FC) $(FFLAGS) -o $@ $^ - -.SUFFIXES: -.SUFFIXES: .f90 .o - -.f90.o: - $(FC) $(FFLAGS) -c $< - -.PHONY: clean -clean: - rm -f *.o *.mod $(REGIONAL_GRID) diff --git a/sorc/regional_grid.fd/Makefile_jet b/sorc/regional_grid.fd/Makefile_jet deleted file mode 100644 index cdcb21494..000000000 --- a/sorc/regional_grid.fd/Makefile_jet +++ /dev/null @@ -1,29 +0,0 @@ -SHELL := bash - -MAKEFLAGS += --warn-undefined-variables - -INC = -I${NETCDF}/include - -LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ - ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a /apps/szip/2.1/lib/libsz.a -lz - -FC = ifort -FFLAGS = -g -O2 $(INC) - -REGIONAL_GRID = regional_grid - -.PHONY: all -all : $(REGIONAL_GRID) - -$(REGIONAL_GRID): pkind.o pietc.o pmat.o pmat4.o pmat5.o psym2.o gen_schmidt.o hgrid_ak.o regional_grid.o $(LIBS) - $(FC) $(FFLAGS) -o $@ $^ - -.SUFFIXES: -.SUFFIXES: .f90 .o - -.f90.o: - $(FC) $(FFLAGS) -c $< - -.PHONY: clean -clean: - rm -f *.o *.mod $(REGIONAL_GRID) diff --git a/sorc/regional_grid.fd/Makefile_odin b/sorc/regional_grid.fd/Makefile_odin deleted file mode 100644 index 5b143a753..000000000 --- a/sorc/regional_grid.fd/Makefile_odin +++ /dev/null @@ -1,29 +0,0 @@ -SHELL := bash - -MAKEFLAGS += --warn-undefined-variables - -INC = -I${NETCDF}/include - -LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ - ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a -lz - -FC = ftn -FFLAGS = -g -O2 $(INC) - -REGIONAL_GRID = regional_grid - -.PHONY: all -all : $(REGIONAL_GRID) - -$(REGIONAL_GRID): pkind.o pietc.o pmat.o pmat4.o pmat5.o psym2.o gen_schmidt.o hgrid_ak.o regional_grid.o - $(FC) $(FFLAGS) -o $@ $^ $(LIBS) - -.SUFFIXES: -.SUFFIXES: .f90 .o - -.f90.o: - $(FC) $(FFLAGS) -c $< - -.PHONY: clean -clean: - rm -f *.o *.mod $(REGIONAL_GRID) diff --git a/sorc/regional_grid.fd/Makefile_stampede b/sorc/regional_grid.fd/Makefile_stampede deleted file mode 100644 index 5f584611b..000000000 --- a/sorc/regional_grid.fd/Makefile_stampede +++ /dev/null @@ -1,29 +0,0 @@ - - -MAKEFLAGS += --warn-undefined-variables - -INC = -I${NETCDF}/include - -LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ - ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a ${HDF5}/lib/libsz.a -lz - -FC = mpiifort -FFLAGS = -g -O2 $(INC) - -REGIONAL_GRID = regional_grid - -.PHONY: all -all : $(REGIONAL_GRID) - -$(REGIONAL_GRID): pkind.o pietc.o pmat.o pmat4.o pmat5.o psym2.o gen_schmidt.o hgrid_ak.o regional_grid.o - $(FC) $(FFLAGS) -o $@ $^ $(LIBS) - -.SUFFIXES: -.SUFFIXES: .f90 .o - -.f90.o: - $(FC) $(FFLAGS) -c $< - -.PHONY: clean -clean: - rm -f *.o *.mod $(REGIONAL_GRID) diff --git a/sorc/regional_grid.fd/Makefile_theia b/sorc/regional_grid.fd/Makefile_theia deleted file mode 100644 index cdcb21494..000000000 --- a/sorc/regional_grid.fd/Makefile_theia +++ /dev/null @@ -1,29 +0,0 @@ -SHELL := bash - -MAKEFLAGS += --warn-undefined-variables - -INC = -I${NETCDF}/include - -LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ - ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a /apps/szip/2.1/lib/libsz.a -lz - -FC = ifort -FFLAGS = -g -O2 $(INC) - -REGIONAL_GRID = regional_grid - -.PHONY: all -all : $(REGIONAL_GRID) - -$(REGIONAL_GRID): pkind.o pietc.o pmat.o pmat4.o pmat5.o psym2.o gen_schmidt.o hgrid_ak.o regional_grid.o $(LIBS) - $(FC) $(FFLAGS) -o $@ $^ - -.SUFFIXES: -.SUFFIXES: .f90 .o - -.f90.o: - $(FC) $(FFLAGS) -c $< - -.PHONY: clean -clean: - rm -f *.o *.mod $(REGIONAL_GRID) diff --git a/sorc/regional_grid.fd/compile.sh b/sorc/regional_grid.fd/compile.sh deleted file mode 100755 index f931fce87..000000000 --- a/sorc/regional_grid.fd/compile.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -module purge -module load intel/18.1.163 -module load netcdf/4.6.1 -module load hdf5/1.10.4 -module list - -make -f Makefile_theia diff --git a/sorc/regional_grid.fd/gen_schmidt.f90 b/sorc/regional_grid.fd/gen_schmidt.f90 deleted file mode 100644 index 68fd2b6e2..000000000 --- a/sorc/regional_grid.fd/gen_schmidt.f90 +++ /dev/null @@ -1,477 +0,0 @@ -!============================================================================= -subroutine get_qqt(nxh,nyh,ncor,j0xy,p,q) -!============================================================================= -! Assume the grid to be mirror-symmetric across both medians, so that the -! computation of the quality diagnostic, Q, need only involve the positive -! quadrant of the grid. The norm associated with the definition of Q is the -! Frobenius norm (Q is the grid-mean of the squared-Frobenius norm of the -! log of the Gram matrix of the given distribution of jacobian matrices.) -!============================================================================= -use pkind, only: dp -use pietc, only: u0,u1,o2 -use pmat4, only: outer_product -use psym2 -implicit none -integer, intent(in ):: nxh,nyh,ncor -real(dp),dimension(3,2,0:nxh,0:nyh),intent(in ):: j0xy -real(dp),dimension(2,2), intent(inout):: p -real(dp), intent( out):: q -!----------------------------------------------------------------------------- -integer,parameter :: nit=5 -real(dp),parameter :: acrit=1.e-8,dpx=.0099 -real(dp),dimension(0:nxh,0:nyh) :: wxy -real(dp),dimension(3,2) :: j0,j -real(dp),dimension(2,2) :: el,pf,elp,elmean,g,ppx,pmx,ppy,pmy -real(dp),dimension(2) :: hess,grad -real(dp) :: anorm,q00,qpx,qmx,qpy,qmy,c,w -integer :: ix,iy,lx,ly,it -!============================================================================= -call get_wxy(nxh,nyh,ncor,wxy)! <- get 2D extended trapezoidal averaging wts -if(p(1,1)==u0)then; p=0; p(1,1)=u1; p(2,2)=u1; endif -! Iteratively calibrate preconditioner, p, to make elmean vanish: -anorm=1 -do it=1,nit - elmean=0 - q=0 - do iy=0,nyh; do ix=0,nxh - j0=j0xy(:,:,ix,iy); w=wxy(ix,iy) -! Precondition the Jacobian using latest iteration of P: - j=matmul(j0,p) -! Find the Gram matrix, G, implied by the column vectors of the new J: - g=matmul(transpose(j),j) -! Find the matrix logarithm, L = log(G), contrinutions to elmean and q: - call logsym2(g,el); el=el/2; elmean=elmean+w*el; q=q+w*sum(el**2) - enddo ; enddo - if(anormnit)then - print'("WARNING: In get_qqt, apparent failure of iteration to converge")' - read(*,*) -endif - -q00=q -ppx=p; ppx(1,1)=ppx(1,1)*(1+dpx);qpx=0 -pmx=p; pmx(1,1)=pmx(1,1)*(1-dpx);qmx=0 -ppy=p; ppy(2,2)=ppy(2,2)*(1+dpx);qpy=0 -pmy=p; pmy(2,2)=pmy(2,2)*(1-dpx);qmy=0 -do iy=0,nyh; do ix=0,nxh - j0=j0xy(:,:,ix,iy); w=wxy(ix,iy) - j=matmul(j0,ppx); g=matmul(transpose(j),j) - call logsym2(g,el); el=el/2; qpx=qpx+w*sum(el**2) - j=matmul(j0,pmx); g=matmul(transpose(j),j) - call logsym2(g,el); el=el/2; qmx=qmx+w*sum(el**2) - j=matmul(j0,ppy); g=matmul(transpose(j),j) - call logsym2(g,el); el=el/2; qpy=qpy+w*sum(el**2) - j=matmul(j0,pmy); g=matmul(transpose(j),j) - call logsym2(g,el); el=el/2; qmy=qmy+w*sum(el**2) -enddo; enddo -! Estimate a (diagonal) Hessian matrix and a gradient vector: -hess=(/ (qpx-2*q00+qmx)/dpx**2, (qpy-2*q00+qmy)/dpx**2 /) -grad=(/ (qpx-qmx)/(2*dpx) , (qpy-qmy)/(2*dpx) /) - -!!print'('' hessian components:'',t30,2(1x,e20.14))',hess !!!!!!! -!!print'('' grad components:'',t30,2(1x,e20.14))',grad !!!!!!! -! If the hessian is positive, polish the final p with a final Newton iteration: -if(hess(1)>0 .and. hess(2)>0.)then - c=u1-grad(1)/hess(1); p(:,1)=p(:,1)*c - c=u1-grad(2)/hess(2); p(:,2)=p(:,2)*c -endif - -! and calculate the new q. Keep it only if is numerically smaller than before: -q00=0 -do iy=0,nyh; do ix=0,nxh - j0=j0xy(:,:,ix,iy); w=wxy(ix,iy) - j=matmul(j0,p); g=matmul(transpose(j),j) - call logsym2(g,el); el=el/2; q00=q00+w*sum(el**2) -enddo; enddo -!!print'('' adjusted final q: '',e20.14)',q00 -if(q00nit)then - print'("WARNING: In get_qqt, apparent failure of iteration to converge")' - read(*,*) -endif - -q00=q -ppx=p; ppx(1,1)=ppx(1,1)*(1+dpx);qpx=0 -pmx=p; pmx(1,1)=pmx(1,1)*(1-dpx);qmx=0 -ppy=p; ppy(2,2)=ppy(2,2)*(1+dpx);qpy=0 -pmy=p; pmy(2,2)=pmy(2,2)*(1-dpx);qmy=0 -do iy=0,nyh; do ix=0,nxh - j0=j0xy(:,:,ix,iy); w=wxy(ix,iy) - j=matmul(j0,ppx); g=matmul(transpose(j),j) - call logsym2(g,el);el=el/2;qpx=qpx+w*(twc*sum(el**2)+tw*(el(1,1)+el(2,2))**2) - j=matmul(j0,pmx); g=matmul(transpose(j),j) - call logsym2(g,el);el=el/2;qmx=qmx+w*(twc*sum(el**2)+tw*(el(1,1)+el(2,2))**2) - j=matmul(j0,ppy); g=matmul(transpose(j),j) - call logsym2(g,el);el=el/2;qpy=qpy+w*(twc*sum(el**2)+tw*(el(1,1)+el(2,2))**2) - j=matmul(j0,pmy); g=matmul(transpose(j),j) - call logsym2(g,el);el=el/2;qmy=qmy+w*(twc*sum(el**2)+tw*(el(1,1)+el(2,2))**2) -enddo; enddo -! Estimate a (diagonal) Hessian matrix and a gradient vector: -hess=(/ (qpx-2*q00+qmx)/dpx**2, (qpy-2*q00+qmy)/dpx**2 /) -hess=(/8.,8./) -grad=(/ (qpx-qmx)/(2*dpx) , (qpy-qmy)/(2*dpx) /) -! If the hessian is positive, polish p with a final Newton iteration: -if(hess(1)>0 .and. hess(2)>0.)then - c=u1-grad(1)/hess(1); p(:,1)=p(:,1)*c - c=u1-grad(2)/hess(2); p(:,2)=p(:,2)*c -endif - -! and calculate the new q. Keep it only if it's numerically smaller than before: -q00=0 -do iy=0,nyh; do ix=0,nxh - j0=j0xy(:,:,ix,iy); w=wxy(ix,iy) - j=matmul(j0,p); g=matmul(transpose(j),j) - call logsym2(g,el);el=el/2;q00=q00+w*(twc*sum(el**2)+tw*(el(1,1)+el(2,2))**2) -enddo; enddo -if(q004)stop 'In get_wxy; ncor is out of bounds' -if(ncor>=min(nxh,nyh))stop 'In get_wxy; ncor is too large for this small grid' -! the wx and wy are the weight coefficients for an unnormalized -! extended trapezoidal integration. The end correction coefficients can -! be found by staggering, then summing, the Adams-Moulton coefficients -! at both ends. -wx=u1; wx(0)=o2; wx(nxh:nxh-ncor:-1)=cor -wy=u1; wy(0)=o2; wy(nyh:nyh-ncor:-1)=cor -wxy=outer_product(wx,wy); wxy=wxy/sum(wxy) -end subroutine get_wxy - -!============================================================================= -subroutine getedges(arcx,arcy,edgex,edgey) -!============================================================================= -! For angles (degrees) of the arcs spanning the halfwidths between the -! region's center and its x and y edges, get the two cartesian vectors -! that represent the locations of these edge midpoints in the positive x and y -! directions. -!============================================================================= -use pkind, only: dp -use pietc, only: u0,dtor -implicit none -real(dp), intent(in ):: arcx,arcy -real(dp),dimension(3),intent(out):: edgex,edgey -!------------------------------------------------------------------------------ -real(dp):: cx,sx,cy,sy -!============================================================================== -cx=cos(arcx*dtor); sx=sin(arcx*dtor) -cy=cos(arcy*dtor); sy=sin(arcy*dtor) -edgex=(/sx,u0,cx/); edgey=(/u0,sy,cy/) -end subroutine getedges - -!============================================================================== -subroutine xmtoxc_ak(a,kappa,xm,xc,xcd,ff) -!============================================================================== -! Assuming the A-kappa parameterization of the generalized schmidt-transformed -! gnomonic mapping, and given a map-space 2-vector, xm, find the corresponding -! cartesian unit 3-vector and its derivative wrt xm, jacobian matrix, xcd. -! If for any reason the mapping cannot be done, return a raised failure -! flag, FF. -!============================================================================= -use pkind, only: dp -use pietc, only: T,F -implicit none -real(dp), intent(in ):: a,kappa -real(dp),dimension(2), intent(in ):: xm -real(dp),dimension(3), intent(out):: xc -real(dp),dimension(3,2),intent(out):: xcd -logical, intent(out):: ff -!----------------------------------------------------------------------------- -real(dp),dimension(2,2):: xtd,xsd -real(dp),dimension(2) :: xt,xs -!============================================================================= -call xmtoxt(a,xm,xt,xtd,ff); if(ff)return -call xttoxs(kappa,xt,xs,xsd,ff); if(ff)return -xsd=matmul(xsd,xtd) -call xstoxc(xs,xc,xcd) -xcd=matmul(xcd,xsd) -end subroutine xmtoxc_ak - -!============================================================================= -subroutine xctoxm_ak(a,kappa,xc,xm,ff) -!============================================================================= -! Inverse mapping of xmtoxc_ak. That is, go from given cartesian unit 3-vector, -! xc, to map coordinate 2-vector xm (or return a raised failure flag, FF, if -! the attempt fails). -!============================================================================= -use pkind, only: dp -use pietc, only: F,T,u0,u1 -implicit none -real(dp), intent(in ):: a,kappa -real(dp),dimension(3),intent(in ):: xc -real(dp),dimension(2),intent(out):: xm -logical, intent(out):: ff -!----------------------------------------------------------------------------- -real(dp),dimension(2):: xs,xt -!============================================================================= -ff=F -call xctoxs(xc,xs) -call xstoxt(kappa,xs,xt,ff); if(ff)return -call xttoxm(a,xt,xm,ff) -end subroutine xctoxm_ak - -!============================================================================== -subroutine zmtozt(a,zm,zt,ztd,ff) -!============================================================================== -! Evaluate the function, zt = tan(sqrt(A)*z)/sqrt(A), and its deivative, ztd, -! for positive and negative A and for the limiting case, A --> 0 -!============================================================================== -use pkind, only: dp -use pietc, only: F,T,u1,pih -implicit none -real(dp),intent(in ):: a,zm -real(dp),intent(out):: zt,ztd -logical, intent(out):: ff -!------------------------------------------------------------------------------ -real(dp):: ra -!============================================================================== -ff=f -if (a>0)then; ra=sqrt( a); zt=tan (ra*zm)/ra; ff=abs(ra*zm)>=pih -elseif(a<0)then; ra=sqrt(-a); zt=tanh(ra*zm)/ra -else ; zt=zm -endif -ztd=u1+a*zt*zt -end subroutine zmtozt - -!============================================================================= -subroutine zttozm(a,zt,zm,ff) -!============================================================================= -! Inverse of zmtozt -!============================================================================= -use pkind, only: dp -use pietc, only: F,u1 -implicit none -real(dp),intent(in ):: a,zt -real(dp),intent(out):: zm -logical, intent(out):: ff -!----------------------------------------------------------------------------- -real(dp):: ra,razt -!============================================================================= -ff=F -if (a>0)then; ra=sqrt( a); razt=ra*zt; zm=atan (razt)/ra -elseif(a<0)then; ra=sqrt(-a); razt=ra*zt; ff=abs(razt)>=u1; if(ff)return - zm=atanh(razt)/ra -else ; zm=zt -endif -end subroutine zttozm - -!============================================================================== -subroutine xmtoxt(a,xm,xt,xtd,ff) -!============================================================================== -! Like zmtozt, but for 2-vector xm and xt, and 2*2 diagonal Jacobian xtd -!============================================================================== -use pkind, only: dp -implicit none -real(dp), intent(in ):: a -real(dp),dimension(2), intent(in ):: xm -real(dp),dimension(2), intent(out):: xt -real(dp),dimension(2,2),intent(out):: xtd -logical, intent(out):: ff -!----------------------------------------------------------------------------- -integer:: i -!============================================================================== -xtd=0; do i=1,2; call zmtozt(a,xm(i),xt(i),xtd(i,i),ff); if(ff)return; enddo -end subroutine xmtoxt - -!============================================================================= -subroutine xttoxm(a,xt,xm,ff) -!============================================================================= -! Inverse of xmtoxt -!============================================================================ -use pkind, only: dp -use pietc, only: F -implicit none -real(dp), intent(in ):: a -real(dp),dimension(2),intent(in ):: xt -real(dp),dimension(2),intent(out):: xm -logical ,intent(out):: ff -!----------------------------------------------------------------------------- -integer:: i -!============================================================================= -do i=1,2; call zttozm(a,xt(i),xm(i),ff); if(ff)return; enddo -end subroutine xttoxm - -!============================================================================== -subroutine xttoxs(kappa,xt,xs,xsd,ff) -!============================================================================== -! Scaled gnomonic plane xt to standard stereographic plane xs -!============================================================================== -use pkind, only: dp -use pietc, only: u0,u1 -implicit none -real(dp), intent(in ):: kappa -real(dp),dimension(2), intent(in ):: xt -real(dp),dimension(2), intent(out):: xs -real(dp),dimension(2,2),intent(out):: xsd -logical, intent(out):: ff -!------------------------------------------------------------------------------ -real(dp):: s,sp,rsp,rspp,rspps,rspdx,rspdy -!============================================================================== -s=kappa*(xt(1)*xt(1) + xt(2)*xt(2)); sp=u1+s -ff=(sp<=u0); if(ff)return -rsp=sqrt(sp) -rspp=u1+rsp -rspps=rspp**2 -xs=xt/rspp -rspdx=kappa*xt(1)/rsp -rspdy=kappa*xt(2)/rsp -xsd(1,1)=u1/rspp -xt(1)*rspdx/rspps -xsd(1,2)= -xt(1)*rspdy/rspps -xsd(2,1)= -xt(2)*rspdx/rspps -xsd(2,2)=u1/rspp -xt(2)*rspdy/rspps -end subroutine xttoxs - -!============================================================================= -subroutine xstoxt(kappa,xs,xt,ff) -!============================================================================= -! Inverse of xttoxs. -!============================================================================= -use pkind, only: dp -use pietc, only: u1 -implicit none -real(dp), intent(in ):: kappa -real(dp),dimension(2),intent(in ):: xs -real(dp),dimension(2),intent(out):: xt -logical, intent(out):: ff -!----------------------------------------------------------------------------- -real(dp):: s,sc -!============================================================================= -s=kappa*(xs(1)*xs(1)+xs(2)*xs(2)); sc=u1-s -ff=(sc<=0); if(ff)return -xt=2*xs/sc -end subroutine xstoxt - -!============================================================================= -subroutine xstoxc(xs,xc,xcd) -!============================================================================= -! Standard transformation from polar stereographic map coordinates, xs, to -! cartesian, xc, assuming the projection axis is polar. -! xcd=d(xc)/d(xs) is the jacobian matrix -!============================================================================= -use pkind, only: dp -use pietc, only: u1,u2 -use pmat4, only: outer_product -implicit none -real(dp),dimension(2), intent(in ):: xs -real(dp),dimension(3), intent(out):: xc -real(dp),dimension(3,2),intent(out):: xcd -!----------------------------------------------------------------------------- -real(dp):: zp -!============================================================================= -zp=u2/(u1+dot_product(xs,xs)); xc(1:2)=xs*zp; xc(3)=zp -xcd=-outer_product(xc,xs)*zp; xcd(1,1)=xcd(1,1)+zp; xcd(2,2)=xcd(2,2)+zp -xc(3)=xc(3)-u1 -end subroutine xstoxc - -!============================================================================= -subroutine xctoxs(xc,xs) -!============================================================================= -! Inverse of xstoxc. I.e., cartesians to stereographic -!============================================================================= -use pkind, only: dp -use pietc, only: u1 -implicit none -real(dp),dimension(3),intent(in ):: xc -real(dp),dimension(2),intent(out):: xs -!----------------------------------------------------------------------------- -real(dp):: zp -!============================================================================= -zp=u1+xc(3); xs=xc(1:2)/zp -end subroutine xctoxs diff --git a/sorc/regional_grid.fd/hgrid_ak.f90 b/sorc/regional_grid.fd/hgrid_ak.f90 deleted file mode 100644 index 389f53a69..000000000 --- a/sorc/regional_grid.fd/hgrid_ak.f90 +++ /dev/null @@ -1,104 +0,0 @@ -!============================================================================= -subroutine hgrid_ak(lx,ly,nx,ny,a,k,plat,plon,pazi, & - re,delx,dely, glat,glon,garea, ff) -!============================================================================= -! Use a and k as the parameters of a generalized Schmidt-transformed -! gnomonic mapping centered at (plat,plon) and twisted about this center -! by an azimuth angle of pazi counterclockwise (these angles in radians). -! -! Assuming the radius of the earth is re, and using the central mapping -! point as the coordinate origin, set up the grid with central x-spacing delx -! and y-spacing dely in physical units, and with the location of the left-lower -! corner of the grid at center-relative grid index pair, (lx,ly) and with -! the number of the grid spaces in x and y directions given by nx and ny. -! (Note that, for a centered rectangular grid lx and ly are negative and, in -! magnitude, half the values of nx and ny respectively.) -! Return the latitude and longitude, in radians again, of the grid points thus -! defined in the arrays, glat and glon, and return a rectangular array, garea, -! of dimensions nx-1 by ny-1, that contains the areas of each of the grid cells -! in the SQUARE of the same physical length unit that was employed to define -! the radius of the earth, re (and the central grid steps, delx and dely). -! -! if all goes well, return a .FALSE. failure flag, ff. If, for some -! reason, it is not possible to complete this task, return the failure flag -! as .TRUE. -!============================================================================= -use pkind, only: dp -use pietc, only: u0,u1,dtor -use pmat4, only: sarea -use pmat5, only: ctog -implicit none -integer, intent(in ):: lx,ly,nx,ny -real(dp), intent(in ):: a,k,plat,plon,pazi, & - re,delx,dely -real(dp),dimension(lx:lx+nx ,ly:ly+ny ),intent(out):: glat,glon -real(dp),dimension(lx:lx+nx-1,ly:ly+ny-1),intent(out):: garea -logical, intent(out):: ff -!----------------------------------------------------------------------------- -real(dp),dimension(3,3):: prot,azirot -real(dp),dimension(3,2):: xcd -real(dp),dimension(3) :: xc -real(dp),dimension(2) :: xm -real(dp) :: clat,slat,clon,slon,cazi,sazi,& - rlat,drlata,drlatb,drlatc, & - rlon,drlona,drlonb,drlonc, rre -integer :: ix,iy,mx,my -!============================================================================= -clat=cos(plat); slat=sin(plat) -clon=cos(plon); slon=sin(plon) -cazi=cos(pazi); sazi=sin(pazi) - -azirot(:,1)=(/ cazi, sazi, u0/) -azirot(:,2)=(/-sazi, cazi, u0/) -azirot(:,3)=(/ u0, u0, u1/) - -prot(:,1)=(/ -slon, clon, u0/) -prot(:,2)=(/-slat*clon, -slat*slon, clat/) -prot(:,3)=(/ clat*clon, clat*slon, slat/) -prot=matmul(prot,azirot) -mx=lx+nx ! Index of the 'right' edge of the rectangular grid -my=ly+ny ! Index of the 'top' edge of the rectangular grid -!This code assumes symmetry about the grid center -do iy=ly,my - !xm(2)=iy*dely/re - xm(2)=-iy*dely/re - do ix=lx,mx - !xm(1)=ix*delx/re - xm(1)=-ix*delx/re - call xmtoxc_ak(a,k,xm,xc,xcd,ff) - if(ff)return - xcd=matmul(prot,xcd) - xc =matmul(prot,xc ) - call ctog(xc,glat(ix,iy),glon(ix,iy)) - enddo -enddo - -! Convert degrees to radians in the glat and glon arrays: -glat=glat*dtor -glon=glon*dtor - -! Compute the areas of the quadrilateral grid cells: -do iy=ly,my-1 - do ix=lx,mx-1 - rlat =glat(ix ,iy ) - drlata=glat(ix+1,iy )-rlat - drlatb=glat(ix+1,iy+1)-rlat - drlatc=glat(ix ,iy+1)-rlat - rlon =glon(ix ,iy ) - drlona=glon(ix+1,iy )-rlon - drlonb=glon(ix+1,iy+1)-rlon - drlonc=glon(ix ,iy+1)-rlon -! If 'I' is the grid point (ix,iy), 'A' is (ix+1,iy); 'B' is (ix+1,iy+1) -! and 'C' is (ix,iy+1), then the area of the grid cell IABC is the sum of -! the areas of the traingles, IAB and IBC (the latter being the negative -! of the signed area of triangle, ICB): - garea(ix,iy)=sarea(rlat, drlata,drlona, drlatb,drlonb) & - -sarea(rlat, drlatc,drlonc, drlatb,drlonb) - enddo -enddo -! Convert the areas to area units consistent with the length units used for -! the radius, re, of the sphere: -rre=re*re -garea=garea*rre - -end subroutine hgrid_ak diff --git a/sorc/regional_grid.fd/pietc.f90 b/sorc/regional_grid.fd/pietc.f90 deleted file mode 100644 index f6abe1af3..000000000 --- a/sorc/regional_grid.fd/pietc.f90 +++ /dev/null @@ -1,95 +0,0 @@ -! -!============================================================================= -module pietc -!============================================================================= -! R. J. Purser (jim.purser@noaa.gov) 2014 -! Some of the commonly used constants (pi etc) mainly for double-precision -! subroutines. -! ms10 etc are needed to satisfy the some (eg., gnu fortran) compilers' -! more rigorous standards regarding the way "data" statements are initialized. -! Zero and the first few units are u0,u1,u2, etc., their reciprocals being, -! o2,o3 etc and their square roots, r2,r3. Reciprocal roots are or2,or3 etc. -!============================================================================= -use pkind, only: dp,dpc -implicit none -logical ,parameter:: T=.true.,F=.false. !<- for pain-relief in logical ops -real(dp),parameter:: & - u0=0,u1=1,mu1=-u1,u2=2,mu2=-u2,u3=3,mu3=-u3,u4=4,mu4=-u4,u5=5,mu5=-u5, & - u6=6,mu6=-u6,o2=u1/2,o3=u1/3,o4=u1/4,o5=u1/5,o6=u1/6, & - pi =3.1415926535897932384626433832795028841971693993751058209749e0_dp, & - pi2=6.2831853071795864769252867665590057683943387987502116419498e0_dp, & - pih=1.5707963267948966192313216916397514420985846996875529104874e0_dp, & - rpi=1.7724538509055160272981674833411451827975494561223871282138e0_dp, & -! Important square-roots - r2 =1.4142135623730950488016887242096980785696718753769480731766e0_dp, & - r3 =1.7320508075688772935274463415058723669428052538103806280558e0_dp, & - r5 =2.2360679774997896964091736687312762354406183596115257242708e0_dp, & - or2=u1/r2,or3=u1/r3,or5=u1/r5, & -! Golden number: - phi=1.6180339887498948482045868343656381177203091798057628621354e0_dp, & -! Euler-Mascheroni constant: - euler=0.57721566490153286060651209008240243104215933593992359880e0_dp, & -! Degree to radians; radians to degrees: - dtor=pi/180,rtod=180/pi, & -! Sines of all main fractions of 90 degrees (down to ninths): - s10=.173648177666930348851716626769314796000375677184069387236241e0_dp,& - s11=.195090322016128267848284868477022240927691617751954807754502e0_dp,& - s13=.222520933956314404288902564496794759466355568764544955311987e0_dp,& - s15=.258819045102520762348898837624048328349068901319930513814003e0_dp,& - s18=.309016994374947424102293417182819058860154589902881431067724e0_dp,& - s20=.342020143325668733044099614682259580763083367514160628465048e0_dp,& - s22=.382683432365089771728459984030398866761344562485627041433800e0_dp,& - s26=.433883739117558120475768332848358754609990727787459876444547e0_dp,& - s30=o2, & - s34=.555570233019602224742830813948532874374937190754804045924153e0_dp,& - s36=.587785252292473129168705954639072768597652437643145991072272e0_dp,& - s39=.623489801858733530525004884004239810632274730896402105365549e0_dp,& - s40=.642787609686539326322643409907263432907559884205681790324977e0_dp,& - s45=or2, & - s50=.766044443118978035202392650555416673935832457080395245854045e0_dp,& - s51=.781831482468029808708444526674057750232334518708687528980634e0_dp,& - s54=.809016994374947424102293417182819058860154589902881431067724e0_dp,& - s56=.831469612302545237078788377617905756738560811987249963446124e0_dp,& - s60=r3*o2, & - s64=.900968867902419126236102319507445051165919162131857150053562e0_dp,& - s68=.923879532511286756128183189396788286822416625863642486115097e0_dp,& - s70=.939692620785908384054109277324731469936208134264464633090286e0_dp,& - s72=.951056516295153572116439333379382143405698634125750222447305e0_dp,& - s75=.965925826289068286749743199728897367633904839008404550402343e0_dp,& - s77=.974927912181823607018131682993931217232785800619997437648079e0_dp,& - s79=.980785280403230449126182236134239036973933730893336095002916e0_dp,& - s80=.984807753012208059366743024589523013670643251719842418790025e0_dp,& -! ... and their minuses: - ms10=-s10,ms11=-s11,ms13=-s13,ms15=-s15,ms18=-s18,ms20=-s20,ms22=-s22,& - ms26=-s26,ms30=-s30,ms34=-s34,ms36=-s36,ms39=-s39,ms40=-s40,ms45=-s45,& - ms50=-s50,ms51=-s51,ms54=-s54,ms56=-s56,ms60=-s60,ms64=-s64,ms68=-s68,& - ms70=-s70,ms72=-s72,ms75=-s75,ms77=-s77,ms79=-s79,ms80=-s80 - -complex(dpc),parameter:: & - c0=(u0,u0),c1=(u1,u0),mc1=-c1,ci=(u0,u1),mci=-ci,cipi=ci*pi, & -! Main fractional rotations, as unimodular complex numbers: - z000=c1 ,z010=( s80,s10),z011=( s79,s11),z013=( s77,s13),& - z015=( s75,s15),z018=( s72,s18),z020=( s70,s20),z022=( s68,s22),& - z026=( s64,s26),z030=( s60,s30),z034=( s56,s34),z036=( s54,s36),& - z039=( s51,s39),z040=( s50,s40),z045=( s45,s45),z050=( s40,s50),& - z051=( s39,s51),z054=( s36,s54),z056=( s34,s56),z060=( s30,s60),& - z064=( s26,s64),z068=( s22,s68),z070=( s20,s70),z072=( s18,s72),& - z075=( s15,s75),z077=( s13,s77),z079=( s11,s79),z080=( s10,s80),& - z090=ci, z100=(ms10,s80),z101=(ms11,s79),z103=(ms13,s77),& - z105=(ms15,s75),z108=(ms18,s72),z110=(ms20,s70),z112=(ms22,s68),& - z116=(ms26,s64),z120=(ms30,s60),z124=(ms34,s56),z126=(ms36,s54),& - z129=(ms39,s51),z130=(ms40,s50),z135=(ms45,s45),z140=(ms50,s40),& - z141=(ms51,s39),z144=(ms54,s36),z146=(ms56,s34),z150=(ms60,s30),& - z154=(ms64,s26),z158=(ms68,s22),z160=(ms70,s20),z162=(ms72,s18),& - z165=(ms75,s15),z167=(ms77,s13),z169=(ms79,s11),z170=(ms80,s10),& - z180=-z000,z190=-z010,z191=-z011,z193=-z013,z195=-z015,z198=-z018,& - z200=-z020,z202=-z022,z206=-z026,z210=-z030,z214=-z034,z216=-z036,& - z219=-z039,z220=-z040,z225=-z045,z230=-z050,z231=-z051,z234=-z054,& - z236=-z056,z240=-z060,z244=-z064,z248=-z068,z250=-z070,z252=-z072,& - z255=-z075,z257=-z077,z259=-z079,z260=-z080,z270=-z090,z280=-z100,& - z281=-z101,z283=-z103,z285=-z105,z288=-z108,z290=-z110,z292=-z112,& - z296=-z116,z300=-z120,z304=-z124,z306=-z126,z309=-z129,z310=-z130,& - z315=-z135,z320=-z140,z321=-z141,z324=-z144,z326=-z146,z330=-z150,& - z334=-z154,z338=-z158,z340=-z160,z342=-z162,z345=-z165,z347=-z167,& - z349=-z169,z350=-z170 -end module pietc diff --git a/sorc/regional_grid.fd/pkind.f90 b/sorc/regional_grid.fd/pkind.f90 deleted file mode 100644 index abc5841b7..000000000 --- a/sorc/regional_grid.fd/pkind.f90 +++ /dev/null @@ -1,8 +0,0 @@ -module pkind -private:: one_dpi; integer(8),parameter:: one_dpi=1 -integer,parameter:: dpi=kind(one_dpi) -integer,parameter:: sp=kind(1.0) -integer,parameter:: dp=kind(1.0d0) -integer,parameter:: spc=kind((1.0,1.0)) -integer,parameter:: dpc=kind((1.0d0,1.0d0)) -end module pkind diff --git a/sorc/regional_grid.fd/pmat.f90 b/sorc/regional_grid.fd/pmat.f90 deleted file mode 100644 index 11f1b0f7b..000000000 --- a/sorc/regional_grid.fd/pmat.f90 +++ /dev/null @@ -1,1082 +0,0 @@ -! -! ********************************************** -! * MODULE pmat * -! * R. J. Purser, NOAA/NCEP/EMC 1993 * -! * and Tsukasa Fujita, visiting scientist * -! * from JMA. * -! * Major modifications: 2002, 2009, 2012 * -! * jim.purser@noaa.gov * -! * * -! ********************************************** -! -! Utility routines for various linear inversions and Cholesky. -! Dependency: modules pkind, pietc -! Originally, these routines were copies of the purely "inversion" members -! of pmat1.f90 (a most extensive collection of matrix routines -- not just -! inversions). As well as having both single and double precision versions -! of each routine, these versions also make provision for a more graceful -! termination in cases where the system matrix is detected to be -! essentially singular (and therefore noninvertible). This provision takes -! the form of an optional "failure flag", FF, which is normally returned -! as .FALSE., but is returned as .TRUE. when inversion fails. -! In Sep 2012, these routines were collected together into pmat.f90 so -! that all the main matrix routines could be in the same library, pmat.a. -! -! DIRECT DEPENDENCIES: -! Modules: pkind, pietc -! -!============================================================================= -module pmat -!============================================================================= -use pkind, only: sp,dp,spc,dpc -use pietc, only: t,f -implicit none -private -public:: ldum,udlmm,inv,L1Lm,LdLm,invl,invu -interface swpvv; module procedure sswpvv,dswpvv,cswpvv; end interface -interface ldum - module procedure sldum,dldum,cldum,sldumf,dldumf,cldumf; end interface -interface udlmm - module procedure sudlmm,dudlmm,cudlmm,sudlmv,dudlmv,cudlmv; end interface -interface inv - module procedure & -sinvmt, dinvmt, cinvmt, slinmmt, dlinmmt, clinmmt, slinmvt, dlinmvt, clinmvt, & -sinvmtf,dinvmtf,cinvmtf,slinmmtf,dlinmmtf,clinmmtf,slinmvtf,dlinmvtf,clinmvtf,& -iinvf - end interface -interface L1Lm; module procedure sL1Lm,dL1Lm,sL1Lmf,dL1Lmf; end interface -interface LdLm; module procedure sLdLm,dLdLm,sLdLmf,dLdLmf; end interface -interface invl; module procedure sinvl,dinvl,slinlv,dlinlv; end interface -interface invu; module procedure sinvu,dinvu,slinuv,dlinuv; end interface - -contains - -!============================================================================= -subroutine sswpvv(d,e)! [swpvv] -!============================================================================= -! Swap vectors -!------------- -real(sp), intent(inout) :: d(:), e(:) -real(sp) :: tv(size(d)) -!============================================================================= -tv = d; d = e; e = tv -end subroutine sswpvv -!============================================================================= -subroutine dswpvv(d,e)! [swpvv] -!============================================================================= -real(dp), intent(inout) :: d(:), e(:) -real(dp) :: tv(size(d)) -!============================================================================= -tv = d; d = e; e = tv -end subroutine dswpvv -!============================================================================= -subroutine cswpvv(d,e)! [swpvv] -!============================================================================= -complex(dpc),intent(inout) :: d(:), e(:) -complex(dpc) :: tv(size(d)) -!============================================================================= -tv = d; d = e; e = tv -end subroutine cswpvv - -!============================================================================= -subroutine sinvmt(a)! [inv] -!============================================================================= -real(sp),dimension(:,:),intent(INOUT):: a -logical :: ff -call sinvmtf(a,ff) -if(ff)stop 'In sinvmt; Unable to invert matrix' -end subroutine sinvmt -!============================================================================= -subroutine dinvmt(a)! [inv] -!============================================================================= -real(dp),dimension(:,:),intent(inout):: a -logical :: ff -call dinvmtf(a,ff) -if(ff)stop 'In dinvmt; Unable to invert matrix' -end subroutine dinvmt -!============================================================================= -subroutine cinvmt(a)! [inv] -!============================================================================= -complex(dpc),dimension(:,:),intent(inout):: a -logical :: ff -call cinvmtf(a,ff) -if(ff)stop 'In cinvmt; Unable to invert matrix' -end subroutine cinvmt -!============================================================================= -subroutine sinvmtf(a,ff)! [inv] -!============================================================================= -! Invert matrix (or flag if can't) -!---------------- -real(sp),dimension(:,:),intent(inout):: a -logical, intent( out):: ff -integer :: m,i,j,jp,l -real(sp) :: d -integer,dimension(size(a,1)) :: ipiv -!============================================================================= -m=size(a,1) -if(m /= size(a,2))stop 'In sinvmtf; matrix passed to sinvmtf is not square' -! Perform a pivoted L-D-U decomposition on matrix a: -call sldumf(a,ipiv,d,ff) -if(ff)then - print '(" In sinvmtf; failed call to sldumf")' - return -endif - -! Invert upper triangular portion U in place: -do i=1,m; a(i,i)=1./a(i,i); enddo -do i=1,m-1 - do j=i+1,m; a(i,j)=-a(j,j)*dot_product(a(i:j-1,j),a(i,i:j-1)); enddo -enddo - -! Invert lower triangular portion L in place: -do j=1,m-1; jp=j+1 - do i=jp,m; a(i,j)=-a(i,j)-dot_product(a(jp:i-1,j),a(i,jp:i-1)); enddo -enddo - -! Form the product of U**-1 and L**-1 in place -do j=1,m-1; jp=j+1 - do i=1,j; a(i,j)=a(i,j)+dot_product(a(jp:m,j),a(i,jp:m)); enddo - do i=jp,m; a(i,j)=dot_product(a(i:m,j),a(i,i:m)); enddo -enddo - -! Permute columns according to ipiv -do j=m-1,1,-1; l=ipiv(j); call sswpvv(a(:,j),a(:,l)); enddo -end subroutine sinvmtf -!============================================================================= -subroutine dinvmtf(a,ff)! [inv] -!============================================================================= -real(DP),dimension(:,:),intent(INOUT):: a -logical, intent( OUT):: ff -integer :: m,i,j,jp,l -real(DP) :: d -integer, dimension(size(a,1)) :: ipiv -!============================================================================= -m=size(a,1) -if(m /= size(a,2))stop 'In inv; matrix passed to dinvmtf is not square' -! Perform a pivoted L-D-U decomposition on matrix a: -call dldumf(a,ipiv,d,ff) -if(ff)then - print '(" In dinvmtf; failed call to dldumf")' - return -endif - -! Invert upper triangular portion U in place: -do i=1,m; a(i,i)=1/a(i,i); enddo -do i=1,m-1 - do j=i+1,m; a(i,j)=-a(j,j)*dot_product(a(i:j-1,j),a(i,i:j-1)); enddo -enddo - -! Invert lower triangular portion L in place: -do j=1,m-1; jp=j+1 - do i=jp,m; a(i,j)=-a(i,j)-dot_product(a(jp:i-1,j),a(i,jp:i-1)); enddo -enddo - -! Form the product of U**-1 and L**-1 in place -do j=1,m-1; jp=j+1 - do i=1,j; a(i,j)=a(i,j)+dot_product(a(jp:m,j),a(i,jp:m)); enddo - do i=jp,m; a(i,j)=dot_product(a(i:m,j),a(i,i:m)); enddo -enddo - -! Permute columns according to ipiv -do j=m-1,1,-1; l=ipiv(j); call dswpvv(a(:,j),a(:,l)); enddo -end subroutine dinvmtf -!============================================================================= -subroutine cinvmtf(a,ff)! [inv] -!============================================================================= -complex(dpc),dimension(:,:),intent(INOUT):: a -logical, intent( OUT):: ff -integer :: m,i,j,jp,l -complex(dpc) :: d -integer, dimension(size(a,1)) :: ipiv -!============================================================================= -m=size(a,1) -if(m /= size(a,2))stop 'In inv; matrix passed to cinvmtf is not square' -! Perform a pivoted L-D-U decomposition on matrix a: -call cldumf(a,ipiv,d,ff) -if(ff)then - print '(" In cinvmtf; failed call to cldumf")' - return -endif - -! Invert upper triangular portion U in place: -do i=1,m; a(i,i)=1/a(i,i); enddo -do i=1,m-1 - do j=i+1,m; a(i,j)=-a(j,j)*sum(a(i:j-1,j)*a(i,i:j-1)); enddo -enddo - -! Invert lower triangular portion L in place: -do j=1,m-1; jp=j+1 - do i=jp,m; a(i,j)=-a(i,j)-sum(a(jp:i-1,j)*a(i,jp:i-1)); enddo -enddo - -! Form the product of U**-1 and L**-1 in place -do j=1,m-1; jp=j+1 - do i=1,j; a(i,j)=a(i,j)+sum(a(jp:m,j)*a(i,jp:m)); enddo - do i=jp,m; a(i,j)=sum(a(i:m,j)*a(i,i:m)); enddo -enddo - -! Permute columns according to ipiv -do j=m-1,1,-1; l=ipiv(j); call cswpvv(a(:,j),a(:,l)); enddo -end subroutine cinvmtf - -!============================================================================= -subroutine slinmmt(a,b)! [inv] -!============================================================================= -real(sp),dimension(:,:),intent(inout):: a,b -logical :: ff -call slinmmtf(a,b,ff) -if(ff)stop 'In slinmmt; unable to invert linear system' -end subroutine slinmmt -!============================================================================= -subroutine dlinmmt(a,b)! [inv] -!============================================================================= -real(dp),dimension(:,:),intent(inout):: a,b -logical :: ff -call dlinmmtf(a,b,ff) -if(ff)stop 'In dlinmmt; unable to invert linear system' -end subroutine dlinmmt -!============================================================================= -subroutine clinmmt(a,b)! [inv] -!============================================================================= -complex(dpc),dimension(:,:),intent(inout):: a,b -logical :: ff -call clinmmtf(a,b,ff) -if(ff)stop 'In clinmmt; unable to invert linear system' -end subroutine clinmmt -!============================================================================= -subroutine slinmmtf(a,b,ff)! [inv] -!============================================================================= -real(SP), dimension(:,:),intent(INOUT):: a,b -logical, intent( OUT):: ff -integer,dimension(size(a,1)) :: ipiv -integer :: m -real(sp) :: d -!============================================================================= -m=size(a,1) -if(m /= size(a,2))stop 'In inv; matrix passed to slinmmtf is not square' -if(m /= size(b,1))& - stop 'In inv; matrix and vectors in slinmmtf have unmatched sizes' -call sldumf(a,ipiv,d,ff) -if(ff)then - print '("In slinmmtf; failed call to sldumf")' - return -endif -call sudlmm(a,b,ipiv) -end subroutine slinmmtf -!============================================================================= -subroutine dlinmmtf(a,b,ff)! [inv] -!============================================================================= -real(dp),dimension(:,:), intent(inout):: a,b -logical, intent( out):: ff -integer, dimension(size(a,1)) :: ipiv -integer :: m -real(dp) :: d -!============================================================================= -m=size(a,1) -if(m /= size(a,2))stop 'In inv; matrix passed to dlinmmtf is not square' -if(m /= size(b,1))& - stop 'In inv; matrix and vectors in dlinmmtf have unmatched sizes' -call dldumf(a,ipiv,d,ff) -if(ff)then - print '("In dlinmmtf; failed call to dldumf")' - return -endif -call dudlmm(a,b,ipiv) -end subroutine dlinmmtf -!============================================================================= -subroutine clinmmtf(a,b,ff)! [inv] -!============================================================================= -complex(dpc),dimension(:,:),intent(INOUT):: a,b -logical, intent( OUT):: ff -integer, dimension(size(a,1)) :: ipiv -integer :: m -complex(dpc) :: d -!============================================================================= -m=size(a,1) -if(m /= size(a,2))stop 'In inv; matrix passed to dlinmmtf is not square' -if(m /= size(b,1))& - stop 'In inv; matrix and vectors in dlinmmtf have unmatched sizes' -call cldumf(a,ipiv,d,ff) -if(ff)then - print '("In clinmmtf; failed call to cldumf")' - return -endif -call cudlmm(a,b,ipiv) -end subroutine clinmmtf - -!============================================================================= -subroutine slinmvt(a,b)! [inv] -!============================================================================= -real(sp), dimension(:,:),intent(inout):: a -real(sp), dimension(:), intent(inout):: b -logical :: ff -call slinmvtf(a,b,ff) -if(ff)stop 'In slinmvt; matrix singular, unable to continue' -end subroutine slinmvt -!============================================================================= -subroutine dlinmvt(a,b)! [inv] -!============================================================================= -real(dp), dimension(:,:),intent(inout):: a -real(dp), dimension(:), intent(inout):: b -logical :: ff -call dlinmvtf(a,b,ff) -if(ff)stop 'In dlinmvt; matrix singular, unable to continue' -end subroutine dlinmvt -!============================================================================= -subroutine clinmvt(a,b)! [inv] -!============================================================================= -complex(dpc), dimension(:,:),intent(inout):: a -complex(dpc), dimension(:), intent(inout):: b -logical :: ff -call clinmvtf(a,b,ff) -if(ff)stop 'In clinmvt; matrix singular, unable to continue' -end subroutine clinmvt -!============================================================================= -subroutine slinmvtf(a,b,ff)! [inv] -!============================================================================= -real(sp),dimension(:,:),intent(inout):: a -real(sp),dimension(:), intent(inout):: b -logical, intent( out):: ff -integer,dimension(size(a,1)) :: ipiv -real(sp) :: d -!============================================================================= -if(size(a,1) /= size(a,2).or. size(a,1) /= size(b))& - stop 'In inv; In slinmvtf; incompatible array dimensions' -call sldumf(a,ipiv,d,ff) -if(ff)then - print '("In slinmvtf; failed call to sldumf")' - return -endif -call sudlmv(a,b,ipiv) -end subroutine slinmvtf -!============================================================================= -subroutine dlinmvtf(a,b,ff)! [inv] -!============================================================================= -real(dp),dimension(:,:),intent(inout):: a -real(dp),dimension(:), intent(inout):: b -logical, intent( out):: ff -integer, dimension(size(a,1)) :: ipiv -real(dp) :: d -!============================================================================= -if(size(a,1) /= size(a,2).or. size(a,1) /= size(b))& - stop 'In inv; incompatible array dimensions passed to dlinmvtf' -call dldumf(a,ipiv,d,ff) -if(ff)then - print '("In dlinmvtf; failed call to dldumf")' - return -endif -call dudlmv(a,b,ipiv) -end subroutine dlinmvtf -!============================================================================= -subroutine clinmvtf(a,b,ff)! [inv] -!============================================================================= -complex(dpc),dimension(:,:),intent(inout):: a -complex(dpc),dimension(:), intent(inout):: b -logical, intent( out):: ff -integer, dimension(size(a,1)) :: ipiv -complex(dpc) :: d -!============================================================================= -if(size(a,1) /= size(a,2).or. size(a,1) /= size(b))& - stop 'In inv; incompatible array dimensions passed to clinmvtf' -call cldumf(a,ipiv,d,ff) -if(ff)then - print '("In clinmvtf; failed call to cldumf")' - return -endif -call cudlmv(a,b,ipiv) -end subroutine clinmvtf - -!============================================================================= -subroutine iinvf(imat,ff)! [inv] -!============================================================================= -! Invert integer square array, imat, if possible, but flag ff=.true. -! if not possible. (Determinant of imat must be +1 or -1 -!============================================================================= -integer,dimension(:,:),intent(INOUT):: imat -logical, intent( OUT):: ff -!----------------------------------------------------------------------------- -real(dp),parameter :: eps=1.e-10_dp -real(dp),dimension(size(imat,1),size(imat,1)):: dmat -integer :: m,i,j -!============================================================================= -m=size(imat,1) -if(m /= size(imat,2))stop 'In inv; matrix passed to iinvf is not square' -dmat=imat; call inv(dmat,ff) -if(.not.ff)then - do j=1,m - do i=1,m - imat(i,j)=nint(dmat(i,j)); if(abs(dmat(i,j)-imat(i,j))>eps)ff=t - enddo - enddo -endif -end subroutine iinvf - -!============================================================================= -subroutine sldum(a,ipiv,d)! [ldum] -!============================================================================= -real(sp),intent(inout) :: a(:,:) -real(sp),intent(out ) :: d -integer, intent(out ) :: ipiv(:) -logical :: ff -call sldumf(a,ipiv,d,ff) -if(ff)stop 'In sldum; matrix singular, unable to continue' -end subroutine sldum -!============================================================================= -subroutine dldum(a,ipiv,d)! [ldum] -!============================================================================= -real(dp),intent(inout) :: a(:,:) -real(dp),intent(out ) :: d -integer, intent(out ) :: ipiv(:) -logical:: ff -call dldumf(a,ipiv,d,ff) -if(ff)stop 'In dldum; matrix singular, unable to continue' -end subroutine dldum -!============================================================================= -subroutine cldum(a,ipiv,d)! [ldum] -!============================================================================= -complex(dpc),intent(inout) :: a(:,:) -complex(dpc),intent(out ) :: d -integer, intent(out ) :: ipiv(:) -logical:: ff -call cldumf(a,ipiv,d,ff) -if(ff)stop 'In cldum; matrix singular, unable to continue' -end subroutine cldum -!============================================================================= -subroutine sldumf(a,ipiv,d,ff)! [ldum] -!============================================================================= -! R.J.Purser, NCEP, Washington D.C. 1996 -! SUBROUTINE LDUM -! perform l-d-u decomposition of square matrix a in place with -! pivoting. -! -! <-> a square matrix to be factorized -! <-- ipiv array encoding the pivoting sequence -! <-- d indicator for possible sign change of determinant -! <-- ff: failure flag, set to .true. when determinant of a vanishes. -!============================================================================= -real(SP),intent(INOUT) :: a(:,:) -real(SP),intent(OUT ) :: d -integer, intent(OUT ) :: ipiv(:) -logical, intent(OUT ) :: ff -integer :: m,i, j, jp, ibig, jm -real(SP) :: s(size(a,1)), aam, aa, abig, ajj, ajji, aij -!============================================================================= -ff=f -m=size(a,1) -do i=1,m - aam=0 - do j=1,m - aa=abs(a(i,j)) - if(aa > aam)aam=aa - enddo - if(aam == 0)then - print '("In sldumf; row ",i6," of matrix vanishes")',i - ff=t - return - endif - s(i)=1/aam -enddo -d=1. -ipiv(m)=m -do j=1,m-1 - jp=j+1 - abig=s(j)*abs(a(j,j)) - ibig=j - do i=jp,m - aa=s(i)*abs(a(i,j)) - if(aa > abig)then - ibig=i - abig=aa - endif - enddo -! swap rows, recording changed sign of determinant - ipiv(j)=ibig - if(ibig /= j)then - d=-d - call sswpvv(a(j,:),a(ibig,:)) - s(ibig)=s(j) - endif - ajj=a(j,j) - if(ajj == 0)then - jm=j-1 - print '(" failure in sldumf:"/" matrix singular, rank=",i3)',jm - ff=t - return - endif - ajji=1/ajj - do i=jp,m - aij=ajji*a(i,j) - a(i,j)=aij - a(i,jp:m) = a(i,jp:m) - aij*a(j,jp:m) - enddo -enddo -end subroutine sldumf -!============================================================================= -subroutine DLDUMf(A,IPIV,D,ff)! [ldum] -!============================================================================= -real(DP), intent(INOUT) :: a(:,:) -real(DP), intent(OUT ) :: d -integer, intent(OUT ) :: ipiv(:) -logical, intent(OUT ) :: ff -integer :: m,i, j, jp, ibig, jm -real(DP) :: s(size(a,1)), aam, aa, abig, ajj, ajji, aij -!============================================================================= -ff=f -m=size(a,1) -do i=1,m - aam=0 - do j=1,m - aa=abs(a(i,j)) - if(aa > aam)aam=aa - enddo - if(aam == 0)then - print '("In dldumf; row ",i6," of matrix vanishes")',i - ff=t - return - endif - s(i)=1/aam -enddo -d=1. -ipiv(m)=m -do j=1,m-1 - jp=j+1 - abig=s(j)*abs(a(j,j)) - ibig=j - do i=jp,m - aa=s(i)*abs(a(i,j)) - if(aa > abig)then - ibig=i - abig=aa - endif - enddo -! swap rows, recording changed sign of determinant - ipiv(j)=ibig - if(ibig /= j)then - d=-d - call dswpvv(a(j,:),a(ibig,:)) - s(ibig)=s(j) - endif - ajj=a(j,j) - if(ajj == 0)then - jm=j-1 - print '(" Failure in dldumf:"/" matrix singular, rank=",i3)',jm - ff=t - return - endif - ajji=1/ajj - do i=jp,m - aij=ajji*a(i,j) - a(i,j)=aij - a(i,jp:m) = a(i,jp:m) - aij*a(j,jp:m) - enddo -enddo -end subroutine DLDUMf -!============================================================================= -subroutine cldumf(a,ipiv,d,ff)! [ldum] -!============================================================================= -use pietc, only: c0 -complex(dpc), intent(INOUT) :: a(:,:) -complex(dpc), intent(OUT ) :: d -integer, intent(OUT ) :: ipiv(:) -logical, intent(OUT ) :: ff -integer :: m,i, j, jp, ibig, jm -complex(dpc) :: ajj, ajji, aij -real(dp) :: aam,aa,abig -real(dp),dimension(size(a,1)):: s -!============================================================================= -ff=f -m=size(a,1) -do i=1,m - aam=0 - do j=1,m - aa=abs(a(i,j)) - if(aa > aam)aam=aa - enddo - if(aam == 0)then - print '("In cldumf; row ",i6," of matrix vanishes")',i - ff=t - return - endif - s(i)=1/aam -enddo -d=1. -ipiv(m)=m -do j=1,m-1 - jp=j+1 - abig=s(j)*abs(a(j,j)) - ibig=j - do i=jp,m - aa=s(i)*abs(a(i,j)) - if(aa > abig)then - ibig=i - abig=aa - endif - enddo -! swap rows, recording changed sign of determinant - ipiv(j)=ibig - if(ibig /= j)then - d=-d - call cswpvv(a(j,:),a(ibig,:)) - s(ibig)=s(j) - endif - ajj=a(j,j) - if(ajj == c0)then - jm=j-1 - print '(" Failure in cldumf:"/" matrix singular, rank=",i3)',jm - ff=t - return - endif - ajji=1/ajj - do i=jp,m - aij=ajji*a(i,j) - a(i,j)=aij - a(i,jp:m) = a(i,jp:m) - aij*a(j,jp:m) - enddo -enddo -end subroutine cldumf - -!============================================================================= -subroutine sudlmm(a,b,ipiv)! [udlmm] -!============================================================================= -! R.J.Purser, National Meteorological Center, Washington D.C. 1993 -! SUBROUTINE UDLMM -! use l-u factors in A to back-substitute for several rhs in B, using ipiv to -! define the pivoting permutation used in the l-u decomposition. -! -! --> A L-D-U factorization of linear system matrux -! <-> B rt-hand-sides vectors on input, corresponding solutions on return -! --> IPIV array encoding the pivoting sequence -!============================================================================= -integer, dimension(:), intent(in) :: ipiv -real(sp),dimension(:,:),intent(in) :: a -real(sp),dimension(:,:),intent(inout) :: b -integer :: m,i, k, l -real(sp) :: s,aiii -!============================================================================= -m=size(a,1) -do k=1,size(b,2) !loop over columns of b - do i=1,m - l=ipiv(i) - s=b(l,k) - b(l,k)=b(i,k) - s = s - sum(b(1:i-1,k)*a(i,1:i-1)) - b(i,k)=s - enddo - b(m,k)=b(m,k)/a(m,m) - do i=m-1,1,-1 - aiii=1/a(i,i) - b(i,k) = b(i,k) - sum(b(i+1:m,k)*a(i,i+1:m)) - b(i,k)=b(i,k)*aiii - enddo -enddo -end subroutine sudlmm -!============================================================================= -subroutine dudlmm(a,b,ipiv)! [udlmm] -!============================================================================= -integer, dimension(:), intent(in ) :: ipiv -real(dp), dimension(:,:),intent(in ) :: a -real(dp), dimension(:,:),intent(inout) :: b -integer :: m,i, k, l -real(dp) :: s,aiii -!============================================================================= -m=size(a,1) -do k=1, size(b,2)!loop over columns of b - do i=1,m - l=ipiv(i) - s=b(l,k) - b(l,k)=b(i,k) - s = s - sum(b(1:i-1,k)*a(i,1:i-1)) - b(i,k)=s - enddo - b(m,k)=b(m,k)/a(m,m) - do i=m-1,1,-1 - aiii=1/a(i,i) - b(i,k) = b(i,k) - sum(b(i+1:m,k)*a(i,i+1:m)) - b(i,k)=b(i,k)*aiii - enddo -enddo -end subroutine dudlmm -!============================================================================= -subroutine cudlmm(a,b,ipiv)! [udlmm] -!============================================================================= -integer, dimension(:), intent(in ) :: ipiv -complex(dpc),dimension(:,:),intent(in ) :: a -complex(dpc),dimension(:,:),intent(inout) :: b -integer :: m,i, k, l -complex(dpc) :: s,aiii -!============================================================================= -m=size(a,1) -do k=1, size(b,2)!loop over columns of b - do i=1,m - l=ipiv(i) - s=b(l,k) - b(l,k)=b(i,k) - s = s - sum(b(1:i-1,k)*a(i,1:i-1)) - b(i,k)=s - enddo - b(m,k)=b(m,k)/a(m,m) - do i=m-1,1,-1 - aiii=1/a(i,i) - b(i,k) = b(i,k) - sum(b(i+1:m,k)*a(i,i+1:m)) - b(i,k)=b(i,k)*aiii - enddo -enddo -end subroutine cudlmm - -!============================================================================= -subroutine sudlmv(a,b,ipiv)! [udlmv] -!============================================================================= -! R.J.Purser, National Meteorological Center, Washington D.C. 1993 -! SUBROUTINE UDLMV -! use l-u factors in A to back-substitute for 1 rhs in B, using ipiv to -! define the pivoting permutation used in the l-u decomposition. -! -! --> A L-D-U factorization of linear system matrix -! <-> B right-hand-side vector on input, corresponding solution on return -! --> IPIV array encoding the pivoting sequence -!============================================================================= -integer, dimension(:), intent(in) :: ipiv -real(sp),dimension(:,:),intent(in) :: a -real(sp),dimension(:), intent(inout) :: b -integer :: m,i, l -real(sp) :: s,aiii -!============================================================================= -m=size(a,1) -do i=1,m - l=ipiv(i) - s=b(l) - b(l)=b(i) - s = s - sum(b(1:i-1)*a(i,1:i-1)) - b(i)=s -enddo -b(m)=b(m)/a(m,m) -do i=m-1,1,-1 - aiii=1/a(i,i) - b(i) = b(i) - sum(b(i+1:m)*a(i,i+1:m)) - b(i)=b(i)*aiii -enddo -end subroutine sudlmv -!============================================================================= -subroutine dudlmv(a,b,ipiv)! [udlmv] -!============================================================================= -integer, dimension(:), intent(in ) :: ipiv(:) -real(dp), dimension(:,:),intent(in ) :: a(:,:) -real(dp), dimension(:), intent(inout) :: b(:) -integer :: m,i, l -real(dp) :: s,aiii -!============================================================================= -m=size(a,1) -do i=1,m - l=ipiv(i) - s=b(l) - b(l)=b(i) - s = s - sum(b(1:i-1)*a(i,1:i-1)) - b(i)=s -enddo -b(m)=b(m)/a(m,m) -do i=m-1,1,-1 - aiii=1/a(i,i) - b(i) = b(i) - sum(b(i+1:m)*a(i,i+1:m)) - b(i)=b(i)*aiii -enddo -end subroutine dudlmv -!============================================================================= -subroutine cudlmv(a,b,ipiv)! [udlmv] -!============================================================================= -integer, dimension(:), intent(in ) :: ipiv(:) -complex(dpc),dimension(:,:),intent(in ) :: a(:,:) -complex(dpc),dimension(:), intent(inout) :: b(:) -integer :: m,i, l -complex(dpc) :: s,aiii -!============================================================================= -m=size(a,1) -do i=1,m - l=ipiv(i) - s=b(l) - b(l)=b(i) - s = s - sum(b(1:i-1)*a(i,1:i-1)) - b(i)=s -enddo -b(m)=b(m)/a(m,m) -do i=m-1,1,-1 - aiii=1/a(i,i) - b(i) = b(i) - sum(b(i+1:m)*a(i,i+1:m)) - b(i)=b(i)*aiii -enddo -end subroutine cudlmv - -!============================================================================= -subroutine sl1lm(a,b) ! [l1lm] -!============================================================================= -! Cholesky, M -> L*U, U(i,j)=L(j,i) -!============================================================================= -real(sp), intent(in ) :: a(:,:) -real(sp), intent(inout) :: b(:,:) -!----------------------------------------------------------------------------- -logical:: ff -call sl1lmf(a,b,ff) -if(ff)stop 'In sl1lm; matrix singular, unable to continue' -end subroutine sl1lm -!============================================================================= -subroutine dl1lm(a,b) ! [l1lm] -!============================================================================= -! Cholesky, M -> L*U, U(i,j)=L(j,i) -!============================================================================= -real(dp), intent(in ) :: a(:,:) -real(dp), intent(inout) :: b(:,:) -!----------------------------------------------------------------------------- -logical:: ff -call dl1lmf(a,b,ff) -if(ff)stop 'In dl1lm; matrix singular, unable to continue' -end subroutine dl1lm - -!============================================================================= -subroutine sl1lmf(a,b,ff)! [L1Lm] -!============================================================================= -! Cholesky, M -> L*U, U(i,j)=L(j,i) -!============================================================================= -real(sp), intent(IN ) :: a(:,:) -real(sp), intent(INOUT) :: b(:,:) -logical :: ff -!----------------------------------------------------------------------------- -integer :: m,j, jm, jp, i -real(sp) :: s, bjji -!============================================================================= -m=size(a,1) -ff=f -do j=1,m - jm=j-1 - jp=j+1 - s = a(j,j) - sum(b(j,1:jm)*b(j,1:jm)) - ff=(S <= 0) - if(ff)then - print '("sL1Lmf detects nonpositive a, rank=",i6)',jm - return - endif - b(j,j)=sqrt(s) - bjji=1/b(j,j) - do i=jp,m - s = a(i,j) - sum(b(i,1:jm)*b(j,1:jm)) - b(i,j)=s*bjji - enddo - b(1:jm,j) = 0 -enddo -end subroutine sl1lmf -!============================================================================= -subroutine dl1lmf(a,b,ff) ! [L1Lm] -!============================================================================= -real(dp), intent(IN ) :: a(:,:) -real(dp), intent(INOUT) :: b(:,:) -logical :: ff -!----------------------------------------------------------------------------- -integer :: m,j, jm, jp, i -real(dp) :: s, bjji -!============================================================================= -m=size(a,1) -ff=f -do j=1,m - jm=j-1 - jp=j+1 - s = a(j,j) - sum(b(j,1:jm)*b(j,1:jm)) - ff=(s <= 0) - if(ff)then - print '("dL1LMF detects nonpositive A, rank=",i6)',jm - return - endif - b(j,j)=sqrt(s) - bjji=1/b(j,j) - do i=jp,m - s = a(i,j) - sum(b(i,1:jm)*b(j,1:jm)) - b(i,j)=s*bjji - enddo - b(1:jm,j) = 0 -enddo -return -end subroutine dl1lmf - -!============================================================================= -subroutine sldlm(a,b,d)! [LdLm] -!============================================================================= -! Modified Cholesky decompose Q --> L*D*U, U(i,j)=L(j,i) -!============================================================================= -real(sp), intent(IN ):: a(:,:) -real(sp), intent(INOUT):: b(:,:) -real(sp), intent( OUT):: d(:) -!----------------------------------------------------------------------------- -logical:: ff -call sldlmf(a,b,d,ff) -if(ff)stop 'In sldlm; matrix singular, unable to continue' -end subroutine sldlm -!============================================================================= -subroutine dldlm(a,b,d)! [LdLm] -!============================================================================= -real(dp), intent(IN ):: a(:,:) -real(dp), intent(INOUT):: b(:,:) -real(dp), intent( OUT):: d(:) -!----------------------------------------------------------------------------- -logical:: ff -call dldlmf(a,b,d,ff) -if(ff)stop 'In dldlm; matrix singular, unable to continue' -end subroutine dldlm - -!============================================================================= -subroutine sldlmf(a,b,d,ff) ! [LDLM] -!============================================================================= -! Modified Cholesky decompose Q --> L*D*U -!============================================================================= -real(sp), intent(IN ):: a(:,:) -real(sp), intent(INOUT):: b(:,:) -real(sp), intent( OUT):: d(:) -logical, intent( OUT):: ff -!----------------------------------------------------------------------------- -integer :: m,j, jm, jp, i -real(sp) :: bjji -!============================================================================= -m=size(a,1) -ff=f -do j=1,m - jm=j-1 - jp=j+1 - d(j)=a(j,j) - sum(b(1:jm,j)*b(j,1:jm)) - b(j,j) = 1 - ff=(d(j) == 0) - if(ff)then - print '("In sldlmf; singularity of matrix detected")' - print '("Rank of matrix: ",i6)',jm - return - endif - bjji=1/d(j) - do i=jp,m - b(j,i)=a(i,j) - dot_product(b(1:jm,j),b(i,1:jm)) - b(i,j)=b(j,i)*bjji - enddo - b(1:jm,j)=0 -enddo -end subroutine sldlmf -!============================================================================= -subroutine dldlmf(a,b,d,ff) ! [LDLM] -!============================================================================= -! Modified Cholesky Q --> L*D*U, U(i,j)=L(j,i) -!============================================================================= -real(dp), intent(IN ) :: a(:,:) -real(dp), intent(INOUT) :: b(:,:) -real(dp), intent( OUT) :: d(:) -logical, intent( OUT) :: ff -!----------------------------------------------------------------------------- -integer :: m,j, jm, jp, i -real(dp) :: bjji -!============================================================================= -m=size(a,1) -ff=f -do j=1,m; jm=j-1; jp=j+1 - d(j)=a(j,j) - sum(b(1:jm,j)*b(j,1:jm)) - b(j,j) = 1 - ff=(d(j) == 0) - if(ff)then - print '("In dldlmf; singularity of matrix detected")' - print '("Rank of matrix: ",i6)',jm - return - endif - bjji=1/d(j) - do i=jp,m - b(j,i)=a(i,j) - dot_product(b(1:jm,j),b(i,1:jm)) - b(i,j)=b(j,i)*bjji - enddo - b(1:jm,j)=0 -enddo -end subroutine dldlmf - -!============================================================================== -subroutine sinvu(a)! [invu] -!============================================================================== -! Invert the upper triangular matrix in place by transposing, calling -! invl, and transposing again. -!============================================================================== -real,dimension(:,:),intent(inout):: a -a=transpose(a); call sinvl(a); a=transpose(a) -end subroutine sinvu -!============================================================================== -subroutine dinvu(a)! [invu] -!============================================================================== -real(dp),dimension(:,:),intent(inout):: a -a=transpose(a); call dinvl(a); a=transpose(a) -end subroutine dinvu -!============================================================================== -subroutine sinvl(a)! [invl] -!============================================================================== -! Invert lower triangular matrix in place -!============================================================================== -real(sp), intent(inout) :: a(:,:) -integer :: m,j, i -m=size(a,1) -do j=m,1,-1 - a(1:j-1,j) = 0.0 - a(j,j)=1./a(j,j) - do i=j+1,m - a(i,j)=-a(i,i)*sum(a(j:i-1,j)*a(i,j:i-1)) - enddo -enddo -end subroutine sinvl -!============================================================================== -subroutine dinvl(a)! [invl] -!============================================================================== -real(dp), intent(inout) :: a(:,:) -integer :: m,j, i -m=size(a,1) -do j=m,1,-1 - a(1:j-1,j) = 0.0 - a(j,j)=1./a(j,j) - do i=j+1,m - a(i,j)=-a(i,i)*sum(a(j:i-1,j)*a(i,j:i-1)) - enddo -enddo -end subroutine dinvl - -!============================================================================== -subroutine slinlv(a,u)! [invl] -!============================================================================== -! Solve linear system involving lower triangular system matrix. -!============================================================================== -real, intent(in ) :: a(:,:) -real, intent(inout) :: u(:) -integer :: i -if(size(a,1) /= size(a,2) .or. size(a,1) /= size(u))& - stop 'In slinlv; incompatible array dimensions' -do i=1,size(u); u(i)=(u(i) - sum(u(:i-1)*a(i,:i-1)))/a(i,i); enddo -end subroutine slinlv -!============================================================================== -subroutine dlinlv(a,u)! [invl] -!============================================================================== -real(dp), intent(in ) :: a(:,:) -real(dp), intent(inout) :: u(:) -integer :: i -if(size(a,1) /= size(a,2) .or. size(a,1) /= size(u))& - stop 'In dlinlv; incompatible array dimensions' -do i=1,size(u); u(i)=(u(i) - sum(u(:i-1)*a(i,:i-1)))/a(i,i); enddo -end subroutine dlinlv - -!============================================================================== -subroutine slinuv(a,u)! [invu] -!============================================================================== -! Solve linear system involving upper triangular system matrix. -!============================================================================== -real, intent(in ) :: a(:,:) -real, intent(inout) :: u(:) -integer :: i -if(size(a,1) /= size(a,2) .or. size(a,1) /= size(u))& - stop 'In linuv; incompatible array dimensions' -do i=size(u),1,-1; u(i)=(u(i) - sum(a(i+1:,i)*u(i+1:)))/a(i,i); enddo -end subroutine slinuv -!============================================================================== -subroutine dlinuv(a,u)! [invu] -!============================================================================== -real(dp), intent(in ) :: a(:,:) -real(dp), intent(inout) :: u(:) -integer :: i -if(size(a,1) /= size(a,2) .or. size(a,1) /= size(u))& - stop 'In dlinuv; incompatible array dimensions' -do i=size(u),1,-1; u(i)=(u(i) - sum(a(i+1:,i)*u(i+1:)))/a(i,i); enddo -end subroutine dlinuv - -end module pmat - diff --git a/sorc/regional_grid.fd/pmat4.f90 b/sorc/regional_grid.fd/pmat4.f90 deleted file mode 100644 index 8cb2fcb70..000000000 --- a/sorc/regional_grid.fd/pmat4.f90 +++ /dev/null @@ -1,1924 +0,0 @@ -! -! ********************************************** -! * MODULE pmat4 * -! * R. J. Purser, NOAA/NCEP/EMC Oct 2005 * -! * 18th May 2012 * -! * jim.purser@noaa.gov * -! * * -! ********************************************** -! -! Euclidean geometry, geometric (stereographic) projections, -! related transformations (Mobius). -! Package for handy vector and matrix operations in Euclidean geometry. -! This package is primarily intended for 3D operations and three of the -! functions (Cross_product, Triple_product and Axial) do not possess simple -! generalizations to a generic number N of dimensions. The others, while -! admitting such N-dimensional generalizations, have not all been provided -! with such generic forms here at the time of writing, though some of these -! may be added at a future date. -! -! May 2017: Added routines to facilitate manipulation of 3D rotations, -! their representations by axial vectors, and routines to compute the -! exponentials of matrices (without resort to eigen methods). Also added -! Quaternion and spinor representations of 3D rotations, and their -! conversion routines. -! -! FUNCTION: -! absv: Absolute magnitude of vector as its euclidean length -! Normalized: Normalized version of given real vector -! Orthogonalized: Orthogonalized version of second vector rel. to first unit v. -! Cross_product: Vector cross-product of the given 2 vectors -! Outer_product: outer-product matrix of the given 2 vectors -! Triple_product: Scalar triple product of given 3 vectors -! Det: Determinant of given matrix -! Axial: Convert axial-vector <--> 2-form (antisymmetric matrix) -! Diag: Diagnl of given matrix, or diagonal matrix of given elements -! Trace: Trace of given matrix -! Identity: Identity 3*3 matrix, or identity n*n matrix for a given n -! Sarea: Spherical area subtended by three vectors, or by lat-lon -! increments forming a triangle or quadrilateral -! Huarea: Spherical area subtended by right-angled spherical triangle -! SUBROUTINE: -! Gram: Right-handed orthogonal basis and rank, nrank. The first -! nrank basis vectors span the column range of matrix given, -! OR ("plain" version) simple unpivoted Gram-Schmidt of a -! square matrix. -! -! In addition, we include routines that relate to stereographic projections -! and some associated mobius transformation utilities, since these complex -! operations have a strong geometrical flavor. -! -! DIRECT DEPENDENCIES -! Libraries[their Modules]: pmat[pmat] -! Additional Modules : pkind, pietc -! -!============================================================================ -module pmat4 -!============================================================================ -use pkind, only: sp,dp,dpc -implicit none -private -public:: absv,normalized,orthogonalized, & - cross_product,outer_product,triple_product,det,axial, & - diag,trace,identity,sarea,huarea,dlltoxy, & - normalize,gram,rowops,corral, & - axtoq,qtoax, & - rottoax,axtorot,spintoq,qtospin,rottoq,qtorot,mulqq, & - expmat,zntay,znfun, & - ctoz,ztoc,setmobius, & - mobius,mobiusi - -interface absv; module procedure absv_s,absv_d; end interface -interface normalized;module procedure normalized_s,normalized_d;end interface -interface orthogonalized - module procedure orthogonalized_s,orthogonalized_d; end interface -interface cross_product - module procedure cross_product_s,cross_product_d; end interface -interface outer_product - module procedure outer_product_s,outer_product_d,outer_product_i - end interface -interface triple_product - module procedure triple_product_s,triple_product_d; end interface -interface det; module procedure det_s,det_d,det_i,det_id; end interface -interface axial - module procedure axial3_s,axial3_d,axial33_s,axial33_d; end interface -interface diag - module procedure diagn_s,diagn_d,diagn_i,diagnn_s,diagnn_d,diagnn_i - end interface -interface trace; module procedure trace_s,trace_d,trace_i; end interface -interface identity; module procedure identity_i,identity3_i; end interface -interface huarea; module procedure huarea_s,huarea_d; end interface -interface sarea - module procedure sarea_s,sarea_d,dtarea_s,dtarea_d,dqarea_s,dqarea_d - end interface -interface dlltoxy; module procedure dlltoxy_s,dlltoxy_d; end interface -interface hav; module procedure hav_s, hav_d; end interface -interface normalize;module procedure normalize_s,normalize_d; end interface -interface gram - module procedure gram_s,gram_d,graml_d,plaingram_s,plaingram_d,rowgram - end interface -interface rowops; module procedure rowops; end interface -interface corral; module procedure corral; end interface -interface rottoax; module procedure rottoax; end interface -interface axtorot; module procedure axtorot; end interface -interface spintoq; module procedure spintoq; end interface -interface qtospin; module procedure qtospin; end interface -interface rottoq; module procedure rottoq; end interface -interface qtorot; module procedure qtorot; end interface -interface axtoq; module procedure axtoq; end interface -interface qtoax; module procedure qtoax; end interface -interface setem; module procedure setem; end interface -interface mulqq; module procedure mulqq; end interface -interface expmat; module procedure expmat,expmatd,expmatdd; end interface -interface zntay; module procedure zntay; end interface -interface znfun; module procedure znfun; end interface -interface ctoz; module procedure ctoz; end interface -interface ztoc; module procedure ztoc,ztocd; end interface -interface setmobius;module procedure setmobius,zsetmobius; end interface -interface mobius; module procedure zmobius,cmobius; end interface -interface mobiusi; module procedure zmobiusi; end interface - -contains - -!============================================================================= -function absv_s(a)result(s)! [absv] -!============================================================================= -real(sp),dimension(:),intent(in):: a -real(sp) :: s -s=sqrt(dot_product(a,a)) -end function absv_s -!============================================================================= -function absv_d(a)result(s)! [absv] -!============================================================================= -real(dp),dimension(:),intent(in):: a -real(dp) :: s -s=sqrt(dot_product(a,a)) -end function absv_d - -!============================================================================= -function normalized_s(a)result(b)! [normalized] -!============================================================================= -real(sp),dimension(:),intent(IN):: a -real(sp),dimension(size(a)) :: b -real(sp) :: s -s=absv_s(a); if(s==0)then; b=0;else;b=a/s;endif -end function normalized_s -!============================================================================= -function normalized_d(a)result(b)! [normalized] -!============================================================================= -real(dp),dimension(:),intent(IN):: a -real(dp),dimension(size(a)) :: b -real(dp) :: s -s=absv_d(a); if(s==0)then; b=0;else;b=a/s;endif -end function normalized_d - -!============================================================================= -function orthogonalized_s(u,a)result(b)! [orthogonalized] -!============================================================================= -real(sp),dimension(:),intent(in):: u,a -real(sp),dimension(size(u)) :: b -real(sp) :: s -! Note: this routine assumes u is already normalized -s=dot_product(u,a); b=a-u*s -end function orthogonalized_s -!============================================================================= -function orthogonalized_d(u,a)result(b)! [orthogonalized] -!============================================================================= -real(dp),dimension(:),intent(in):: u,a -real(dp),dimension(size(u)) :: b -real(dp) :: s -! Note: this routine assumes u is already normalized -s=dot_product(u,a); b=a-u*s -end function orthogonalized_d - -!============================================================================= -function cross_product_s(a,b)result(c)! [cross_product] -!============================================================================= -real(sp),dimension(3),intent(in):: a,b -real(sp),dimension(3) :: c -c(1)=a(2)*b(3)-a(3)*b(2); c(2)=a(3)*b(1)-a(1)*b(3); c(3)=a(1)*b(2)-a(2)*b(1) -end function cross_product_s -!============================================================================= -function cross_product_d(a,b)result(c)! [cross_product] -!============================================================================= -real(dp),dimension(3),intent(in):: a,b -real(dp),dimension(3) :: c -c(1)=a(2)*b(3)-a(3)*b(2); c(2)=a(3)*b(1)-a(1)*b(3); c(3)=a(1)*b(2)-a(2)*b(1) -end function cross_product_d - -!============================================================================= -function outer_product_s(a,b)result(c)! [outer_product] -!============================================================================= -real(sp),dimension(:), intent(in ):: a -real(sp),dimension(:), intent(in ):: b -real(sp),DIMENSION(size(a),size(b)):: c -integer :: nb,i -nb=size(b) -do i=1,nb; c(:,i)=a*b(i); enddo -end function outer_product_s -!============================================================================= -function outer_product_d(a,b)result(c)! [outer_product] -!============================================================================= -real(dp),dimension(:), intent(in ):: a -real(dp),dimension(:), intent(in ):: b -real(dp),dimension(size(a),size(b)):: c -integer :: nb,i -nb=size(b) -do i=1,nb; c(:,i)=a*b(i); enddo -end function outer_product_d -!============================================================================= -function outer_product_i(a,b)result(c)! [outer_product] -!============================================================================= -integer,dimension(:), intent(in ):: a -integer,dimension(:), intent(in ):: b -integer,dimension(size(a),size(b)):: c -integer :: nb,i -nb=size(b) -do i=1,nb; c(:,i)=a*b(i); enddo -end function outer_product_i - -!============================================================================= -function triple_product_s(a,b,c)result(tripleproduct)! [triple_product] -!============================================================================= -real(sp),dimension(3),intent(IN ):: a,b,c -real(sp) :: tripleproduct -tripleproduct=dot_product( cross_product(a,b),c ) -end function triple_product_s -!============================================================================= -function triple_product_d(a,b,c)result(tripleproduct)! [triple_product] -!============================================================================= -real(dp),dimension(3),intent(IN ):: a,b,c -real(dp) :: tripleproduct -tripleproduct=dot_product( cross_product(a,b),c ) -end function triple_product_d - -!============================================================================= -function det_s(a)result(det)! [det] -!============================================================================= -real(sp),dimension(:,:),intent(IN ) ::a -real(sp) :: det -real(sp),dimension(size(a,1),size(a,1)):: b -integer :: n,nrank -n=size(a,1) -if(n==3)then - det=triple_product(a(:,1),a(:,2),a(:,3)) -else - call gram(a,b,nrank,det) - if(nranknrank)exit - ab(k:m,k:n)=matmul( transpose(a(:,k:m)),b(:,k:n) ) - ii =maxloc( abs( ab(k:m,k:n)) )+k-1 - val=maxval( abs( ab(k:m,k:n)) ) - if(val<=vcrit)then - nrank=k-1 - exit - endif - i=ii(1) - j=ii(2) - tv=b(:,j) - b(:,j)=-b(:,k) - b(:,k)=tv - tv=a(:,i) - a(:,i)=-a(:,k) - a(:,k)=tv - w(k:n)=matmul( transpose(b(:,k:n)),tv ) - b(:,k)=matmul(b(:,k:n),w(k:n) ) - s=dot_product(b(:,k),b(:,k)) - s=sqrt(s) - if(w(k)<0)s=-s - det=det*s - b(:,k)=b(:,k)/s - do l=k,n - do j=l+1,n - s=dot_product(b(:,l),b(:,j)) - b(:,j)=normalized( b(:,j)-b(:,l)*s ) - enddo - enddo -enddo -end subroutine gram_s - -!============================================================================= -subroutine gram_d(as,b,nrank,det)! [gram] -!============================================================================= -real(dp),dimension(:,:),intent(IN ) :: as -real(dp),dimension(:,:),intent(OUT) :: b -integer, intent(OUT) :: nrank -real(dp), intent(OUT) :: det -!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -real(dp),parameter :: crit=1.e-9_dp -real(dp),dimension(size(as,1),size(as,2)):: a -real(dp),dimension(size(as,2),size(as,1)):: ab -real(dp),dimension(size(as,1)) :: tv,w -real(dp) :: val,s,vcrit -integer :: i,j,k,l,m,n -integer,dimension(2) :: ii -!============================================================================= -n=size(as,1) -m=size(as,2) -if(n/=size(b,1) .or. n/=size(b,2))stop 'In gram; incompatible dimensions' -a=as -b=identity(n) -det=1 -val=maxval(abs(a)) -if(val==0)then - nrank=0 - return -endif -vcrit=val*crit -nrank=min(n,m) -do k=1,n - if(k>nrank)exit - ab(k:m,k:n)=matmul( transpose(a(:,k:m)),b(:,k:n) ) - ii =maxloc( abs( ab(k:m,k:n)) )+k-1 - val=maxval( abs( ab(k:m,k:n)) ) - if(val<=vcrit)then - nrank=k-1 - exit - endif - i=ii(1) - j=ii(2) - tv=b(:,j) - b(:,j)=-b(:,k) - b(:,k)=tv - tv=a(:,i) - a(:,i)=-a(:,k) - a(:,k)=tv - w(k:n)=matmul( transpose(b(:,k:n)),tv ) - b(:,k)=matmul(b(:,k:n),w(k:n) ) - s=dot_product(b(:,k),b(:,k)) - s=sqrt(s) - if(w(k)<0)s=-s - det=det*s - b(:,k)=b(:,k)/s - do l=k,n - do j=l+1,n - s=dot_product(b(:,l),b(:,j)) - b(:,j)=normalized( b(:,j)-b(:,l)*s ) - enddo - enddo -enddo -end subroutine gram_d - -!============================================================================= -subroutine graml_d(as,b,nrank,detsign,ldet)! [gram] -!============================================================================= -! A version of gram_d where the determinant information is returned in -! logarithmic form (to avoid overflows for large matrices). When the -! matrix is singular, the "sign" of the determinant, detsign, is returned -! as zero (instead of either +1 or -1) and ldet is then just the log of -! the nonzero factors found by the process. -!============================================================================= -real(dp),dimension(:,:),intent(IN ) :: as -real(dp),dimension(:,:),intent(OUT) :: b -integer, intent(OUT) :: nrank -integer, intent(out) :: detsign -real(dp), intent(OUT) :: ldet -!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -real(dp),parameter :: crit=1.e-9_dp -real(dp),dimension(size(as,1),size(as,2)):: a -real(dp),dimension(size(as,2),size(as,1)):: ab -real(dp),dimension(size(as,1)) :: tv,w -real(dp) :: val,s,vcrit -integer :: i,j,k,l,m,n -integer,dimension(2) :: ii -!============================================================================= -detsign=1 -n=size(as,1) -m=size(as,2) -if(n/=size(b,1) .or. n/=size(b,2))stop 'In gram; incompatible dimensions' -a=as -b=identity(n) -!det=1 -ldet=0 -val=maxval(abs(a)) -if(val==0)then - nrank=0 - return -endif -vcrit=val*crit -nrank=min(n,m) -do k=1,n - if(k>nrank)exit - ab(k:m,k:n)=matmul( transpose(a(:,k:m)),b(:,k:n) ) - ii =maxloc( abs( ab(k:m,k:n)) )+k-1 - val=maxval( abs( ab(k:m,k:n)) ) - if(val<=vcrit)then - nrank=k-1 - exit - endif - i=ii(1) - j=ii(2) - tv=b(:,j) - b(:,j)=-b(:,k) - b(:,k)=tv - tv=a(:,i) - a(:,i)=-a(:,k) - a(:,k)=tv - w(k:n)=matmul( transpose(b(:,k:n)),tv ) - b(:,k)=matmul(b(:,k:n),w(k:n) ) - s=dot_product(b(:,k),b(:,k)) - s=sqrt(s) - if(w(k)<0)s=-s - if(s<0)then - ldet=ldet+log(-s) - detsign=-detsign - elseif(s>0)then - ldet=ldet+log(s) - else - detsign=0 - endif - -! det=det*s - b(:,k)=b(:,k)/s - do l=k,n - do j=l+1,n - s=dot_product(b(:,l),b(:,j)) - b(:,j)=normalized( b(:,j)-b(:,l)*s ) - enddo - enddo -enddo -end subroutine graml_d - -!============================================================================= -subroutine plaingram_s(b,nrank)! [gram] -!============================================================================= -! A "plain" (unpivoted) version of Gram-Schmidt, for square matrices only. -real(sp),dimension(:,:),intent(INOUT) :: b -integer, intent( OUT) :: nrank -!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -real(sp),parameter :: crit=1.e-5_sp -real(sp) :: val,vcrit -integer :: j,k,n -!============================================================================= -n=size(b,1); if(n/=size(b,2))stop 'In gram; matrix needs to be square' -val=maxval(abs(b)) -nrank=0 -if(val==0)then - b=0 - return -endif -vcrit=val*crit -do k=1,n - val=sqrt(dot_product(b(:,k),b(:,k))) - if(val<=vcrit)then - b(:,k:n)=0 - return - endif - b(:,k)=b(:,k)/val - nrank=k - do j=k+1,n - b(:,j)=b(:,j)-b(:,k)*dot_product(b(:,k),b(:,j)) - enddo -enddo -end subroutine plaingram_s - -!============================================================================= -subroutine plaingram_d(b,nrank)! [gram] -!============================================================================= -! A "plain" (unpivoted) version of Gram-Schmidt, for square matrices only. -real(dp),dimension(:,:),intent(INOUT) :: b -integer, intent( OUT) :: nrank -!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -real(dp),parameter :: crit=1.e-9_dp -real(dp) :: val,vcrit -integer :: j,k,n -!============================================================================= -n=size(b,1); if(n/=size(b,2))stop 'In gram; matrix needs to be square' -val=maxval(abs(b)) -nrank=0 -if(val==0)then - b=0 - return -endif -vcrit=val*crit -do k=1,n - val=sqrt(dot_product(b(:,k),b(:,k))) - if(val<=vcrit)then - b(:,k:n)=0 - return - endif - b(:,k)=b(:,k)/val - nrank=k - do j=k+1,n - b(:,j)=b(:,j)-b(:,k)*dot_product(b(:,k),b(:,j)) - enddo -enddo -end subroutine plaingram_d - -!============================================================================= -subroutine rowgram(m,n,a,ipiv,tt,b,rank)! [gram] -!============================================================================= -! Without changing (tall) rectangular input matrix a, perform pivoted gram- -! schmidt operations to orthogonalize the rows, until rows that remain become -! negligible. Record the pivoting sequence in ipiv, and the row-normalization -! in tt(j,j) and the row-orthogonalization in tt(i,j), for i>j. Note that -! tt(i,j)=0 for i=n please' -nepss=n*epss -rank=n -aa=a -tt=0 -do ii=1,n - -! At this stage, all rows less than ii are already orthonormalized and are -! orthogonal to all rows at and beyond ii. Find the norms of these lower -! rows and pivot the largest of them into position ii: - maxp=0 - maxi=ii - do i=ii,m - p(i)=dot_product(aa(i,:),aa(i,:)) - if(p(i)>maxp)then - maxp=p(i) - maxi=i - endif - enddo - if(maxpu1(2))then - j=3 -else - j=2 -endif -ss=u1(j) -if(ss==0)stop 'In rotov; invalid rot' -if(j/=2)t1(2,:)=t1(3,:) -t1(2,:)=t1(2,:)/sqrt(ss) - -! Form t1(3,:) as the cross product of t1(1,:) and t1(2,:) -t1(3,1)=t1(1,2)*t1(2,3)-t1(1,3)*t1(2,2) -t1(3,2)=t1(1,3)*t1(2,1)-t1(1,1)*t1(2,3) -t1(3,3)=t1(1,1)*t1(2,2)-t1(1,2)*t1(2,1) - -! Project rot into the frame whose axes are the rows of t1: -t2=matmul(t1,matmul(rot,transpose(t1))) - -! Obtain the rotation angle, gamma, implied by rot, and gammah=gamma/2: -gamma=atan2(t2(2,1),t2(1,1)); gammah=gamma/2 - -! Hence deduce coefficients (in the form of a real 4-vector) of one of the two -! possible equivalent spinors: -s=sin(gammah) -q(0)=cos(gammah) -q(1:3)=t1(3,:)*s -end subroutine rottoq - -!============================================================================== -subroutine qtorot(q,rot)! [qtorot] -!============================================================================== -! Go from quaternion to rotation matrix representations -!============================================================================== -real(dp),dimension(0:3),intent(IN ):: q -real(dp),dimension(3,3),intent(OUT):: rot -!============================================================================= -call setem(q(0),q(1),q(2),q(3),rot) -end subroutine qtorot - -!============================================================================= -subroutine axtoq(v,q)! [axtoq] -!============================================================================= -! Go from an axial 3-vector to its equivalent quaternion -!============================================================================= -real(dp),dimension(3), intent(in ):: v -real(dp),dimension(0:3),intent(out):: q -!----------------------------------------------------------------------------- -real(dp),dimension(3,3):: rot -!============================================================================= -call axtorot(v,rot) -call rottoq(rot,q) -end subroutine axtoq - -!============================================================================= -subroutine qtoax(q,v)! [qtoax] -!============================================================================= -! Go from quaternion to axial 3-vector -!============================================================================= -real(dp),dimension(0:3),intent(in ):: q -real(dp),dimension(3), intent(out):: v -!----------------------------------------------------------------------------- -real(dp),dimension(3,3):: rot -!============================================================================= -call qtorot(q,rot) -call rottoax(rot,v) -end subroutine qtoax - -!============================================================================= -subroutine setem(c,d,e,g,r)! [setem] -!============================================================================= -real(dp), intent(IN ):: c,d,e,g -real(dp),dimension(3,3),intent(OUT):: r -!----------------------------------------------------------------------------- -real(dp):: cc,dd,ee,gg,de,dg,eg,dc,ec,gc -!============================================================================= -cc=c*c; dd=d*d; ee=e*e; gg=g*g -de=d*e; dg=d*g; eg=e*g -dc=d*c; ec=e*c; gc=g*c -r(1,1)=cc+dd-ee-gg; r(2,2)=cc-dd+ee-gg; r(3,3)=cc-dd-ee+gg -r(2,3)=2*(eg-dc); r(3,1)=2*(dg-ec); r(1,2)=2*(de-gc) -r(3,2)=2*(eg+dc); r(1,3)=2*(dg+ec); r(2,1)=2*(de+gc) -end subroutine setem - -!============================================================================= -function mulqq(a,b)result(c)! [mulqq] -!============================================================================= -! Multiply quaternions, a*b, assuming operation performed from right to left -!============================================================================= -real(dp),dimension(0:3),intent(IN ):: a,b -real(dp),dimension(0:3) :: c -!------------------------------------------- -c(0)=a(0)*b(0) -a(1)*b(1) -a(2)*b(2) -a(3)*b(3) -c(1)=a(0)*b(1) +a(1)*b(0) +a(2)*b(3) -a(3)*b(2) -c(2)=a(0)*b(2) +a(2)*b(0) +a(3)*b(1) -a(1)*b(3) -c(3)=a(0)*b(3) +a(3)*b(0) +a(1)*b(2) -a(2)*b(1) -end function mulqq -!============================================================================= -subroutine expmat(n,a,b,detb)! [expmat] -!============================================================================= -! Evaluate the exponential, b, of a matrix, a, of degree n. -! Apply the iterated squaring method, m times, to the approximation to -! exp(a/(2**m)) obtained as a Taylor expansion of degree L -! See Fung, T. C., 2004, Int. J. Numer. Meth. Engng, 59, 1273--1286. -!============================================================================= -use pietc, only: u1,u2,o2 -integer, intent(IN ):: n -real(dp),dimension(n,n),intent(IN ):: a -real(dp),dimension(n,n),intent(OUT):: b -real(dp), intent(OUT):: detb -!----------------------------------------------------------------------------- -integer,parameter :: L=5 -real(dp),dimension(n,n):: c,p -real(dp) :: t -integer :: i,m -!============================================================================= -m=10+log(u1+maxval(abs(a)))/log(u2) -t=o2**m -c=a*t -p=c -b=p -do i=2,L - p=matmul(p,c)/i - b=b+p -enddo -do i=1,m - b=b*2+matmul(b,b) -enddo -do i=1,n - b(i,i)=b(i,i)+1 -enddo -detb=0; do i=1,n; detb=detb+a(i,i); enddo; detb=exp(detb) -end subroutine expmat - -!============================================================================= -subroutine expmatd(n,a,b,bd,detb,detbd)! [expmat] -!============================================================================= -! Like expmat, but for the 1st derivatives also. -!============================================================================= -use pietc, only: u1,u2,o2 -integer, intent(IN ):: n -real(dp),dimension(n,n), intent(IN ):: a -real(dp),dimension(n,n), intent(OUT):: b -real(dp),dimension(n,n,(n*(n+1))/2),intent(OUT):: bd -real(dp), intent(OUT):: detb -real(dp),dimension((n*(n+1))/2), intent(OUT):: detbd -!----------------------------------------------------------------------------- -integer,parameter :: L=5 -real(dp),dimension(n,n) :: c,p -real(dp),dimension(n,n,(n*(n+1))/2):: pd,cd -real(dp) :: t -integer :: i,j,k,m,n1 -!============================================================================= -n1=(n*(n+1))/2 -m=10+log(u1+maxval(abs(a)))/log(u2) -t=o2**m -c=a*t -p=c -pd=0 -do k=1,n - pd(k,k,k)=t -enddo -k=n -do i=1,n-1 - do j=i+1,n - k=k+1 - pd(i,j,k)=t - pd(j,i,k)=t - enddo -enddo -if(k/=n1)stop 'In expmatd; n1 is inconsistent with n' -cd=pd -b=p -bd=pd - -do i=2,L - do k=1,n1 - pd(:,:,k)=(matmul(cd(:,:,k),p)+matmul(c,pd(:,:,k)))/i - enddo - p=matmul(c,p)/i - b=b+p - bd=bd+pd -enddo -do i=1,m - do k=1,n1 - bd(:,:,k)=2*bd(:,:,k)+matmul(bd(:,:,k),b)+matmul(b,bd(:,:,k)) - enddo - b=b*2+matmul(b,b) -enddo -do i=1,n - b(i,i)=b(i,i)+1 -enddo -detb=0; do i=1,n; detb=detb+a(i,i); enddo; detb=exp(detb) -detbd=0; do k=1,n; detbd(k)=detb; enddo -end subroutine expmatd - -!============================================================================= -subroutine expmatdd(n,a,b,bd,bdd,detb,detbd,detbdd)! [expmat] -!============================================================================= -! Like expmat, but for the 1st and 2nd derivatives also. -!============================================================================= -use pietc, only: u1,u2,o2 -integer, intent(IN ):: n -real(dp),dimension(n,n), intent(IN ):: a -real(dp),dimension(n,n), intent(OUT):: b -real(dp),dimension(n,n,(n*(n+1))/2), intent(OUT):: bd -real(dp),dimension(n,n,(n*(n+1))/2,(n*(n+1))/2),intent(OUT):: bdd -real(dp), intent(OUT):: detb -real(dp),dimension((n*(n+1))/2), intent(OUT):: detbd -real(dp),dimension((n*(n+1))/2,(n*(n+1))/2), intent(OUT):: detbdd -!----------------------------------------------------------------------------- -integer,parameter :: L=5 -real(dp),dimension(n,n) :: c,p -real(dp),dimension(n,n,(n*(n+1))/2) :: pd,cd -real(dp),dimension(n,n,(n*(n+1))/2,(n*(n+1))/2):: pdd,cdd -real(dp) :: t -integer :: i,j,k,ki,kj,m,n1 -!============================================================================= -n1=(n*(n+1))/2 -m=10+log(u1+maxval(abs(a)))/log(u2) -t=o2**m -c=a*t -p=c -pd=0 -pdd=0 -do k=1,n - pd(k,k,k)=t -enddo -k=n -do i=1,n-1 - do j=i+1,n - k=k+1 - pd(i,j,k)=t - pd(j,i,k)=t - enddo -enddo -if(k/=n1)stop 'In expmatd; n1 is inconsistent with n' -cd=pd -cdd=0 -b=p -bd=pd -bdd=0 - -do i=2,L - do ki=1,n1 - do kj=1,n1 - pdd(:,:,ki,kj)=(matmul(cd(:,:,ki),pd(:,:,kj)) & - + matmul(cd(:,:,kj),pd(:,:,ki)) & - + matmul(c,pdd(:,:,ki,kj)))/i - enddo - enddo - do k=1,n1 - pd(:,:,k)=(matmul(cd(:,:,k),p)+matmul(c,pd(:,:,k)))/i - enddo - p=matmul(c,p)/i - b=b+p - bd=bd+pd - bdd=bdd+pdd -enddo -do i=1,m - do ki=1,n1 - do kj=1,n1 - bdd(:,:,ki,kj)=2*bdd(:,:,ki,kj) & - +matmul(bdd(:,:,ki,kj),b) & - +matmul(bd(:,:,ki),bd(:,:,kj)) & - +matmul(bd(:,:,kj),bd(:,:,ki)) & - +matmul(b,bdd(:,:,ki,kj)) - enddo - enddo - do k=1,n1 - bd(:,:,k)=2*bd(:,:,k)+matmul(bd(:,:,k),b)+matmul(b,bd(:,:,k)) - enddo - b=b*2+matmul(b,b) -enddo -do i=1,n - b(i,i)=b(i,i)+1 -enddo -detb=0; do i=1,n; detb=detb+a(i,i); enddo; detb=exp(detb) -detbd=0; do k=1,n; detbd(k)=detb; enddo -detbdd=0; do ki=1,n; do kj=1,n; detbdd(ki,kj)=detb; enddo; enddo -end subroutine expmatdd - -!============================================================================= -subroutine zntay(n,z,zn)! [zntay] -!============================================================================= -integer, intent(IN ):: n -real(dp),intent(IN ):: z -real(dp),intent(OUT):: zn -!----------------------------------------------------------------------------- -integer,parameter :: ni=100 -real(dp),parameter :: eps0=1.e-16 -integer :: i,i2,n2 -real(dp) :: t,eps,z2 -!============================================================================= -z2=z*2 -n2=n*2 -t=1 -do i=1,n - t=t/(i*2-1) -enddo -eps=t*eps0 -zn=t -t=t -do i=1,ni - i2=i*2 - t=t*z2/(i2*(i2+n2-1)) - zn=zn+t - if(abs(t)0)then - zn=cosh(rz2) - znd=sinh(rz2)/rz2 - zndd=(zn-znd)/z2 - znddd=(znd-3*zndd)/z2 - do i=1,n - i2p3=i*2+3 - zn=znd - znd=zndd - zndd=znddd - znddd=(znd-i2p3*zndd)/z2 - enddo - else - zn=cos(rz2) - znd=sin(rz2)/rz2 - zndd=-(zn-znd)/z2 - znddd=-(znd-3*zndd)/z2 - do i=1,n - i2p3=i*2+3 - zn=znd - znd=zndd - zndd=znddd - znddd=-(znd-i2p3*zndd)/z2 - enddo - endif -endif -end subroutine znfun - -!============================================================================= -! Utility code for various Mobius transformations. If aa1,bb1,cc1,dd1 are -! the coefficients for one transformation, and aa2,bb2,cc2,dd2 are the -! coefficients for a second one, then the coefficients for the mapping -! of a test point, zz, by aa1 etc to zw, followed by a mapping of zw, by -! aa2 etc to zv, is equivalent to a single mapping zz-->zv by the transformatn -! with coefficients aa3,bb3,cc3,dd3, such that, as 2*2 complex matrices: -! -! [ aa3, bb3 ] [ aa2, bb2 ] [ aa1, bb1 ] -! [ ] = [ ] * [ ] -! [ cc3, dd3 ] [ cc2, dd2 ] [ cc1, dd1 ] . -! -! Note that the determinant of these matrices is always +1 -! -!============================================================================= -subroutine ctoz(v, z,infz)! [ctoz] -!============================================================================= -real(dp),dimension(3),intent(IN ):: v -complex(dpc), intent(OUT):: z -logical, intent(OUT):: infz -!----------------------------------------------------------------------------- -real(dp),parameter:: zero=0,one=1 -real(dp) :: rr,zzpi -!============================================================================= -infz=.false. -z=cmplx(v(1),v(2),dpc) -if(v(3)>0)then - zzpi=one/(one+v(3)) -else - rr=v(1)**2+v(2)**2 - infz=(rr==zero); if(infz)return ! <- The point is mapped to infinity (90S) - zzpi=(one-v(3))/rr -endif -z=z*zzpi -end subroutine ctoz - -!============================================================================= -subroutine ztoc(z,infz, v)! [ztoc] -!============================================================================= -complex(dpc), intent(IN ):: z -logical, intent(IN ):: infz -real(dp),dimension(3),intent(OUT):: v -!----------------------------------------------------------------------------- -real(dp),parameter:: zero=0,one=1 -real(dp) :: r,q,rs,rsc,rsbi -!============================================================================= -if(infz)then; v=(/zero,zero,-one/); return; endif -r=real(z); q=aimag(z); rs=r*r+q*q -rsc=one-rs -rsbi=one/(one+rs) -v(1)=2*rsbi*r -v(2)=2*rsbi*q -v(3)=rsc*rsbi -end subroutine ztoc - -!============================================================================= -subroutine ztocd(z,infz, v,vd)! [ztoc] -!============================================================================= -! The convention adopted for the complex derivative is that, for a complex -! infinitesimal map displacement, delta_z, the corresponding infinitesimal -! change of cartesian vector position is delta_v given by: -! delta_v = Real(vd*delta_z). -! Thus, by a kind of Cauchy-Riemann relation, Imag(vd)=v CROSS Real(vd). -! THE DERIVATIVE FOR THE IDEAL POINT AT INFINITY HAS NOT BEEN CODED YET!!! -!============================================================================= -complex(dpc), intent(IN ):: z -logical, intent(IN ):: infz -real(dp),dimension(3), intent(OUT):: v -complex(dpc),dimension(3),intent(OUT):: vd -!----------------------------------------------------------------------------- -real(dp),parameter :: zero=0,one=1 -real(dp) :: r,q,rs,rsc,rsbi,rsbis -real(dp),dimension(3):: u1,u2 -integer :: i -!============================================================================= -if(infz)then; v=(/zero,zero,-one/); return; endif -r=real(z); q=aimag(z); rs=r*r+q*q -rsc=one-rs -rsbi=one/(one+rs) -rsbis=rsbi**2 -v(1)=2*rsbi*r -v(2)=2*rsbi*q -v(3)=rsc*rsbi -u1(1)=2*(one+q*q-r*r)*rsbis -u1(2)=-4*r*q*rsbis -u1(3)=-4*r*rsbis -u2=cross_product(v,u1) -do i=1,3 - vd(i)=cmplx(u1(i),-u2(i),dpc) -enddo -end subroutine ztocd - -!============================================================================ -subroutine setmobius(xc0,xc1,xc2, aa,bb,cc,dd)! [setmobius] -!============================================================================ -! Find the Mobius transformation complex coefficients, aa,bb,cc,dd, -! with aa*dd-bb*cc=1, for a standard (north-)polar stereographic transformation -! that takes cartesian point, xc0 to the north pole, xc1 to (lat=0,lon=0), -! xc2 to the south pole (=complex infinity). -!============================================================================ -real(dp),dimension(3),intent(IN ):: xc0,xc1,xc2 -complex(dpc), intent(OUT):: aa,bb,cc,dd -!---------------------------------------------------------------------------- -real(dp),parameter:: zero=0,one=1 -logical :: infz0,infz1,infz2 -complex(dpc) :: z0,z1,z2,z02,z10,z21 -!============================================================================ -call ctoz(xc0,z0,infz0) -call ctoz(xc1,z1,infz1) -call ctoz(xc2,z2,infz2) -z21=z2-z1 -z02=z0-z2 -z10=z1-z0 - -if( (z0==z1.and.infz0.eqv.infz1).or.& - (z1==z2.and.infz1.eqv.infz2).or.& - (z2==z0.and.infz2.eqv.infz0)) & - stop 'In setmobius; anchor points must be distinct' - -if(infz2 .or. (.not.infz0 .and. abs(z0) XE three cartesian components. -! <-- DLAT degrees latitude -! <-- DLON degrees longitude -!============================================================================= -use pietc, only: u0,rtod -real(sp),dimension(3),intent(IN ):: xe -real(sp), intent(OUT):: dlat,dlon -!----------------------------------------------------------------------------- -real(sp) :: r -!============================================================================= -r=sqrt(xe(1)**2+xe(2)**2) -dlat=atan2(xe(3),r)*rtod -if(r==u0)then - dlon=u0 -else - dlon=atan2(xe(2),xe(1))*rtod -endif -end subroutine sctog - -!============================================================================= -subroutine dctog(xe,dlat,dlon)! [ctog] -!============================================================================= -use pietc, only: u0,rtod -real(dp),dimension(3),intent(IN ):: xe -real(dp), intent(OUT):: dlat,dlon -!----------------------------------------------------------------------------- -real(dp) :: r -!============================================================================= -r=sqrt(xe(1)**2+xe(2)**2) -dlat=atan2(xe(3),r)*rtod -if(r==u0)then - dlon=u0 -else - dlon=atan2(xe(2),xe(1))*rtod -endif -end subroutine dctog - -!============================================================================= -subroutine sgtoc(dlat,dlon,xe)! [gtoc] -!============================================================================= -! R.J.Purser, National Meteorological Center, Washington D.C. 1994 -! SUBROUTINE GTOC -! Transform "Geographical" to "Cartesian" coordinates, where the -! geographical coordinates refer to latitude and longitude (degrees) -! and cartesian coordinates are standard earth-centered cartesian -! coordinates: xe(3) pointing north, xe(1) pointing to the 0-meridian. -! --> DLAT degrees latitude -! --> DLON degrees longitude -! <-- XE three cartesian components. -!============================================================================= -use pietc, only: dtor -real(sp), intent(IN ):: dlat,dlon -real(sp),dimension(3),intent(OUT):: xe -!----------------------------------------------------------------------------- -real(sp) :: rlat,rlon,sla,cla,slo,clo -!============================================================================= -rlat=dtor*dlat; rlon=dtor*dlon -sla=sin(rlat); cla=cos(rlat) -slo=sin(rlon); clo=cos(rlon) -xe(1)=cla*clo; xe(2)=cla*slo; xe(3)=sla -end subroutine sgtoc -!============================================================================= -subroutine dgtoc(dlat,dlon,xe)! [gtoc] -!============================================================================= -use pietc, only: dtor -real(dp), intent(IN ):: dlat,dlon -real(dp),dimension(3),intent(OUT):: xe -!----------------------------------------------------------------------------- -real(dp) :: rlat,rlon,sla,cla,slo,clo -!============================================================================= -rlat=dtor*dlat; rlon=dtor*dlon -sla=sin(rlat); cla=cos(rlat) -slo=sin(rlon); clo=cos(rlon) -xe(1)=cla*clo; xe(2)=cla*slo; xe(3)=sla -end subroutine dgtoc -!============================================================================= -subroutine sgtocd(dlat,dlon,xe,dxedlat,dxedlon)! [gtoc] -!============================================================================= -real(sp), intent(IN ):: dlat,dlon -real(sp),dimension(3),intent(OUT):: xe,dxedlat,dxedlon -!----------------------------------------------------------------------------- -real(dp) :: dlat_d,dlon_d -real(dp),dimension(3):: xe_d,dxedlat_d,dxedlon_d -!============================================================================= -dlat_d=dlat; dlon_d=dlon -call dgtocd(dlat_d,dlon_d,xe_d,dxedlat_d,dxedlon_d) -xe =xe_d -dxedlat=dxedlat_d -dxedlon=dxedlon_d -end subroutine sgtocd -!============================================================================= -subroutine dgtocd(dlat,dlon,xe,dxedlat,dxedlon)! [gtoc] -!============================================================================= -use pietc, only: dtor -real(dp), intent(IN ):: dlat,dlon -real(dp),dimension(3),intent(OUT):: xe,dxedlat,dxedlon -!----------------------------------------------------------------------------- -real(dp) :: rlat,rlon,sla,cla,slo,clo -!============================================================================= -rlat=dtor*dlat; rlon=dtor*dlon -sla=sin(rlat); cla=cos(rlat) -slo=sin(rlon); clo=cos(rlon) -xe(1)=cla*clo; xe(2)=cla*slo; xe(3)=sla -dxedlat(1)=-sla*clo; dxedlat(2)=-sla*slo; dxedlat(3)=cla; dxedlat=dxedlat*dtor -dxedlon(1)=-cla*slo; dxedlon(2)= cla*clo; dxedlon(3)=0 ; dxedlon=dxedlon*dtor -end subroutine dgtocd -!============================================================================= -subroutine sgtocdd(dlat,dlon,xe,dxedlat,dxedlon, & - ddxedlatdlat,ddxedlatdlon,ddxedlondlon)! [gtoc] -!============================================================================= -use pietc, only: dtor -real(sp), intent(IN ):: dlat,dlon -real(sp),dimension(3),intent(OUT):: xe,dxedlat,dxedlon, & - ddxedlatdlat,ddxedlatdlon,ddxedlondlon -!----------------------------------------------------------------------------- -real(dp) :: dlat_d,dlon_d -real(dp),dimension(3):: xe_d,dxedlat_d,dxedlon_d, & - ddxedlatdlat_d,ddxedlatdlon_d,ddxedlondlon_d -!============================================================================= -dlat_d=dlat; dlon_d=dlon -call dgtocdd(dlat_d,dlon_d,xe_d,dxedlat_d,dxedlon_d, & - ddxedlatdlat_d,ddxedlatdlon_d,ddxedlondlon_d) -xe =xe_d -dxedlat =dxedlat_d -dxedlon =dxedlon_d -ddxedlatdlat=ddxedlatdlat_d -ddxedlatdlon=ddxedlatdlon_d -ddxedlondlon=ddxedlondlon_d -end subroutine sgtocdd -!============================================================================= -subroutine dgtocdd(dlat,dlon,xe,dxedlat,dxedlon, & - ddxedlatdlat,ddxedlatdlon,ddxedlondlon)! [gtoc] -!============================================================================= -use pietc, only: dtor -real(dp), intent(IN ):: dlat,dlon -real(dp),dimension(3),intent(OUT):: xe,dxedlat,dxedlon, & - ddxedlatdlat,ddxedlatdlon,ddxedlondlon -!----------------------------------------------------------------------------- -real(dp) :: rlat,rlon,sla,cla,slo,clo -!============================================================================= -rlat=dtor*dlat; rlon=dtor*dlon -sla=sin(rlat); cla=cos(rlat) -slo=sin(rlon); clo=cos(rlon) -xe(1)=cla*clo; xe(2)=cla*slo; xe(3)=sla -dxedlat(1)=-sla*clo; dxedlat(2)=-sla*slo; dxedlat(3)=cla; dxedlat=dxedlat*dtor -dxedlon(1)=-cla*slo; dxedlon(2)= cla*clo; dxedlon(3)=0 ; dxedlon=dxedlon*dtor -ddxedlatdlat(1)=-cla*clo -ddxedlatdlat(2)=-cla*slo -ddxedlatdlat(3)=-sla -ddxedlatdlon(1)= sla*slo -ddxedlatdlon(2)=-sla*clo -ddxedlatdlon(3)= 0 -ddxedlondlon(1)=-cla*clo -ddxedlondlon(2)=-cla*slo -ddxedlondlon(3)= 0 -ddxedlatdlat=ddxedlatdlat*dtor**2 -ddxedlatdlon=ddxedlatdlon*dtor**2 -ddxedlondlon=ddxedlondlon*dtor**2 -end subroutine dgtocdd - -!============================================================================== -subroutine sgtoframem(splat,splon,sorth)! [gtoframe] -!============================================================================== -real(sp), intent(in ):: splat,splon -real(sp),dimension(3,3),intent(out):: sorth -!------------------------------------------------------------------------------ -real(dp):: plat,plon -real(dp),dimension(3,3):: orth -!============================================================================== -plat=splat; plon=splon; call gtoframem(plat,plon,orth); sorth=orth -end subroutine sgtoframem -!============================================================================== -subroutine gtoframem(plat,plon,orth)! [gtoframe] -!============================================================================== -! From the degree lat and lo (plat and plon) return the standard orthogonal -! 3D frame at this location as an orthonormal matrix, orth. -!============================================================================== -real(dp), intent(in ):: plat,plon -real(dp),dimension(3,3),intent(out):: orth -!------------------------------------------------------------------------------ -real(dp),dimension(3):: xp,yp,zp -!============================================================================== -call gtoframev(plat,plon, xp,yp,zp) -orth(:,1)=xp; orth(:,2)=yp; orth(:,3)=zp -end subroutine gtoframem -!============================================================================== -subroutine sgtoframev(splat,splon,sxp,syp,szp)! [gtoframe] -!============================================================================== -real(sp), intent(in ):: splat,splon -real(sp),dimension(3),intent(out):: sxp,syp,szp -!------------------------------------------------------------------------------ -real(dp) :: plat,plon -real(dp),dimension(3):: xp,yp,zp -!============================================================================== -plat=splat; plon=splon -call gtoframev(plat,plon, xp,yp,zp) -sxp=xp; syp=yp; szp=zp -end subroutine sgtoframev -!============================================================================== -subroutine gtoframev(plat,plon, xp,yp,zp)! [gtoframe] -!============================================================================== -! Given a geographical point by its degrees lat and lon, plat and plon, -! return its standard orthogonal cartesian frame, {xp,yp,zp} in earth-centered -! coordinates. -!============================================================================= -use pietc, only: u0,u1 -real(dp), intent(in ):: plat,plon -real(dp),dimension(3),intent(out):: xp,yp,zp -!------------------------------------------------------------------------------ -real(dp),dimension(3):: dzpdlat,dzpdlon -!============================================================================== -if(plat==90)then ! is this the north pole? - xp=(/ u0,u1, u0/) ! Assume the limiting case lat-->90 along the 0-meridian - yp=(/-u1,u0, u0/) ! - zp=(/ u0,u0, u1/) -elseif(plat==-90)then - xp=(/ u0,u1, u0/) ! Assume the limiting case lat-->90 along the 0-meridian - yp=(/ u1,u0, u0/) ! - zp=(/ u0,u0,-u1/) -else - call gtoc(plat,plon,zp,dzpdlat,dzpdlon) - xp=dzpdlon/sqrt(dot_product(dzpdlon,dzpdlon)) - yp=dzpdlat/sqrt(dot_product(dzpdlat,dzpdlat)) -endif -end subroutine gtoframev - -!============================================================================== -subroutine sparaframe(sxp,syp,szp, sxv,syv,szv)! [paraframe] -!============================================================================== -real(sp),dimension(3),intent(in ):: sxp,syp,szp, szv -real(sp),dimension(3),intent(out):: sxv,syv -!----------------------------------------------------------------------------- -real(dp),dimension(3):: xp,yp,zp, xv,yv,zv -!============================================================================= -xp=sxp; yp=syp; zp=szp -call paraframe(xp,yp,zp, xv,yv,zv) -sxv=xv; syv=yv -end subroutine sparaframe -!============================================================================== -subroutine paraframe(xp,yp,zp, xv,yv,zv)! [paraframe] -!============================================================================== -! Take a principal reference orthonormal frame, {xp,yp,zp} and a dependent -! point defined by unit vector, zv, and complete the V-frame cartesian -! components, {xv,yv}, that are the result of parallel-transport of {xp,yp} -! along the geodesic between P and V -!============================================================================== -use pmat4, only: cross_product,normalized -real(dp),dimension(3),intent(in ):: xp,yp,zp, zv -real(dp),dimension(3),intent(out):: xv,yv -!------------------------------------------------------------------------------ -real(dp) :: xpofv,ypofv,theta,ctheta,stheta -real(dp),dimension(3):: xq,yq -!============================================================================== -xpofv=dot_product(xp,zv) -ypofv=dot_product(yp,zv) -theta=atan2(ypofv,xpofv); ctheta=cos(theta); stheta=sin(theta) -xq=zv-zp; xq=xq-zv*dot_product(xq,zv); xq=normalized(xq) -yq=cross_product(zv,xq) -xv=xq*ctheta-yq*stheta -yv=xq*stheta+yq*ctheta -end subroutine paraframe - -!============================================================================== -subroutine sframetwist(sxp,syp,szp, sxv,syv,szv, stwist)! [frametwist] -!============================================================================== -real(sp),dimension(3),intent(in ):: sxp,syp,szp, sxv,syv,szv -real(sp), intent(out):: stwist -!------------------------------------------------------------------------------ -real(dp),dimension(3):: xp,yp,zp, xv,yv,zv -real(dp) :: twist -!============================================================================== -xp=sxp;yp=syp; zp=szp; xv=sxv; yv=syv; zv=szv -call frametwist(xp,yp,zp, xv,yv,zv, twist) -stwist=twist -end subroutine sframetwist -!============================================================================== -subroutine frametwist(xp,yp,zp, xv,yv,zv, twist)! [frametwist] -!============================================================================== -! Given a principal cartesian orthonormal frame, {xp,yp,zp} (i.e., at P with -! Earth-centered cartesians, zp), and another similar frame {xv,yv,zv} at V -! with Earth-centered cartesians zv, find the relative rotation angle, "twist" -! by which the frame at V is rotated in the counterclockwise sense relative -! to the parallel-transportation of P's frame to V. -! Note that, by symmetry, transposing P and V leads to the opposite twist. -!============================================================================== -real(dp),dimension(3),intent(in ):: xp,yp,zp, xv,yv,zv -real(dp), intent(out):: twist -!------------------------------------------------------------------------------ -real(dp),dimension(3):: xxv,yyv -real(dp) :: c,s -!============================================================================== -call paraframe(xp,yp,zp, xxv,yyv,zv) -c=dot_product(xv,xxv); s=dot_product(xv,yyv) -twist=atan2(s,c) -end subroutine frametwist - -!============================================================================= -subroutine sctoc(s,xc1,xc2)! [ctoc_schm] -!============================================================================= -! Evaluate schmidt transformation, xc1 --> xc2, with scaling parameter s -!============================================================================= -real(sp), intent(IN ):: s -real(sp),dimension(3),intent(INOUT):: xc1,xc2 -!----------------------------------------------------------------------------- -real(sp) :: x,y,z,a,b,d,e,ab2,aa,bb,di,aapbb,aambb -!============================================================================= -x=xc1(1); y=xc1(2); z=xc1(3) -a=s+1 -b=s-1 -ab2=a*b*2 -aa=a*a -bb=b*b -aapbb=aa+bb -aambb=aa-bb -d=aapbb-ab2*z -e=aapbb*z-ab2 -di=1/d -xc2(1)=(aambb*x)*di -xc2(2)=(aambb*y)*di -xc2(3)=e*di -end subroutine sctoc - -!============================================================================= -subroutine sctocd(s,xc1,xc2,dxc2)! [ctoc_schm] -!============================================================================= -! Evaluate schmidt transformation, xc1 --> xc2, with scaling parameter s, -! and its jacobian, dxc2. -!============================================================================= -real(sp),intent(IN) :: s -real(sp),dimension(3), intent(INOUT):: xc1,xc2 -real(sp),dimension(3,3),intent( OUT):: dxc2 -!----------------------------------------------------------------------------- -real(sp) :: x,y,z,a,b,d,e, & - ab2,aa,bb,di,ddi,aapbb,aambb -!============================================================================= -x=xc1(1); y=xc1(2); z=xc1(3) -a=s+1 -b=s-1 -ab2=a*b*2 -aa=a*a -bb=b*b -aapbb=aa+bb -aambb=aa-bb -d=aapbb-ab2*z -e=aapbb*z-ab2 -di=1/d -xc2(1)=(aambb*x)*di -xc2(2)=(aambb*y)*di -xc2(3)=e*di -ddi=di*di - -dxc2=0 -dxc2(1,1)=aambb*di -dxc2(1,3)=ab2*aambb*x*ddi -dxc2(2,2)=aambb*di -dxc2(2,3)=ab2*aambb*y*ddi -dxc2(3,3)=aapbb*di +ab2*e*ddi -end subroutine sctocd - -!============================================================================= -subroutine sctocdd(s,xc1,xc2,dxc2,ddxc2)! [ctoc_schm] -!============================================================================= -! Evaluate schmidt transformation, xc1 --> xc2, with scaling parameter s, -! its jacobian, dxc2, and its 2nd derivative, ddxc2. -!============================================================================= -real(sp), intent(IN ):: s -real(sp),dimension(3), intent(INOUT):: xc1,xc2 -real(sp),dimension(3,3), intent( OUT):: dxc2 -real(sp),dimension(3,3,3),intent( OUT):: ddxc2 -!----------------------------------------------------------------------------- -real(sp) :: x,y,z,a,b,d,e, & - ab2,aa,bb,di,ddi,dddi, & - aapbb,aambb -!============================================================================= -x=xc1(1); y=xc1(2); z=xc1(3) -a=s+1 -b=s-1 -ab2=a*b*2 -aa=a*a -bb=b*b -aapbb=aa+bb -aambb=aa-bb -d=aapbb-ab2*z -e=aapbb*z-ab2 -di=1/d -xc2(1)=(aambb*x)*di -xc2(2)=(aambb*y)*di -xc2(3)=e*di -ddi=di*di -dddi=ddi*di - -dxc2=0 -dxc2(1,1)=aambb*di -dxc2(1,3)=ab2*aambb*x*ddi -dxc2(2,2)=aambb*di -dxc2(2,3)=ab2*aambb*y*ddi -dxc2(3,3)=aapbb*di +ab2*e*ddi - -ddxc2=0 -ddxc2(1,1,3)=ab2*aambb*ddi -ddxc2(1,3,1)=ddxc2(1,1,3) -ddxc2(1,3,3)=2*ab2**2*aambb*x*dddi -ddxc2(2,2,3)=ab2*aambb*ddi -ddxc2(2,3,2)=ddxc2(2,2,3) -ddxc2(2,3,3)=2*ab2**2*aambb*y*dddi -ddxc2(3,3,3)=2*ab2*(aapbb*ddi+ab2*e*dddi) -end subroutine sctocdd - -!============================================================================= -subroutine dctoc(s,xc1,xc2)! [ctoc_schm] -!============================================================================= -! Evaluate schmidt transformation, xc1 --> xc2, with scaling parameter s -!============================================================================= -real(dp), intent(IN ):: s -real(dp),dimension(3),intent(INOUT):: xc1,xc2 -!----------------------------------------------------------------------------- -real(dp) :: x,y,z,a,b,d,e, & - ab2,aa,bb,di,aapbb,aambb -!============================================================================= -x=xc1(1); y=xc1(2); z=xc1(3) -a=s+1 -b=s-1 -ab2=a*b*2 -aa=a*a -bb=b*b -aapbb=aa+bb -aambb=aa-bb -d=aapbb-ab2*z -e=aapbb*z-ab2 -di=1/d -xc2(1)=(aambb*x)*di -xc2(2)=(aambb*y)*di -xc2(3)=e*di -end subroutine dctoc - -!============================================================================= -subroutine dctocd(s,xc1,xc2,dxc2)! [ctoc_schm] -!============================================================================= -! Evaluate schmidt transformation, xc1 --> xc2, with scaling parameter s, -! and its jacobian, dxc2. -!============================================================================= -real(dp), intent(IN ):: s -real(dp),dimension(3), intent(INOUT):: xc1,xc2 -real(dp),dimension(3,3),intent( OUT):: dxc2 -!----------------------------------------------------------------------------- -real(dp) :: x,y,z,a,b,d,e, & - ab2,aa,bb,di,ddi,aapbb,aambb -!============================================================================= -x=xc1(1); y=xc1(2); z=xc1(3) -a=s+1 -b=s-1 -ab2=a*b*2 -aa=a*a -bb=b*b -aapbb=aa+bb -aambb=aa-bb -d=aapbb-ab2*z -e=aapbb*z-ab2 -di=1/d -xc2(1)=(aambb*x)*di -xc2(2)=(aambb*y)*di -xc2(3)=e*di -ddi=di*di - -dxc2=0 -dxc2(1,1)=aambb*di -dxc2(1,3)=ab2*aambb*x*ddi -dxc2(2,2)=aambb*di -dxc2(2,3)=ab2*aambb*y*ddi -dxc2(3,3)=aapbb*di +ab2*e*ddi -end subroutine dctocd - -!============================================================================= -subroutine dctocdd(s,xc1,xc2,dxc2,ddxc2)! [ctoc_schm] -!============================================================================= -! Evaluate schmidt transformation, xc1 --> xc2, with scaling parameter s, -! its jacobian, dxc2, and its 2nd derivative, ddxc2. -!============================================================================= -real(dp),intent(IN) :: s -real(dp),dimension(3), intent(INOUT):: xc1,xc2 -real(dp),dimension(3,3), intent(OUT ):: dxc2 -real(dp),dimension(3,3,3),intent(OUT ):: ddxc2 -!----------------------------------------------------------------------------- -real(dp) :: x,y,z,a,b,d,e, & - ab2,aa,bb,di,ddi,dddi, & - aapbb,aambb -!============================================================================= -x=xc1(1); y=xc1(2); z=xc1(3) -a=s+1 -b=s-1 -ab2=a*b*2 -aa=a*a -bb=b*b -aapbb=aa+bb -aambb=aa-bb -d=aapbb-ab2*z -e=aapbb*z-ab2 -di=1/d -xc2(1)=(aambb*x)*di -xc2(2)=(aambb*y)*di -xc2(3)=e*di -ddi=di*di -dddi=ddi*di - -dxc2=0 -dxc2(1,1)=aambb*di -dxc2(1,3)=ab2*aambb*x*ddi -dxc2(2,2)=aambb*di -dxc2(2,3)=ab2*aambb*y*ddi -dxc2(3,3)=aapbb*di +ab2*e*ddi - -ddxc2=0 -ddxc2(1,1,3)=ab2*aambb*ddi -ddxc2(1,3,1)=ddxc2(1,1,3) -ddxc2(1,3,3)=2*ab2**2*aambb*x*dddi -ddxc2(2,2,3)=ab2*aambb*ddi -ddxc2(2,3,2)=ddxc2(2,2,3) -ddxc2(2,3,3)=2*ab2**2*aambb*y*dddi -ddxc2(3,3,3)=2*ab2*(aapbb*ddi+ab2*e*dddi) -end subroutine dctocdd - -!============================================================================= -subroutine plrot(rot3,n,x,y,z)! [plrot] -!============================================================================= -! Apply a constant rotation to a three dimensional polyline -!============================================================================= -integer, intent(IN ):: n -real(sp),dimension(3,3),intent(IN ):: rot3 -real(sp),dimension(n), intent(INOUT):: x,y,z -!----------------------------------------------------------------------------- -real(sp),dimension(3) :: t -integer :: k -!============================================================================= -do k=1,n - t(1)=x(k); t(2)=y(k); t(3)=z(k) - t=matmul(rot3,t) - x(k)=t(1); y(k)=t(2); z(k)=t(3) -enddo -end subroutine plrot - -!============================================================================= -subroutine plroti(rot3,n,x,y,z)! [plroti] -!============================================================================= -! Invert the rotation of a three-dimensional polyline -!============================================================================= -integer, intent(IN ):: n -real(sp),dimension(3,3),intent(IN ):: rot3 -real(sp),dimension(n), intent(INOUT):: x,y,z -!----------------------------------------------------------------------------- -real(sp),dimension(3) :: t -integer :: k -!============================================================================= -do k=1,n - t(1)=x(k); t(2)=y(k); t(3)=z(k) - t=matmul(t,rot3) - x(k)=t(1); y(k)=t(2); z(k)=t(3) -enddo -end subroutine plroti - -!============================================================================= -subroutine dplrot(rot3,n,x,y,z)! [plrot] -!============================================================================= -! Apply a constant rotation to a three dimensional polyline -!============================================================================= -integer, intent(IN ):: n -real(dP),dimension(3,3),intent(IN ):: rot3 -real(dP),dimension(n), intent(INOUT):: x,y,z -!----------------------------------------------------------------------------- -real(dP),dimension(3) :: t -integer :: k -!============================================================================= -do k=1,n - t(1)=x(k); t(2)=y(k); t(3)=z(k) - t=matmul(rot3,t) - x(k)=t(1); y(k)=t(2); z(k)=t(3) -enddo -end subroutine dplrot - -!============================================================================= -subroutine dplroti(rot3,n,x,y,z)! [plroti] -!============================================================================= -! Invert the rotation of a three-dimensional polyline -!============================================================================= -integer, intent(IN ):: n -real(dP),dimension(3,3),intent(IN ):: rot3 -real(dP),dimension(n), intent(INOUT):: x,y,z -!----------------------------------------------------------------------------- -real(dP),dimension(3) :: t -integer :: k -!============================================================================= -do k=1,n - t(1)=x(k); t(2)=y(k); t(3)=z(k) - t=matmul(t,rot3) - x(k)=t(1); y(k)=t(2); z(k)=t(3) -enddo -end subroutine dplroti - -!============================================================================= -subroutine plctoc(s,n,x,y,z)! [plctoc] -!============================================================================= -! Perform schmidt transformation with scaling parameter s to a polyline -!============================================================================= -integer, intent(IN ):: n -real(sp), intent(IN ):: s -real(sp),dimension(n),intent(INOUT):: x,y,z -!----------------------------------------------------------------------------- -real(sp) :: a,b,d,e,ab2,aa,bb,di,aapbb,aambb -integer :: i -!============================================================================= -a=s+1 -b=s-1 -ab2=a*b*2 -aa=a*a -bb=b*b -aapbb=aa+bb -aambb=aa-bb -do i=1,n - d=aapbb-ab2*z(i) - e=aapbb*z(i)-ab2 - di=1/d - x(i)=(aambb*x(i))*di - y(i)=(aambb*y(i))*di - z(i)=e*di -enddo -end subroutine plctoc - -end module pmat5 - - - diff --git a/sorc/regional_grid.fd/psym2.f90 b/sorc/regional_grid.fd/psym2.f90 deleted file mode 100644 index 3b6459047..000000000 --- a/sorc/regional_grid.fd/psym2.f90 +++ /dev/null @@ -1,498 +0,0 @@ -! *********************************** -! * module psym2 * -! * R. J. Purser * -! * NOAA/NCEP/EMC September 2018 * -! * jim.purser@noaa.gov * -! *********************************** -! -! A suite of routines to perform the eigen-decomposition of symmetric 2*2 -! matrices and to deliver basic analytic functions, and the derivatives -! of these functions, of such matrices. -! -! DIRECT DEPENDENCIES -! Module: pkind, pietc -! -!============================================================================= -module psym2 -!============================================================================= -use pkind, only: dp -use pietc, only: u0,u1,o2 -implicit none -private -public:: eigensym2,invsym2,sqrtsym2,expsym2,logsym2,id2222 - -real(dp),dimension(2,2,2,2):: id -data id/u1,u0,u0,u0, u0,o2,o2,u0, u0,o2,o2,u0, u0,u0,u0,u1/! Effective identity - -interface eigensym2; module procedure eigensym2,eigensym2d; end interface -interface invsym2; module procedure invsym2,invsym2d; end interface -interface sqrtsym2; module procedure sqrtsym2,sqrtsym2d; end interface -interface sqrtsym2d_e; module procedure sqrtsym2d_e; end interface -interface sqrtsym2d_t; module procedure sqrtsym2d_t; end interface -interface expsym2; module procedure expsym2,expsym2d; end interface -interface expsym2d_e; module procedure expsym2d_e; end interface -interface expsym2d_t; module procedure expsym2d_t; end interface -interface logsym2; module procedure logsym2,logsym2d ; end interface -interface logsym2d_e; module procedure logsym2d_e; end interface -interface logsym2d_t; module procedure logsym2d_t; end interface -interface id2222; module procedure id2222; end interface - -contains - -!============================================================================= -subroutine eigensym2(em,vv,oo)! [eigensym2] -!============================================================================= -! Get the orthogonal eigenvectors, vv, and diagonal matrix of eigenvalues, oo, -! of the symmetric 2*2 matrix, em. -!============================================================================= -real(dp),dimension(2,2),intent(in ):: em -real(dp),dimension(2,2),intent(out):: vv,oo -!----------------------------------------------------------------------------- -real(dp):: a,b,c,d,e,f,g,h -!============================================================================= -a=em(1,1); b=em(1,2); c=em(2,2) -d=a*c-b*b! <- det(em) -e=(a+c)/2; f=(a-c)/2 -h=sqrt(f**2+b**2) -g=sqrt(b**2+(h+abs(f))**2) -if (g==0)then; vv(:,1)=(/u1,u0/) -elseif(f> 0)then; vv(:,1)=(/h+f,b/)/g -else ; vv(:,1)=(/b,h-f/)/g -endif -vv(:,2)=(/-vv(2,1),vv(1,1)/) -oo=matmul(transpose(vv),matmul(em,vv)) -oo(1,2)=u0; oo(2,1)=u0 -end subroutine eigensym2 -!============================================================================= -subroutine eigensym2d(em,vv,oo,vvd,ood,ff)! [eigensym2] -!============================================================================= -! For a symmetric 2*2 matrix, em, return the normalized eigenvectors, vv, and -! the diagonal matrix of eigenvalues, oo. If the two eigenvalues are equal, -! proceed no further and raise the logical failure flagg, ff, to .true.; -! otherwise, return with vvd=d(vv)/d(em) and ood=d(oo)/d(em) and ff=.false., -! and maintain the symmetries between the last two of the indices of -! these derivatives. -!============================================================================= -real(dp),dimension(2,2), intent(in ):: em -real(dp),dimension(2,2), intent(out):: vv,oo -real(dp),dimension(2,2,2,2),intent(out):: vvd,ood -logical, intent(out):: ff -!----------------------------------------------------------------------------- -real(dp),dimension(2,2):: emd,tt,vvr -real(dp) :: oodif,dtheta -integer :: i,j -!============================================================================= -call eigensym2(em,vv,oo); vvr(1,:)=-vv(2,:); vvr(2,:)=vv(1,:) -oodif=oo(1,1)-oo(2,2); ff=oodif==u0; if(ff)return -ood=0 -vvd=0 -do j=1,2 - do i=1,2 - emd=0 - if(i==j)then - emd(i,j)=u1 - else - emd(i,j)=o2; emd(j,i)=o2 - endif - tt=matmul(transpose(vv),matmul(emd,vv)) - ood(1,1,i,j)=tt(1,1) - ood(2,2,i,j)=tt(2,2) - dtheta=tt(1,2)/oodif - vvd(:,:,i,j)=vvr*dtheta - enddo -enddo -end subroutine eigensym2d - -!============================================================================= -subroutine invsym2(em,z)! [invsym2] -!============================================================================= -! Get the inverse of a 2*2 matrix (need not be symmetric in this case). -!============================================================================= -real(dp),dimension(2,2),intent(in ):: em -real(dp),dimension(2,2),intent(out):: z -!----------------------------------------------------------------------------- -real(dp):: detem -!============================================================================= -z(1,1)=em(2,2); z(2,1)=-em(2,1); z(1,2)=-em(1,2); z(2,2)=em(1,1) -detem=em(1,1)*em(2,2)-em(2,1)*em(1,2) -z=z/detem -end subroutine invsym2 -!============================================================================= -subroutine invsym2d(em,z,zd)! [invsym2] -!============================================================================= -! Get the inverse, z,of a 2*2 symmetric matrix, em, and its derivative, zd, -! with respect to symmetric variations of its components. I.e., for a -! symmetric infinitesimal change, delta_em, in em, the resulting -! infinitesimal change in z would be: -! delta_z(i,j) = matmul(zd(i,j,:,:),delta_em) -!============================================================================= -real(dp),dimension(2,2) ,intent(in ):: em -real(dp),dimension(2,2) ,intent(out):: z -real(dp),dimension(2,2,2,2),intent(out):: zd -!----------------------------------------------------------------------------- -integer:: k,l -!============================================================================= -call invsym2(em,z) -call id2222(zd) -do l=1,2; do k=1,2 - zd(:,:,k,l)=-matmul(matmul(z,zd(:,:,k,l)),z) -enddo; enddo -end subroutine invsym2d - -!============================================================================= -subroutine sqrtsym2(em,z)! [sqrtsym2] -!============================================================================= -! Get the sqrt of a symmetric positive-definite 2*2 matrix -!============================================================================= -real(dp),dimension(2,2),intent(in ):: em -real(dp),dimension(2,2),intent(out):: z -!----------------------------------------------------------------------------- -real(dp),dimension(2,2):: vv,oo -integer :: i -!============================================================================= -call eigensym2(em,vv,oo) -do i=1,2 -if(oo(i,i)<0)stop 'In sqrtsym2; matrix em is not non-negative' -oo(i,i)=sqrt(oo(i,i)); enddo -z=matmul(vv,matmul(oo,transpose(vv))) -end subroutine sqrtsym2 - -!============================================================================= -subroutine sqrtsym2d(x,z,zd)! [sqrtsym2] -!============================================================================= -! General routine to evaluate z=sqrt(x), and the symmetric -! derivative, zd = dz/dx, where x is a symmetric 2*2 positive-definite -! matrix. If the eigenvalues are very close together, extract their -! geometric mean for "preconditioning" a scaled version, px, of x, whose -! sqrt, and hence its derivative, can be easily obtained by the series -! expansion method. Otherwise, use the eigen-method (which entails dividing -! by the difference in the eignevalues to get zd, and which therefore -! fails when the eigenvalues become too similar). -!============================================================================= -real(dp),dimension(2,2), intent(in ):: x -real(dp),dimension(2,2), intent(out):: z -real(dp),dimension(2,2,2,2),intent(out):: zd -!----------------------------------------------------------------------------- -real(dp),dimension(2,2):: px -real(dp) :: rdetx,lrdetx,htrpxs,q -!============================================================================= -rdetx=sqrt(x(1,1)*x(2,2)-x(1,2)*x(2,1)) ! <- sqrt(determinant of x) -lrdetx=sqrt(rdetx) -px=x/rdetx ! <- preconditioned x (has unit determinant) -htrpxs= ((px(1,1)+px(2,2))/2)**2 ! <- {half-trace-px}-squared -q=htrpxs-u1 -if(q<.05)then ! <- Taylor expansion method - call sqrtsym2d_t(px,z,zd) - z=z*lrdetx; zd=zd/lrdetx -else - call sqrtsym2d_e(x,z,zd) ! <- Eigen-method -endif -end subroutine sqrtsym2d - -!============================================================================= -subroutine sqrtsym2d_e(x,z,zd)! [sqrtsym2d_e] -!============================================================================= -real(dp),dimension(2,2), intent(in ):: x -real(dp),dimension(2,2), intent(out):: z -real(dp),dimension(2,2,2,2),intent(out):: zd -!----------------------------------------------------------------------------- -real(dp),dimension(2,2,2,2):: vvd,ood -real(dp),dimension(2,2) :: vv,oo,oori,tt -integer :: i,j -logical :: ff -!============================================================================= -call eigensym2(x,vv,oo,vvd,ood,ff) -z=u0; z(1,1)=sqrt(oo(1,1)); z(2,2)=sqrt(oo(2,2)) -z=matmul(matmul(vv,z),transpose(vv)) -oori=0; oori(1,1)=u1/sqrt(oo(1,1)); oori(2,2)=u1/sqrt(oo(2,2)) -do j=1,2 -do i=1,2 - tt=matmul(vvd(:,:,i,j),transpose(vv)) - zd(:,:,i,j)=o2*matmul(matmul(matmul(vv,ood(:,:,i,j)),oori),transpose(vv))& - +matmul(tt,z)-matmul(z,tt) -enddo -enddo -end subroutine sqrtsym2d_e - -!============================================================================= -subroutine sqrtsym2d_t(x,z,zd)! [sqrtsym2d_t] -!============================================================================= -! Use the Taylor-series method (eigenvalues both fairly close to unity). -! For a 2*2 positive definite symmetric matrix x, try to get both the z=sqrt(x) -! and dz/dx using the binomial-expansion method applied to the intermediate -! matrix, r = (x-1). ie z=sqrt(x) = (1+r)^{1/2} = I + (1/2)*r -(1/8)*r^2 ... -! + [(-)^n *(2n)!/{(n+1)! * n! *2^{2*n-1}} ]*r^{n+1} -!============================================================================= -real(dp),dimension(2,2), intent(in ):: x -real(dp),dimension(2,2), intent(out):: z -real(dp),dimension(2,2,2,2),intent(out):: zd -!----------------------------------------------------------------------------- -integer,parameter :: nit=300 ! number of iterative increments allowed -real(dp),parameter :: crit=1.e-17 -real(dp),dimension(2,2) :: r,rp,rd,rpd -real(dp) :: c -integer :: i,j,n -!============================================================================= -r=x; r(1,1)=x(1,1)-1; r(2,2)=x(2,2)-1 -z=0; z(1,1)=u1; z(2,2)=u1 -rp=r -c=o2 -do n=0,nit - z=z+c*rp - rp=matmul(rp,r) - if(sum(abs(rp)) lx = ly = - a = - k = / diff --git a/ush/valid_param_vals.sh b/ush/valid_param_vals.sh index fbd0cbb6f..b4214486f 100644 --- a/ush/valid_param_vals.sh +++ b/ush/valid_param_vals.sh @@ -33,8 +33,8 @@ valid_vals_CCPP_PHYS_SUITE=( \ "FV3_RRFS_v0" ) valid_vals_OZONE_PARAM_NO_CCPP=("ozphys_2015" "ozphys") valid_vals_GFDLgrid_RES=("48" "96" "192" "384" "768" "1152" "3072") -valid_vals_EXTRN_MDL_NAME_ICS=("GSMGFS" "FV3GFS" "RAPX" "HRRRX") -valid_vals_EXTRN_MDL_NAME_LBCS=("GSMGFS" "FV3GFS" "RAPX" "HRRRX") +valid_vals_EXTRN_MDL_NAME_ICS=("GSMGFS" "FV3GFS" "RAPX" "HRRRX" "NAM") +valid_vals_EXTRN_MDL_NAME_LBCS=("GSMGFS" "FV3GFS" "RAPX" "HRRRX" "NAM") valid_vals_FV3GFS_FILE_FMT_ICS=("nemsio" "grib2") valid_vals_FV3GFS_FILE_FMT_LBCS=("nemsio" "grib2") valid_vals_GRID_GEN_METHOD=("GFDLgrid" "ESGgrid") From 35f6a1d49f53ab9faa045291b796908a507fe8e2 Mon Sep 17 00:00:00 2001 From: JeffBeck-NOAA <55201531+JeffBeck-NOAA@users.noreply.github.com> Date: Thu, 10 Sep 2020 16:26:25 -0600 Subject: [PATCH 14/19] Revert "Activation/deactivation of ad-hoc stochastic physics schemes (#284)" (#288) This reverts commit 465416ffce2bd428f20483734df4658e1d422f9f. --- jobs/JREGIONAL_MAKE_ICS | 11 + jobs/JREGIONAL_MAKE_LBCS | 11 + modulefiles/codes/cheyenne/global_equiv_resol | 10 + modulefiles/codes/cheyenne/mosaic_file | 10 + modulefiles/codes/cheyenne/regional_grid | 10 + modulefiles/codes/hera/global_equiv_resol | 7 + modulefiles/codes/hera/mosaic_file | 7 + modulefiles/codes/hera/regional_grid | 7 + modulefiles/codes/jet/global_equiv_resol | 7 + modulefiles/codes/jet/mosaic_file | 7 + modulefiles/codes/jet/regional_grid | 8 + modulefiles/codes/odin/global_equiv_resol | 13 + modulefiles/codes/odin/mosaic_file | 13 + modulefiles/codes/odin/regional_grid | 11 + modulefiles/codes/stampede/global_equiv_resol | 10 + modulefiles/codes/stampede/mosaic_file | 12 + modulefiles/codes/stampede/regional_grid | 10 + modulefiles/tasks/cheyenne/make_grid | 15 + modulefiles/tasks/cheyenne/make_grid.local | 2 - modulefiles/tasks/hera/make_grid | 15 + modulefiles/tasks/hera/make_grid.local | 6 - modulefiles/tasks/hera/make_ics.local | 4 +- modulefiles/tasks/hera/make_lbcs.local | 4 +- modulefiles/tasks/jet/make_grid | 15 + modulefiles/tasks/jet/make_grid.local | 6 - modulefiles/tasks/jet/make_ics.local | 4 +- modulefiles/tasks/jet/make_lbcs.local | 4 +- modulefiles/tasks/odin/make_grid | 14 + modulefiles/tasks/stampede/make_grid | 11 + modulefiles/tasks/wcoss_cray/make_grid.local | 33 - .../tasks/wcoss_dell_p3/make_grid.local | 2 - scripts/exregional_make_grid.sh | 4 +- scripts/exregional_make_ics.sh | 389 ++-- scripts/exregional_make_lbcs.sh | 260 ++- sorc/global_equiv_resol.fd/Makefile_cheyenne | 29 + sorc/global_equiv_resol.fd/Makefile_hera | 29 + sorc/global_equiv_resol.fd/Makefile_jet | 29 + sorc/global_equiv_resol.fd/Makefile_odin | 29 + sorc/global_equiv_resol.fd/Makefile_stampede | 29 + sorc/global_equiv_resol.fd/Makefile_theia | 29 + sorc/global_equiv_resol.fd/compile.sh | 9 + .../global_equiv_resol.f90 | 185 ++ sorc/mosaic_file.fd/Makefile_cheyenne | 29 + sorc/mosaic_file.fd/Makefile_hera | 29 + sorc/mosaic_file.fd/Makefile_jet | 29 + sorc/mosaic_file.fd/Makefile_odin | 29 + sorc/mosaic_file.fd/Makefile_stampede | 29 + sorc/mosaic_file.fd/Makefile_theia | 29 + sorc/mosaic_file.fd/compile.sh | 9 + sorc/mosaic_file.fd/mosaic_file.f90 | 126 ++ sorc/regional_grid.fd/Makefile_cheyenne | 29 + sorc/regional_grid.fd/Makefile_hera | 29 + sorc/regional_grid.fd/Makefile_jet | 29 + sorc/regional_grid.fd/Makefile_odin | 29 + sorc/regional_grid.fd/Makefile_stampede | 29 + sorc/regional_grid.fd/Makefile_theia | 29 + sorc/regional_grid.fd/compile.sh | 9 + sorc/regional_grid.fd/gen_schmidt.f90 | 477 ++++ sorc/regional_grid.fd/hgrid_ak.f90 | 104 + sorc/regional_grid.fd/pietc.f90 | 95 + sorc/regional_grid.fd/pkind.f90 | 8 + sorc/regional_grid.fd/pmat.f90 | 1082 +++++++++ sorc/regional_grid.fd/pmat4.f90 | 1924 +++++++++++++++++ sorc/regional_grid.fd/pmat5.f90 | 791 +++++++ sorc/regional_grid.fd/psym2.f90 | 498 +++++ sorc/regional_grid.fd/regional_grid.f90 | 125 ++ sorc/regional_grid.fd/regional_grid.nml | 100 + ush/config.community.sh | 3 +- ush/config_defaults.sh | 10 - ush/generate_FV3LAM_wflow.sh | 39 +- ush/get_extrn_mdl_file_dir_info.sh | 57 - ush/load_modules_run_task.sh | 38 +- ush/set_extrn_mdl_params.sh | 44 +- ush/setup.sh | 26 +- ush/templates/regional_grid.nml | 14 + ush/valid_param_vals.sh | 4 +- 76 files changed, 6742 insertions(+), 509 deletions(-) create mode 100644 modulefiles/codes/cheyenne/global_equiv_resol create mode 100644 modulefiles/codes/cheyenne/mosaic_file create mode 100644 modulefiles/codes/cheyenne/regional_grid create mode 100644 modulefiles/codes/hera/global_equiv_resol create mode 100644 modulefiles/codes/hera/mosaic_file create mode 100644 modulefiles/codes/hera/regional_grid create mode 100644 modulefiles/codes/jet/global_equiv_resol create mode 100644 modulefiles/codes/jet/mosaic_file create mode 100644 modulefiles/codes/jet/regional_grid create mode 100644 modulefiles/codes/odin/global_equiv_resol create mode 100644 modulefiles/codes/odin/mosaic_file create mode 100644 modulefiles/codes/odin/regional_grid create mode 100644 modulefiles/codes/stampede/global_equiv_resol create mode 100644 modulefiles/codes/stampede/mosaic_file create mode 100644 modulefiles/codes/stampede/regional_grid create mode 100644 modulefiles/tasks/cheyenne/make_grid delete mode 100644 modulefiles/tasks/cheyenne/make_grid.local create mode 100644 modulefiles/tasks/hera/make_grid delete mode 100644 modulefiles/tasks/hera/make_grid.local create mode 100644 modulefiles/tasks/jet/make_grid delete mode 100644 modulefiles/tasks/jet/make_grid.local create mode 100644 modulefiles/tasks/odin/make_grid create mode 100644 modulefiles/tasks/stampede/make_grid delete mode 100644 modulefiles/tasks/wcoss_cray/make_grid.local delete mode 100644 modulefiles/tasks/wcoss_dell_p3/make_grid.local create mode 100644 sorc/global_equiv_resol.fd/Makefile_cheyenne create mode 100644 sorc/global_equiv_resol.fd/Makefile_hera create mode 100644 sorc/global_equiv_resol.fd/Makefile_jet create mode 100644 sorc/global_equiv_resol.fd/Makefile_odin create mode 100644 sorc/global_equiv_resol.fd/Makefile_stampede create mode 100644 sorc/global_equiv_resol.fd/Makefile_theia create mode 100755 sorc/global_equiv_resol.fd/compile.sh create mode 100644 sorc/global_equiv_resol.fd/global_equiv_resol.f90 create mode 100644 sorc/mosaic_file.fd/Makefile_cheyenne create mode 100644 sorc/mosaic_file.fd/Makefile_hera create mode 100644 sorc/mosaic_file.fd/Makefile_jet create mode 100644 sorc/mosaic_file.fd/Makefile_odin create mode 100644 sorc/mosaic_file.fd/Makefile_stampede create mode 100644 sorc/mosaic_file.fd/Makefile_theia create mode 100755 sorc/mosaic_file.fd/compile.sh create mode 100644 sorc/mosaic_file.fd/mosaic_file.f90 create mode 100644 sorc/regional_grid.fd/Makefile_cheyenne create mode 100644 sorc/regional_grid.fd/Makefile_hera create mode 100644 sorc/regional_grid.fd/Makefile_jet create mode 100644 sorc/regional_grid.fd/Makefile_odin create mode 100644 sorc/regional_grid.fd/Makefile_stampede create mode 100644 sorc/regional_grid.fd/Makefile_theia create mode 100755 sorc/regional_grid.fd/compile.sh create mode 100644 sorc/regional_grid.fd/gen_schmidt.f90 create mode 100644 sorc/regional_grid.fd/hgrid_ak.f90 create mode 100644 sorc/regional_grid.fd/pietc.f90 create mode 100644 sorc/regional_grid.fd/pkind.f90 create mode 100644 sorc/regional_grid.fd/pmat.f90 create mode 100644 sorc/regional_grid.fd/pmat4.f90 create mode 100644 sorc/regional_grid.fd/pmat5.f90 create mode 100644 sorc/regional_grid.fd/psym2.f90 create mode 100644 sorc/regional_grid.fd/regional_grid.f90 create mode 100644 sorc/regional_grid.fd/regional_grid.nml diff --git a/jobs/JREGIONAL_MAKE_ICS b/jobs/JREGIONAL_MAKE_ICS index 4ca00af53..2ddf94bac 100755 --- a/jobs/JREGIONAL_MAKE_ICS +++ b/jobs/JREGIONAL_MAKE_ICS @@ -91,6 +91,16 @@ esac # #----------------------------------------------------------------------- # +# Find the directory in which the wgrib2 executable is located. +# +#----------------------------------------------------------------------- +# +wgrib2_dir=$( which wgrib2 ) || print_err_msg_exit "\ +Directory in which the wgrib2 executable is located could not be found: + wgrib2_dir = \"${wgrib2_dir}\"" +# +#----------------------------------------------------------------------- +# # Set the name of and create the directory in which the output from this # script will be placed (if that directory doesn't already exist). # @@ -107,6 +117,7 @@ mkdir_vrfy -p "${ics_dir}" # $SCRIPTSDIR/exregional_make_ics.sh \ ics_dir="${ics_dir}" \ + wgrib2_dir="${wgrib2_dir}" \ APRUN="${APRUN}" || \ print_err_msg_exit "\ Call to ex-script corresponding to J-job \"${scrfunc_fn}\" failed." diff --git a/jobs/JREGIONAL_MAKE_LBCS b/jobs/JREGIONAL_MAKE_LBCS index 43bd27b5d..49923a0db 100755 --- a/jobs/JREGIONAL_MAKE_LBCS +++ b/jobs/JREGIONAL_MAKE_LBCS @@ -92,6 +92,16 @@ esac # #----------------------------------------------------------------------- # +# Find the directory in which the wgrib2 executable is located. +# +#----------------------------------------------------------------------- +# +wgrib2_dir=$( which wgrib2 ) || print_err_msg_exit "\ +Directory in which the wgrib2 executable is located could not be found: + wgrib2_dir = \"${wgrib2_dir}\"" +# +#----------------------------------------------------------------------- +# # Set the name of and create the directory in which the output from this # script will be placed (if it doesn't already exist). # @@ -108,6 +118,7 @@ mkdir_vrfy -p "${lbcs_dir}" # $SCRIPTSDIR/exregional_make_lbcs.sh \ lbcs_dir="${lbcs_dir}" \ + wgrib2_dir="${wgrib2_dir}" \ APRUN="${APRUN}" || \ print_err_msg_exit "\ Call to ex-script corresponding to J-job \"${scrfunc_fn}\" failed." diff --git a/modulefiles/codes/cheyenne/global_equiv_resol b/modulefiles/codes/cheyenne/global_equiv_resol new file mode 100644 index 000000000..d50a83ea0 --- /dev/null +++ b/modulefiles/codes/cheyenne/global_equiv_resol @@ -0,0 +1,10 @@ +#%Module##################################################### +## Module file for global_equiv_resol on NCAR/UCAR Cheyenne +############################################################# +module purge +module load ncarenv/1.3 +module load intel/18.0.5 +module load ncarcompilers/0.5.0 +module load netcdf/4.6.3 +# No hdf5 loaded since netcdf and hdf5 reside together on cheyenne + diff --git a/modulefiles/codes/cheyenne/mosaic_file b/modulefiles/codes/cheyenne/mosaic_file new file mode 100644 index 000000000..a24cf1ce6 --- /dev/null +++ b/modulefiles/codes/cheyenne/mosaic_file @@ -0,0 +1,10 @@ +#%Module##################################################### +## Module file for mosaic_file on NCAR/UCAR Cheyenne +############################################################# +module purge +module load ncarenv/1.3 +module load intel/18.0.5 +module load ncarcompilers/0.5.0 +module load impi/2018.4.274 +module load netcdf/4.6.3 +# No hdf5 loaded since netcdf and hdf5 reside together on cheyenne diff --git a/modulefiles/codes/cheyenne/regional_grid b/modulefiles/codes/cheyenne/regional_grid new file mode 100644 index 000000000..bd3d7874c --- /dev/null +++ b/modulefiles/codes/cheyenne/regional_grid @@ -0,0 +1,10 @@ +#%Module##################################################### +## Module file for regional_grid on NCAR/UCAR Cheyenne +############################################################# +module purge +module load ncarenv/1.3 +module load intel/18.0.5 +module load ncarcompilers/0.5.0 +module load impi/2018.4.274 +module load netcdf/4.6.3 +# No hdf5 loaded since netcdf and hdf5 reside together on cheyenne diff --git a/modulefiles/codes/hera/global_equiv_resol b/modulefiles/codes/hera/global_equiv_resol new file mode 100644 index 000000000..532e7fb65 --- /dev/null +++ b/modulefiles/codes/hera/global_equiv_resol @@ -0,0 +1,7 @@ +#%Module##################################################### +## Module file for regional_grid +############################################################# +module purge +module load intel/18.0.5.274 +module load netcdf/4.6.1 +module load hdf5/1.10.4 diff --git a/modulefiles/codes/hera/mosaic_file b/modulefiles/codes/hera/mosaic_file new file mode 100644 index 000000000..532e7fb65 --- /dev/null +++ b/modulefiles/codes/hera/mosaic_file @@ -0,0 +1,7 @@ +#%Module##################################################### +## Module file for regional_grid +############################################################# +module purge +module load intel/18.0.5.274 +module load netcdf/4.6.1 +module load hdf5/1.10.4 diff --git a/modulefiles/codes/hera/regional_grid b/modulefiles/codes/hera/regional_grid new file mode 100644 index 000000000..532e7fb65 --- /dev/null +++ b/modulefiles/codes/hera/regional_grid @@ -0,0 +1,7 @@ +#%Module##################################################### +## Module file for regional_grid +############################################################# +module purge +module load intel/18.0.5.274 +module load netcdf/4.6.1 +module load hdf5/1.10.4 diff --git a/modulefiles/codes/jet/global_equiv_resol b/modulefiles/codes/jet/global_equiv_resol new file mode 100644 index 000000000..532e7fb65 --- /dev/null +++ b/modulefiles/codes/jet/global_equiv_resol @@ -0,0 +1,7 @@ +#%Module##################################################### +## Module file for regional_grid +############################################################# +module purge +module load intel/18.0.5.274 +module load netcdf/4.6.1 +module load hdf5/1.10.4 diff --git a/modulefiles/codes/jet/mosaic_file b/modulefiles/codes/jet/mosaic_file new file mode 100644 index 000000000..532e7fb65 --- /dev/null +++ b/modulefiles/codes/jet/mosaic_file @@ -0,0 +1,7 @@ +#%Module##################################################### +## Module file for regional_grid +############################################################# +module purge +module load intel/18.0.5.274 +module load netcdf/4.6.1 +module load hdf5/1.10.4 diff --git a/modulefiles/codes/jet/regional_grid b/modulefiles/codes/jet/regional_grid new file mode 100644 index 000000000..c5efa3218 --- /dev/null +++ b/modulefiles/codes/jet/regional_grid @@ -0,0 +1,8 @@ +#%Module##################################################### +## Module file for regional_grid +############################################################# +module purge +module load intel/18.0.5.274 +module load netcdf/4.7.0 +module load hdf5/1.10.5 + diff --git a/modulefiles/codes/odin/global_equiv_resol b/modulefiles/codes/odin/global_equiv_resol new file mode 100644 index 000000000..123d202ea --- /dev/null +++ b/modulefiles/codes/odin/global_equiv_resol @@ -0,0 +1,13 @@ +#%Module##################################################### +## Module file for regional_grid +############################################################# +module load PrgEnv-intel +module swap intel/19.0.5.281 +module load cray-mpich/7.7.10 +module load cray-libsci +module load cray-netcdf-hdf5parallel +module load cray-parallel-netcdf +module load cray-hdf5-parallel + +export NETCDF=/opt/cray/pe/netcdf-hdf5parallel/4.6.3.2/INTEL/19.0 +export HDF5=/opt/cray/pe/hdf5-parallel/1.10.5.2/INTEL/19.0 diff --git a/modulefiles/codes/odin/mosaic_file b/modulefiles/codes/odin/mosaic_file new file mode 100644 index 000000000..123d202ea --- /dev/null +++ b/modulefiles/codes/odin/mosaic_file @@ -0,0 +1,13 @@ +#%Module##################################################### +## Module file for regional_grid +############################################################# +module load PrgEnv-intel +module swap intel/19.0.5.281 +module load cray-mpich/7.7.10 +module load cray-libsci +module load cray-netcdf-hdf5parallel +module load cray-parallel-netcdf +module load cray-hdf5-parallel + +export NETCDF=/opt/cray/pe/netcdf-hdf5parallel/4.6.3.2/INTEL/19.0 +export HDF5=/opt/cray/pe/hdf5-parallel/1.10.5.2/INTEL/19.0 diff --git a/modulefiles/codes/odin/regional_grid b/modulefiles/codes/odin/regional_grid new file mode 100644 index 000000000..2d4b9a9a3 --- /dev/null +++ b/modulefiles/codes/odin/regional_grid @@ -0,0 +1,11 @@ +#%Module##################################################### +## Module file for regional_grid +############################################################# +module load PrgEnv-intel +module swap intel/19.0.5.281 +module load cray-mpich/7.7.10 +module load cray-libsci +module load cray-netcdf-hdf5parallel +module load cray-parallel-netcdf +module load cray-hdf5-parallel + diff --git a/modulefiles/codes/stampede/global_equiv_resol b/modulefiles/codes/stampede/global_equiv_resol new file mode 100644 index 000000000..0f78231fa --- /dev/null +++ b/modulefiles/codes/stampede/global_equiv_resol @@ -0,0 +1,10 @@ +#%Module##################################################### +## Module file for regional_grid +############################################################# +module load intel/18.0.2 +module load impi/18.0.2 +module load hdf5/1.10.4 +module load netcdf/4.6.2 + +setenv NETCDF /opt/apps/intel18/netcdf/4.6.2/x86_64 +setenv HDF5 /opt/apps/intel18/hdf5/1.10.4/x86_64 diff --git a/modulefiles/codes/stampede/mosaic_file b/modulefiles/codes/stampede/mosaic_file new file mode 100644 index 000000000..bab633db7 --- /dev/null +++ b/modulefiles/codes/stampede/mosaic_file @@ -0,0 +1,12 @@ +#%Module##################################################### +## Module file for regional_grid +############################################################# + + +module load intel/18.0.2 +module load impi/18.0.2 +module load hdf5/1.10.4 +module load netcdf/4.6.2 + +setenv NETCDF /opt/apps/intel18/netcdf/4.6.2/x86_64 +setenv HDF5 /opt/apps/intel18/hdf5/1.10.4/x86_64 diff --git a/modulefiles/codes/stampede/regional_grid b/modulefiles/codes/stampede/regional_grid new file mode 100644 index 000000000..0f78231fa --- /dev/null +++ b/modulefiles/codes/stampede/regional_grid @@ -0,0 +1,10 @@ +#%Module##################################################### +## Module file for regional_grid +############################################################# +module load intel/18.0.2 +module load impi/18.0.2 +module load hdf5/1.10.4 +module load netcdf/4.6.2 + +setenv NETCDF /opt/apps/intel18/netcdf/4.6.2/x86_64 +setenv HDF5 /opt/apps/intel18/hdf5/1.10.4/x86_64 diff --git a/modulefiles/tasks/cheyenne/make_grid b/modulefiles/tasks/cheyenne/make_grid new file mode 100644 index 000000000..aeb62bab7 --- /dev/null +++ b/modulefiles/tasks/cheyenne/make_grid @@ -0,0 +1,15 @@ +#%Module##################################################### + +module purge + +module load ncarenv/1.3 +module load intel/19.0.2 +module load ncarcompilers/0.5.0 +module load netcdf/4.6.3 + +if [module-info mode load] { + system "ncar_pylib /glade/p/ral/jntp/UFS_CAM/ncar_pylib_20200427" +} +if [module-info mode remove] { + system "deactivate" +} diff --git a/modulefiles/tasks/cheyenne/make_grid.local b/modulefiles/tasks/cheyenne/make_grid.local deleted file mode 100644 index 4a271536c..000000000 --- a/modulefiles/tasks/cheyenne/make_grid.local +++ /dev/null @@ -1,2 +0,0 @@ - -ncar_pylib /glade/p/ral/jntp/UFS_CAM/ncar_pylib_20200427 diff --git a/modulefiles/tasks/hera/make_grid b/modulefiles/tasks/hera/make_grid new file mode 100644 index 000000000..12dc7ae10 --- /dev/null +++ b/modulefiles/tasks/hera/make_grid @@ -0,0 +1,15 @@ +#%Module##################################################### +## Module file for make_grid task. +############################################################# + +module purge + +module load intel/18.0.5.274 +module load netcdf/4.7.0 +module load hdf5/1.10.5 + +module use -a /contrib/miniconda3/modulefiles +module load miniconda3 +if [module-info mode load] { + system "conda activate regional_workflow" +} diff --git a/modulefiles/tasks/hera/make_grid.local b/modulefiles/tasks/hera/make_grid.local deleted file mode 100644 index e7d11ba40..000000000 --- a/modulefiles/tasks/hera/make_grid.local +++ /dev/null @@ -1,6 +0,0 @@ - -module use -a /contrib/miniconda3/modulefiles -module load miniconda3 -if [module-info mode load] { - system "conda activate regional_workflow" -} diff --git a/modulefiles/tasks/hera/make_ics.local b/modulefiles/tasks/hera/make_ics.local index aab8f50ad..ff1cad391 100644 --- a/modulefiles/tasks/hera/make_ics.local +++ b/modulefiles/tasks/hera/make_ics.local @@ -2,6 +2,4 @@ module load wgrib2 module use -a /contrib/miniconda3/modulefiles module load miniconda3 -if [module-info mode load] { - system "conda activate regional_workflow" -} +conda activate regional_workflow diff --git a/modulefiles/tasks/hera/make_lbcs.local b/modulefiles/tasks/hera/make_lbcs.local index aab8f50ad..ff1cad391 100644 --- a/modulefiles/tasks/hera/make_lbcs.local +++ b/modulefiles/tasks/hera/make_lbcs.local @@ -2,6 +2,4 @@ module load wgrib2 module use -a /contrib/miniconda3/modulefiles module load miniconda3 -if [module-info mode load] { - system "conda activate regional_workflow" -} +conda activate regional_workflow diff --git a/modulefiles/tasks/jet/make_grid b/modulefiles/tasks/jet/make_grid new file mode 100644 index 000000000..12dc7ae10 --- /dev/null +++ b/modulefiles/tasks/jet/make_grid @@ -0,0 +1,15 @@ +#%Module##################################################### +## Module file for make_grid task. +############################################################# + +module purge + +module load intel/18.0.5.274 +module load netcdf/4.7.0 +module load hdf5/1.10.5 + +module use -a /contrib/miniconda3/modulefiles +module load miniconda3 +if [module-info mode load] { + system "conda activate regional_workflow" +} diff --git a/modulefiles/tasks/jet/make_grid.local b/modulefiles/tasks/jet/make_grid.local deleted file mode 100644 index e7d11ba40..000000000 --- a/modulefiles/tasks/jet/make_grid.local +++ /dev/null @@ -1,6 +0,0 @@ - -module use -a /contrib/miniconda3/modulefiles -module load miniconda3 -if [module-info mode load] { - system "conda activate regional_workflow" -} diff --git a/modulefiles/tasks/jet/make_ics.local b/modulefiles/tasks/jet/make_ics.local index d5e37266b..d5fa8e56b 100644 --- a/modulefiles/tasks/jet/make_ics.local +++ b/modulefiles/tasks/jet/make_ics.local @@ -2,6 +2,4 @@ module load wgrib2/2.0.8 module use -a /contrib/miniconda3/modulefiles module load miniconda3 -if [module-info mode load] { - system "conda activate regional_workflow" -} +conda activate regional_workflow diff --git a/modulefiles/tasks/jet/make_lbcs.local b/modulefiles/tasks/jet/make_lbcs.local index d5e37266b..d5fa8e56b 100644 --- a/modulefiles/tasks/jet/make_lbcs.local +++ b/modulefiles/tasks/jet/make_lbcs.local @@ -2,6 +2,4 @@ module load wgrib2/2.0.8 module use -a /contrib/miniconda3/modulefiles module load miniconda3 -if [module-info mode load] { - system "conda activate regional_workflow" -} +conda activate regional_workflow diff --git a/modulefiles/tasks/odin/make_grid b/modulefiles/tasks/odin/make_grid new file mode 100644 index 000000000..d37cb0e9d --- /dev/null +++ b/modulefiles/tasks/odin/make_grid @@ -0,0 +1,14 @@ +#%Module##################################################### +## Module file for make_grid task. +############################################################# + +#module purge + +module load PrgEnv-intel +module swap intel/19.0.5.281 +module load cray-libsci +module load cray-netcdf-hdf5parallel +module load cray-parallel-netcdf +module load cray-hdf5-parallel +module load gcc/6.1.0 +module load slurm diff --git a/modulefiles/tasks/stampede/make_grid b/modulefiles/tasks/stampede/make_grid new file mode 100644 index 000000000..aa867cfbf --- /dev/null +++ b/modulefiles/tasks/stampede/make_grid @@ -0,0 +1,11 @@ +#%Module##################################################### +## Module file for make_grid task. +############################################################# + +module purge + +module load intel/18.0.2 +module load impi/18.0.2 +module load hdf5/1.10.4 +module load netcdf/4.6.2 +module load python3/3.7.0 diff --git a/modulefiles/tasks/wcoss_cray/make_grid.local b/modulefiles/tasks/wcoss_cray/make_grid.local deleted file mode 100644 index 4bebfc5e7..000000000 --- a/modulefiles/tasks/wcoss_cray/make_grid.local +++ /dev/null @@ -1,33 +0,0 @@ -module load modules - -module load xt-lsfhpc -module load ncep -module load alps -module load dvs -module load xpmem -module load ugni -module load craype-network-aries -module load switch -module load rca -module load gni-headers -module load udreg -module load hpss - -module load prod_util -module load g2tmpl-intel/1.4.0 -module load crtm-intel/2.2.6 -module load iobuf/2.0.7 -module load gempak/7.3.0 - -module load nco-gnu-sandybridge/4.4.4 -module load NetCDF-intel-sandybridge/4.2 -module load cfp-intel-sandybridge/1.1.0 -export USE_CFP=YES - -module load grib_util/1.1.0 - -module use -a /gpfs/hps3/emc/nems/noscrub/emc.nemspara/soft/modulefiles -module load esmf/8.0.0 - -module load python/3.6.3 - diff --git a/modulefiles/tasks/wcoss_dell_p3/make_grid.local b/modulefiles/tasks/wcoss_dell_p3/make_grid.local deleted file mode 100644 index b93479d8c..000000000 --- a/modulefiles/tasks/wcoss_dell_p3/make_grid.local +++ /dev/null @@ -1,2 +0,0 @@ -module load lsf/10.1 -module load python/3.6.3 diff --git a/scripts/exregional_make_grid.sh b/scripts/exregional_make_grid.sh index 2128e9ddb..977c9c99c 100755 --- a/scripts/exregional_make_grid.sh +++ b/scripts/exregional_make_grid.sh @@ -372,7 +372,9 @@ generation executable (exec_fp): 'dely': ${DEL_ANGLE_Y_SG}, 'lx': ${NEG_NX_OF_DOM_WITH_WIDE_HALO}, 'ly': ${NEG_NY_OF_DOM_WITH_WIDE_HALO}, - } + 'a': ${ESGgrid_ALPHA_PARAM}, + 'k': ${ESGgrid_KAPPA_PARAM}, +} " # # Call the python script to create the namelist file. diff --git a/scripts/exregional_make_ics.sh b/scripts/exregional_make_ics.sh index 3549d41c2..78ea18949 100755 --- a/scripts/exregional_make_ics.sh +++ b/scripts/exregional_make_ics.sh @@ -44,7 +44,7 @@ In directory: \"${scrfunc_dir}\" This is the ex-script for the task that generates initial condition (IC), surface, and zeroth hour lateral boundary condition (LBC0) files -(in NetCDF format) for the FV3-LAM. +for FV3 (in NetCDF format). ========================================================================" # #----------------------------------------------------------------------- @@ -56,6 +56,7 @@ This is the ex-script for the task that generates initial condition #----------------------------------------------------------------------- # valid_args=( \ +"wgrib2_dir" \ "ics_dir" \ "APRUN" \ ) @@ -94,31 +95,34 @@ cd_vrfy $workdir # #----------------------------------------------------------------------- # -# Set physics-suite-dependent variable mapping table needed in the FORTRAN -# namelist file that the chgres_cube executable will read in. +# Set physics-suite-dependent variables that are needed in the FORTRAN +# namelist file that the chgres executable will read in. # #----------------------------------------------------------------------- # -varmap_file="" +phys_suite="" case "${CCPP_PHYS_SUITE}" in -"FV3_GFS_2017_gfdlmp" | "FV3_GFS_2017_gfdlmp_regional" | "FV3_GFS_v16beta" | \ -"FV3_GFS_v15p2" ) - varmap_file="GFSphys_var_map.txt" +"FV3_GFS_2017_gfdlmp" | "FV3_GFS_2017_gfdlmp_regional" ) + phys_suite="GFS" ;; -"FV3_GSD_v0" | "FV3_GSD_SAR" | "FV3_GSD_SAR_v1" | "FV3_RRFS_v0" | \ -"FV3_RRFS_v1beta" ) - if [ "${EXTRN_MDL_NAME_ICS}" = "RAPX" ] || [ "${EXTRN_MDL_NAME_ICS}" = "HRRRX" ]; then - varmap_file="GSDphys_var_map.txt" - elif [ "${EXTRN_MDL_NAME_ICS}" = "NAM" ] || [ "${EXTRN_MDL_NAME_ICS}" = "FV3GFS" ] || \ - [ "${EXTRN_MDL_NAME_ICS}" = "GSMGFS" ]; then - varmap_file="GFSphys_var_map.txt" - fi +"FV3_GSD_v0" | "FV3_GSD_SAR" | "FV3_GSD_SAR_v1" |"FV3_RRFS_v0" |"FV3_RRFS_v1beta") + phys_suite="GSD" + ;; +"FV3_CPT_v0") + phys_suite="CPT" + ;; +"FV3_GFS_v15p2") + phys_suite="v15p2" + ;; +"FV3_GFS_v16beta") + phys_suite="v16beta" ;; *) print_err_msg_exit "\ -A variable mapping table has not yet been defined for this physics suite: +Physics-suite-dependent namelist variables have not yet been specified +for this physics suite: CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\"" ;; @@ -127,7 +131,7 @@ esac #----------------------------------------------------------------------- # # Set external-model-dependent variables that are needed in the FORTRAN -# namelist file that the chgres_cube executable will read in. These are de- +# namelist file that the chgres executable will read in. These are de- # scribed below. Note that for a given external model, usually only a # subset of these all variables are set (since some may be irrelevant). # @@ -144,10 +148,10 @@ esac # model that contains the surface fields. # # input_type: -# The "type" of input being provided to chgres_cube. This contains a combi- +# The "type" of input being provided to chgres. This contains a combi- # nation of information on the external model, external model file for- # mat, and maybe other parameters. For clarity, it would be best to -# eliminate this variable in chgres_cube and replace with with 2 or 3 others +# eliminate this variable in chgres and replace with with 2 or 3 others # (e.g. extrn_mdl, extrn_mdl_file_format, etc). # # tracers_input: @@ -163,24 +167,26 @@ esac # ment of tracers should be the name to use for the O3 mixing ratio in # the output file. For GSD physics, three additional tracers -- ice, # rain, and water number concentrations -- may be specified at the end -# of tracers, and these will be calculated by chgres_cube. +# of tracers, and these will be calculated by chgres. +# +# internal_GSD: +# Logical variable indicating whether or not to try to read in land sur- +# face model (LSM) variables available in the HRRRX grib2 files created +# after about 2019111500. # -# nsoill_out: +# numsoil_out: # The number of soil layers to include in the output NetCDF file. # -# FIELD_from_climo, where FIELD = "vgtyp", "sotyp", "vgfrc", "lai", or -# "minmax_vgfrc": -# Logical variable indicating whether or not to obtain the field in +# replace_FIELD, where FIELD="vgtyp", "sotyp", or "vgfrc": +# Logical variable indicating whether or not to obtain the field in # question from climatology instead of the external model. The field in # question is one of vegetation type (FIELD="vgtyp"), soil type (FIELD= -# "sotyp"), vegetation fraction (FIELD="vgfrc"), leaf area index -# (FIELD="lai"), or min/max areal fractional coverage of annual green -# vegetation (FIELD="minmax_vfrr"). If FIELD_from_climo is set to -# ".true.", then the field is obtained from climatology (regardless of -# whether or not it exists in an external model file). If it is set -# to ".false.", then the field is obtained from the external model. -# If "false" is chosen and the external model file does not provide -# this field, then chgres_cube prints out an error message and stops. +# "sotyp"), and vegetation fraction (FIELD="vgfrc"). If replace_FIELD +# is set to ".true.", then the field is obtained from climatology (re- +# gardless of whether or not it exists in an external model file). If +# it is set to ".false.", then the field is obtained from the external +# model. If the external model file does not provide this field, then +# chgres prints out an error message and stops. # # tg3_from_soil: # Logical variable indicating whether or not to set the tg3 soil tempe- # Needs to be verified. @@ -188,7 +194,8 @@ esac # #----------------------------------------------------------------------- # -# GSK comments about chgres_cube: + +# GSK comments about chgres: # # The following are the three atmsopheric tracers that are in the atmo- # spheric analysis (atmanl) nemsio file for CDATE=2017100700: @@ -221,6 +228,7 @@ esac # A non-prognostic variable that appears in the field_table for GSD physics # is cld_amt. Why is that in the field_table at all (since it is a non- # prognostic field), and how should we handle it here?? + # I guess this works for FV3GFS but not for the spectral GFS since these # variables won't exist in the spectral GFS atmanl files. # tracers_input="\"sphum\",\"liq_wat\",\"ice_wat\",\"rainwat\",\"snowwat\",\"graupel\",\"o3mr\"" @@ -235,16 +243,15 @@ fn_grib2="" input_type="" tracers_input="\"\"" tracers="\"\"" -nsoill_out="" +internal_GSD="" +numsoil_out="" geogrid_file_input_grid="\"\"" -vgtyp_from_climo="" -sotyp_from_climo="" -vgfrc_from_climo="" -minmax_vgfrc_from_climo="" -lai_from_climo="" +replace_vgtyp="" +replace_sotyp="" +replace_vgfrc="" tg3_from_soil="" convert_nst="" -thomp_mp_climo_file="" + case "${EXTRN_MDL_NAME_ICS}" in @@ -255,77 +262,72 @@ case "${EXTRN_MDL_NAME_ICS}" in fn_atm_nemsio="${EXTRN_MDL_FNS[0]}" fn_sfc_nemsio="${EXTRN_MDL_FNS[1]}" - input_type="gfs_gaussian_nemsio" # For spectral GFS Gaussian grid in nemsio format. - convert_nst=False + input_type="gfs_gaussian" # For spectral GFS Gaussian grid in nemsio format. tracers_input="[\"spfh\",\"clwmr\",\"o3mr\"]" tracers="[\"sphum\",\"liq_wat\",\"o3mr\"]" -# -# Use Thompson climatology for ice- and water-friendly aerosols if CCPP suite uses Thompson MP -# - if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then - thomp_mp_climo_file="" - elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then - thomp_mp_climo_file="${FIXam}/Thompson_MP_MONTHLY_CLIMO.nc" - else - print_err_msg_exit "\ - The chosen CCPP physics suite is unsupported at this time: - CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\"" - fi - nsoill_out="4" #If the CCPP suites uses RUC-LSM, the scheme will interpolate from 4 to 9 soil levels. - vgtyp_from_climo=True - sotyp_from_climo=True - vgfrc_from_climo=True - minmax_vgfrc_from_climo=True - lai_from_climo=True + internal_GSD=False + numsoil_out="4" + replace_vgtyp=True + replace_sotyp=True + replace_vgfrc=True tg3_from_soil=False + convert_nst=False ;; "FV3GFS") -# -# Use Thompson climatology for ice- and water-friendly aerosols if CCPP suite uses Thompson MP -# - if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then - thomp_mp_climo_file="" - elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then - thomp_mp_climo_file="${FIXam}/Thompson_MP_MONTHLY_CLIMO.nc" - else - print_err_msg_exit "\ - The chosen CCPP physics suite is unsupported as this time: - CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\"" - fi - if [ "${FV3GFS_FILE_FMT_ICS}" = "nemsio" ]; then external_model="FV3GFS" - tracers_input="[\"spfh\",\"clwmr\",\"o3mr\",\"icmr\",\"rwmr\",\"snmr\",\"grle\"]" - tracers="[\"sphum\",\"liq_wat\",\"o3mr\",\"ice_wat\",\"rainwat\",\"snowwat\",\"graupel\"]" - fn_atm_nemsio="${EXTRN_MDL_FNS[0]}" fn_sfc_nemsio="${EXTRN_MDL_FNS[1]}" - input_type="gaussian_nemsio" # For FV3-GFS Gaussian grid in nemsio format. - convert_nst=True + input_type="gaussian" # For FV3-GFS Gaussian grid in nemsio format. + + tracers_input="[\"spfh\",\"clwmr\",\"o3mr\",\"icmr\",\"rwmr\",\"snmr\",\"grle\"]" + +# +# If CCPP is being used, then the list of atmospheric tracers to include +# in the output file depends on the physics suite. Hopefully, this me- +# thod of specifying output tracers will be replaced with a variable +# table (which should be specific to each combination of external model, +# external model file type, and physics suite). +# + if [ "${USE_CCPP}" = "TRUE" ]; then + if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then + tracers="[\"sphum\",\"liq_wat\",\"o3mr\",\"ice_wat\",\"rainwat\",\"snowwat\",\"graupel\"]" + elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then +# For GSD physics, add three additional tracers (the ice, rain and water +# number concentrations) that are required for Thompson microphysics. + tracers="[\"sphum\",\"liq_wat\",\"o3mr\",\"ice_wat\",\"rainwat\",\"snowwat\",\"graupel\",\"ice_nc\",\"rain_nc\",\"water_nc\"]" + else + print_err_msg_exit "\ +The parameter \"tracers\" has not been defined for this combination of +external model (EXTRN_MDL_NAME_ICS), physics suite (CCPP_PHYS_SUITE), and +FV3GFS file type (FV3GFS_FILE_FMT_ICS): + EXTRN_MDL_NAME_ICS = \"${EXTRN_MDL_NAME_ICS}\" + CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\" + FV3GFS_FILE_FMT_ICS = \"${FV3GFS_FILE_FMT_ICS}\"" + fi +# +# If CCPP is not being used, the only physics suite that can be used is +# GFS. +# + else + tracers="[\"sphum\",\"liq_wat\",\"o3mr\",\"ice_wat\",\"rainwat\",\"snowwat\",\"graupel\"]" + fi elif [ "${FV3GFS_FILE_FMT_ICS}" = "grib2" ]; then @@ -333,17 +335,16 @@ case "${EXTRN_MDL_NAME_ICS}" in fn_grib2="${EXTRN_MDL_FNS[0]}" input_type="grib2" - convert_nst=False - + fi - - nsoill_out="4" #If the CCPP suites uses RUC-LSM, the scheme will interpolate from 4 to 9 soil levels. - vgtyp_from_climo=True - sotyp_from_climo=True - vgfrc_from_climo=True - minmax_vgfrc_from_climo=True - lai_from_climo=True + + internal_GSD=False + numsoil_out="4" + replace_vgtyp=True + replace_sotyp=True + replace_vgfrc=True tg3_from_soil=False + convert_nst=True ;; @@ -354,23 +355,38 @@ case "${EXTRN_MDL_NAME_ICS}" in fn_grib2="${EXTRN_MDL_FNS[0]}" input_type="grib2" -# -# Set soil levels based on LSM in CCPP SDF (RUC-LSM or Noah/Noah MP) -# + + internal_GSD=False + cdate_min_HRRRX="2019111500" + if [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" -o \ + "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ] && \ + [ ${CDATE} -gt ${cdate_min_HRRRX} ]; then + print_info_msg " +Setting the chgres_cube namelist setting \"internal_GSD\" to \".true.\" in +order to read in land surface model (LSM) variables available in the +HRRRX grib2 files created after about \"${cdate_min_HRRRX}\"..." + internal_GSD=True + fi + if [ "${USE_CCPP}" = "TRUE" ]; then if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then - nsoill_out="4" + numsoil_out="4" elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ - nsoill_out="9" + numsoil_out="9" + else + print_err_msg_exit "\ +The parameter \"numsoil_out\" has not been defined for this combination +of external model (EXTRN_MDL_NAME_ICS) and physics suite (CCPP_PHYS_SUITE): + EXTRN_MDL_NAME_ICS = \"${EXTRN_MDL_NAME_ICS}\" + CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\"" fi fi # @@ -382,14 +398,9 @@ case "${EXTRN_MDL_NAME_ICS}" in geogrid_file_input_grid="/misc/whome/rtrr/HRRR/static/WPS/geo_em.d01.nc" fi - #Note that vgfrc, shdmin/shdmax (minmax_vgfrc), and lai fields are only available in HRRRX - #files after mid-July 2019, and only so long as the record order didn't change afterward - - vgtyp_from_climo=True - sotyp_from_climo=True - vgfrc_from_climo=True - minmax_vgfrc_from_climo=True - lai_from_climo=True + replace_vgtyp=False + replace_sotyp=False + replace_vgfrc=False tg3_from_soil=True convert_nst=False @@ -401,22 +412,28 @@ case "${EXTRN_MDL_NAME_ICS}" in fn_grib2="${EXTRN_MDL_FNS[0]}" input_type="grib2" -# -# Set soil levels based on CCPP SDF -# + + internal_GSD=False + if [ "${USE_CCPP}" = "TRUE" ]; then if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then - nsoill_out="4" + numsoil_out="4" elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ - nsoill_out="9" + numsoil_out="9" + else + print_err_msg_exit "\ +The parameter \"numsoil_out\" has not been defined for this combination +of external model (EXTRN_MDL_NAME_ICS) and physics suite (CCPP_PHYS_SUITE): + EXTRN_MDL_NAME_ICS = \"${EXTRN_MDL_NAME_ICS}\" + CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\"" fi fi # @@ -428,53 +445,14 @@ case "${EXTRN_MDL_NAME_ICS}" in geogrid_file_input_grid="/misc/whome/rtrr/HRRR/static/WPS/geo_em.d01.nc" fi - vgtyp_from_climo=True - sotyp_from_climo=False - vgfrc_from_climo=True - minmax_vgfrc_from_climo=True - lai_from_climo=True + replace_vgtyp=False + replace_sotyp=False + replace_vgfrc=False tg3_from_soil=True convert_nst=False ;; -"NAM") - - external_model="NAM" - - fn_grib2="${EXTRN_MDL_FNS[0]}" - input_type="grib2" - -# -# Use Thompson climatology for ice- and water-friendly aerosols if CCPP suite uses Thompson MP -# - if [ "${USE_CCPP}" = "TRUE" ]; then - if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then - thomp_mp_climo_file="" - elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ - thomp_mp_climo_file="${FIXam}/Thompson_MP_MONTHLY_CLIMO.nc" - fi - fi - - nsoill_out="4" #If the CCPP suites uses RUC-LSM, the scheme will interpolate from 4 to 9 soil levels. - vgtyp_from_climo=True - sotyp_from_climo=True - vgfrc_from_climo=True - minmax_vgfrc_from_climo=True - lai_from_climo=True - tg3_from_soil=False - convert_nst=False - - ;; - *) print_err_msg_exit "\ External-model-dependent namelist variables have not yet been specified @@ -515,6 +493,49 @@ fi # Build the FORTRAN namelist file that chgres_cube will read in. # #----------------------------------------------------------------------- +# +# For GFS physics, the character arrays tracers_input(:) and tracers(:) +# must be specified in the namelist file. tracers_input(:) contains the +# tracer name to look for in the external model file(s), while tracers(:) +# contains the names to use for the tracers in the output NetCDF files +# that chgres creates (that will be read in by FV3). Since when FV3 +# reads these NetCDF files it looks for atmospheric traces as specified +# in the file field_table, tracers(:) should be set to the names in +# field_table. +# +# NOTE: This process should be automated where the set of elements that +# tracers(:) should be set to is obtained from reading in field_table. +# +# To know how to set tracers_input(:), you have to know the names of the +# variables in the input atmospheric nemsio file (usually this file is +# named gfs.t00z.atmanl.nemsio). +# +# It is not quite clear how these should be specified. Here are a list +# of examples: +# +# [Gerard.Ketefian@tfe05] /scratch3/.../chgres_cube.fd/run (feature/chgres_grib2_gsk) +# $ grep -n -i "tracers" * | grep theia +# config.C1152.l91.atm.theia.nml:24: tracers="sphum","liq_wat","o3mr","ice_wat","rainwat","snowwat","graupel" +# config.C1152.l91.atm.theia.nml:25: tracers_input="sphum","liq_wat","o3mr","ice_wat","rainwat","snowwat","graupel" +# config.C48.gaussian.theia.nml:20: tracers="sphum","liq_wat","o3mr","ice_wat","rainwat","snowwat","graupel" +# config.C48.gaussian.theia.nml:21: tracers_input="spfh","clwmr","o3mr","icmr","rwmr","snmr","grle" +# config.C48.gfs.gaussian.theia.nml:21: tracers="sphum","liq_wat","o3mr" +# config.C48.gfs.gaussian.theia.nml:22: tracers_input="spfh","clwmr","o3mr" +# config.C48.gfs.spectral.theia.nml:21: tracers_input="spfh","o3mr","clwmr" +# config.C48.gfs.spectral.theia.nml:22: tracers="sphum","o3mr","liq_wat" +# config.C48.theia.nml:21: tracers="sphum","liq_wat","o3mr" +# config.C48.theia.nml:22: tracers_input="spfh","clwmr","o3mr" +# config.C768.atm.theia.nml:24: tracers="sphum","liq_wat","o3mr","ice_wat","rainwat","snowwat","graupel" +# config.C768.atm.theia.nml:25: tracers_input="sphum","liq_wat","o3mr","ice_wat","rainwat","snowwat","graupel" +# config.C768.l91.atm.theia.nml:24: tracers="sphum","liq_wat","o3mr","ice_wat","rainwat","snowwat","graupel" +# config.C768.l91.atm.theia.nml:25: tracers_input="sphum","liq_wat","o3mr","ice_wat","rainwat","snowwat","graupel" +# config.C768.nest.atm.theia.nml:22: tracers="sphum","liq_wat","o3mr","ice_wat","rainwat","snowwat","graupel" +# config.C768.nest.atm.theia.nml:23: tracers_input="sphum","liq_wat","o3mr","ice_wat","rainwat","snowwat","graupel" + + +# fix_dir_target_grid="${BASEDIR}/ESG_grid_HRRR_like_fix_files_chgres_cube" +# base_install_dir="${SORCDIR}/chgres_cube.fd" + # # Create a multiline variable that consists of a yaml-compliant string # specifying the values that the namelist variables need to be set to @@ -524,39 +545,39 @@ fi # settings=" 'config': { - 'fix_dir_input_grid': ${UFS_UTILS_DIR}/fix/fix_chgres, 'fix_dir_target_grid': ${FIXLAM}, - 'mosaic_file_target_grid': ${FIXLAM}/${CRES}${DOT_OR_USCORE}mosaic.halo$((10#${NH4})).nc, + 'mosaic_file_target_grid': ${FIXLAM}/${CRES}${DOT_OR_USCORE}mosaic.halo${NH4}.nc, 'orog_dir_target_grid': ${FIXLAM}, - 'orog_files_target_grid': ${CRES}${DOT_OR_USCORE}oro_data.tile${TILE_RGNL}.halo$((10#${NH4})).nc, + 'orog_files_target_grid': ${CRES}${DOT_OR_USCORE}oro_data.tile${TILE_RGNL}.halo${NH4}.nc, 'vcoord_file_target_grid': ${FIXam}/global_hyblev.l65.txt, - 'varmap_file': ${UFS_UTILS_DIR}/parm/varmap_tables/${varmap_file}, + 'mosaic_file_input_grid': '', + 'orog_dir_input_grid': '', + 'base_install_dir': ${CHGRES_DIR}, + 'wgrib2_path': ${wgrib2_dir}, 'data_dir_input_grid': ${extrn_mdl_staging_dir}, 'atm_files_input_grid': ${fn_atm_nemsio}, 'sfc_files_input_grid': ${fn_sfc_nemsio}, 'grib2_file_input_grid': \"${fn_grib2}\", - 'cycle_mon': $((10#${mm})), - 'cycle_day': $((10#${dd})), - 'cycle_hour': $((10#${hh})), + 'cycle_mon': $((10#$mm)), + 'cycle_day': $((10#$dd)), + 'cycle_hour': $((10#$hh)), 'convert_atm': True, 'convert_sfc': True, 'convert_nst': ${convert_nst}, 'regional': 1, - 'halo_bndy': $((10#${NH4})), - 'halo_blend': $((10#${HALO_BLEND})), + 'halo_bndy': ${NH4}, 'input_type': ${input_type}, 'external_model': ${external_model}, 'tracers_input': ${tracers_input}, - 'tracers': ${tracers}, - 'nsoill_out': $((10#${nsoill_out})), + 'tracers': ${tracers}, + 'phys_suite': ${phys_suite}, + 'internal_GSD': ${internal_GSD}, + 'numsoil_out': ${numsoil_out}, 'geogrid_file_input_grid': ${geogrid_file_input_grid}, - 'vgtyp_from_climo': ${vgtyp_from_climo}, - 'sotyp_from_climo': ${sotyp_from_climo}, - 'vgfrc_from_climo': ${vgfrc_from_climo}, - 'minmax_vgfrc_from_climo': ${minmax_vgfrc_from_climo}, - 'lai_from_climo': ${lai_from_climo}, + 'replace_vgtyp': ${replace_vgtyp}, + 'replace_sotyp': ${replace_sotyp}, + 'replace_vgfrc': ${replace_vgfrc}, 'tg3_from_soil': ${tg3_from_soil}, - 'thomp_mp_climo_file': ${thomp_mp_climo_file}, } " # @@ -614,7 +635,7 @@ mv_vrfy out.sfc.tile${TILE_RGNL}.nc \ mv_vrfy gfs_ctrl.nc ${ics_dir} -mv_vrfy gfs.bndy.nc ${ics_dir}/gfs_bndy.tile${TILE_RGNL}.000.nc +mv_vrfy gfs_bndy.nc ${ics_dir}/gfs_bndy.tile${TILE_RGNL}.000.nc # #----------------------------------------------------------------------- # diff --git a/scripts/exregional_make_lbcs.sh b/scripts/exregional_make_lbcs.sh index f5da9eb16..31b37a623 100755 --- a/scripts/exregional_make_lbcs.sh +++ b/scripts/exregional_make_lbcs.sh @@ -57,6 +57,7 @@ hour zero). # valid_args=( \ "lbcs_dir" \ +"wgrib2_dir" \ "APRUN" \ ) process_args valid_args "$@" @@ -94,31 +95,34 @@ cd_vrfy $workdir # #----------------------------------------------------------------------- # -# Set physics-suite-dependent variable mapping table needed in the FORTRAN -# namelist file that the chgres_cube executable will read in. +# Set physics-suite-dependent variables that are needed in the FORTRAN +# namelist file that the chgres executable will read in. # #----------------------------------------------------------------------- # -varmap_file="" +phys_suite="" case "${CCPP_PHYS_SUITE}" in -"FV3_GFS_2017_gfdlmp" | "FV3_GFS_2017_gfdlmp_regional" | "FV3_GFS_v16beta" | \ +"FV3_GFS_2017_gfdlmp" | "FV3_GFS_2017_gfdlmp_regional") + phys_suite="GFS" + ;; +"FV3_GSD_v0" | "FV3_GSD_SAR" | "FV3_GSD_SAR_v1" | "FV3_RRFS_v0" | "FV3_RRFS_v1beta" ) + phys_suite="GSD" + ;; +"FV3_CPT_v0" ) + phys_suite="CPT" + ;; "FV3_GFS_v15p2" ) - varmap_file="GFSphys_var_map.txt" + phys_suite="v15p2" ;; -"FV3_GSD_v0" | "FV3_GSD_SAR" | "FV3_GSD_SAR_v1" | "FV3_RRFS_v0" | \ -"FV3_RRFS_v1beta" ) - if [ "${EXTRN_MDL_NAME_LBCS}" = "RAPX" ] || [ "${EXTRN_MDL_NAME_LBCS}" = "HRRRX" ]; then - varmap_file="GSDphys_var_map.txt" - elif [ "${EXTRN_MDL_NAME_LBCS}" = "NAM" ] || [ "${EXTRN_MDL_NAME_LBCS}" = "FV3GFS" ] || \ - [ "${EXTRN_MDL_NAME_LBCS}" = "GSMGFS" ]; then - varmap_file="GFSphys_var_map.txt" - fi +"FV3_GFS_v16beta" ) + phys_suite="v16beta" ;; *) print_err_msg_exit "\ -A variable mapping table has not yet been defined for this physics suite: +Physics-suite-dependent namelist variables have not yet been specified +for this physics suite: CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\"" ;; @@ -127,7 +131,7 @@ esac #----------------------------------------------------------------------- # # Set external-model-dependent variables that are needed in the FORTRAN -# namelist file that the chgres_cube executable will read in. These are de- +# namelist file that the chgres executable will read in. These are de- # scribed below. Note that for a given external model, usually only a # subset of these all variables are set (since some may be irrelevant). # @@ -135,19 +139,15 @@ esac # Name of the external model from which we are obtaining the fields # needed to generate the LBCs. # -# fn_atm_nemsio: -# Name (not including path) of the nemsio file generated by the external -# model that contains the atmospheric fields. -# # fn_sfc_nemsio: # Name (not including path) of the nemsio file generated by the external # model that contains the surface fields. # # input_type: -# The "type" of input being provided to chgres_cube. This contains a combi- +# The "type" of input being provided to chgres. This contains a combi- # nation of information on the external model, external model file for- # mat, and maybe other parameters. For clarity, it would be best to -# eliminate this variable in chgres_cube and replace with with 2 or 3 others +# eliminate this variable in chgres and replace with with 2 or 3 others # (e.g. extrn_mdl, extrn_mdl_file_format, etc). # # tracers_input: @@ -163,12 +163,30 @@ esac # ment of tracers should be the name to use for the O3 mixing ratio in # the output file. For GSD physics, three additional tracers -- ice, # rain, and water number concentrations -- may be specified at the end -# of tracers, and these will be calculated by chgres_cube. +# of tracers, and these will be calculated by chgres. +# +# numsoil_out: +# The number of soil layers to include in the output NetCDF file. +# +# replace_FIELD, where FIELD="vgtyp", "sotyp", or "vgfrc": +# Logical variable indicating whether or not to obtain the field in +# question from climatology instead of the external model. The field in +# question is one of vegetation type (FIELD="vgtyp"), soil type (FIELD= +# "sotyp"), and vegetation fraction (FIELD="vgfrc"). If replace_FIELD +# is set to ".true.", then the field is obtained from climatology (re- +# gardless of whether or not it exists in an external model file). If +# it is set to ".false.", then the field is obtained from the external +# model. If the external model file does not provide this field, then +# chgres prints out an error message and stops. +# +# tg3_from_soil: +# Logical variable indicating whether or not to set the tg3 soil tempe- # Needs to be verified. +# rature field to the temperature of the deepest soil layer. # #----------------------------------------------------------------------- # -# GSK comments about chgres_cube: +# GSK comments about chgres: # # The following are the three atmsopheric tracers that are in the atmo- # spheric analysis (atmanl) nemsio file for CDATE=2017100700: @@ -217,7 +235,13 @@ fn_grib2="" input_type="" tracers_input="\"\"" tracers="\"\"" -thomp_mp_climo_file="" +numsoil_out="" +geogrid_file_input_grid="\"\"" +replace_vgtyp="" +replace_sotyp="" +replace_vgfrc="" +tg3_from_soil="" + case "${EXTRN_MDL_NAME_LBCS}" in @@ -226,114 +250,122 @@ case "${EXTRN_MDL_NAME_LBCS}" in external_model="GSMGFS" - input_type="gfs_gaussian_nemsio" # For spectral GFS Gaussian grid in nemsio format. + input_type="gfs_gaussian" # For spectral GFS Gaussian grid in nemsio format. tracers_input="[\"spfh\",\"clwmr\",\"o3mr\"]" tracers="[\"sphum\",\"liq_wat\",\"o3mr\"]" -# -# Use Thompson climatology for ice- and water-friendly aerosols if CCPP suite uses Thompson MP -# - if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then - thomp_mp_climo_file="" - elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then - thomp_mp_climo_file="${FIXam}/Thompson_MP_MONTHLY_CLIMO.nc" - else - print_err_msg_exit "\ - The chosen CCPP physics suite is unsupported at this time: - CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\"" - fi + numsoil_out="4" + replace_vgtyp=".true." + replace_sotyp=".true." + replace_vgfrc=".true." + tg3_from_soil=".false." ;; "FV3GFS") -# -# Use Thompson climatology for ice- and water-friendly aerosols if CCPP suite uses Thompson MP -# - if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then - thomp_mp_climo_file="" - elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then - thomp_mp_climo_file="${FIXam}/Thompson_MP_MONTHLY_CLIMO.nc" - else - print_err_msg_exit "\ - The chosen CCPP physics suite is unsupported at this time: - CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\"" - fi - if [ "${FV3GFS_FILE_FMT_LBCS}" = "nemsio" ]; then external_model="FV3GFS" - input_type="gaussian_nemsio" # For FV3-GFS Gaussian grid in nemsio format. + input_type="gaussian" # For FV3-GFS Gaussian grid in nemsio format. tracers_input="[\"spfh\",\"clwmr\",\"o3mr\",\"icmr\",\"rwmr\",\"snmr\",\"grle\"]" - tracers="[\"sphum\",\"liq_wat\",\"o3mr\",\"ice_wat\",\"rainwat\",\"snowwat\",\"graupel\"]" +# +# If CCPP is being used, then the list of atmospheric tracers to include +# in the output file depends on the physics suite. Hopefully, this me- +# thod of specifying output tracers will be replaced with a variable +# table (which should be specific to each combination of external model, +# external model file type, and physics suite). +# + if [ "${USE_CCPP}" = "TRUE" ]; then + if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then + tracers="[\"sphum\",\"liq_wat\",\"o3mr\",\"ice_wat\",\"rainwat\",\"snowwat\",\"graupel\"]" + elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then +# For GSD physics, add three additional tracers (the ice, rain and water +# number concentrations) that are required for Thompson microphysics. + tracers="[\"sphum\",\"liq_wat\",\"o3mr\",\"ice_wat\",\"rainwat\",\"snowwat\",\"graupel\",\"ice_nc\",\"rain_nc\",\"water_nc\"]" + else + print_err_msg_exit "\ +The parameter \"tracers\" has not been defined for this combination of +external model (EXTRN_MDL_NAME_LBCS), physics suite (CCPP_PHYS_SUITE), +and FV3GFS file type (FV3GFS_FILE_FMT_LBCS): + EXTRN_MDL_NAME_LBCS = \"${EXTRN_MDL_NAME_LBCS}\" + CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\" + FV3GFS_FILE_FMT_LBCS = \"${FV3GFS_FILE_FMT_LBCS}\"" + fi +# +# If CCPP is not being used, the only physics suite that can be used is +# GFS. +# + else + tracers="[\"sphum\",\"liq_wat\",\"o3mr\",\"ice_wat\",\"rainwat\",\"snowwat\",\"graupel\"]" + fi elif [ "${FV3GFS_FILE_FMT_LBCS}" = "grib2" ]; then external_model="GFS" - fn_grib2="${EXTRN_MDL_FNS[0]}" input_type="grib2" + fn_grib2="${EXTRN_MDL_FNS[0]}" fi + numsoil_out="4" + replace_vgtyp=".true." + replace_sotyp=".true." + replace_vgfrc=".true." + tg3_from_soil=".false." + ;; "RAPX") external_model="RAP" - input_type="grib2" - ;; - - -"NAM") - - external_model="NAM" input_type="grib2" -# -# Use Thompson climatology for ice- and water-friendly aerosols if CCPP suite uses Thompson MP -# - if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then - thomp_mp_climo_file="" - elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ + + if [ "${USE_CCPP}" = "TRUE" ]; then + if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then - thomp_mp_climo_file="${FIXam}/Thompson_MP_MONTHLY_CLIMO.nc" - else - print_err_msg_exit "\ - The chosen CCPP physics suite is unsupported at this time: - CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\"" + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then + numsoil_out="4" + elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ + [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then + numsoil_out="9" + else + print_err_msg_exit "\ +The parameter \"numsoil_out\" has not been defined for this combination +of external model (EXTRN_MDL_NAME_LBCS) and physics suite (CCPP_PHYS_SUITE): + EXTRN_MDL_NAME_LBCS = \"${EXTRN_MDL_NAME_LBCS}\" + CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\"" + fi fi + replace_vgtyp=".false." + replace_sotyp=".false." + replace_vgfrc=".false." + tg3_from_soil=".true." + ;; + *) print_err_msg_exit "\ External-model-dependent namelist variables have not yet been specified @@ -362,7 +394,7 @@ fi # #----------------------------------------------------------------------- # -# Loop through the LBC update times and run chgres_cube for each such time to +# Loop through the LBC update times and run chgres for each such time to # obtain an LBC file for each that can be used as input to the FV3-LAM. # #----------------------------------------------------------------------- @@ -375,7 +407,7 @@ for (( i=0; i<${num_fhrs}; i++ )); do fhr="${EXTRN_MDL_LBC_SPEC_FHRS[$i]}" # # Set external model output file name and file type/format. Note that -# these are now inputs into chgres_cube. +# these are now inputs into chgres. # fn_atm_nemsio="" fn_grib2="" @@ -392,17 +424,11 @@ for (( i=0; i<${num_fhrs}; i++ )); do fi ;; "RAPX") - fn_grib2="${EXTRN_MDL_FNS[$i]}" - ;; - "HRRRX") - fn_grib2="${EXTRN_MDL_FNS[$i]}" - ;; - "NAM") fn_grib2="${EXTRN_MDL_FNS[$i]}" ;; *) print_err_msg_exit "\ -The external model output file name to use in the chgres_cube FORTRAN name- +The external model output file name to use in the chgres FORTRAN name- list file has not specified for this external model: EXTRN_MDL_NAME_LBCS = \"${EXTRN_MDL_NAME_LBCS}\"" ;; @@ -428,6 +454,9 @@ list file has not specified for this external model: # # Build the FORTRAN namelist file that chgres_cube will read in. # +# QUESTION: +# Do numsoil_out, ..., tg3_from_soil need to be in this namelist (as +# they are for the ICs namelist)? # # Create a multiline variable that consists of a yaml-compliant string @@ -436,32 +465,35 @@ list file has not specified for this external model: # this variable will be passed to a python script that will create the # namelist file. # -settings=" + settings=" 'config': { - 'fix_dir_input_grid': ${UFS_UTILS_DIR}/fix/fix_chgres, 'fix_dir_target_grid': ${FIXLAM}, - 'mosaic_file_target_grid': ${FIXLAM}/${CRES}${DOT_OR_USCORE}mosaic.halo$((10#${NH4})).nc, + 'mosaic_file_target_grid': ${FIXLAM}/${CRES}${DOT_OR_USCORE}mosaic.halo${NH4}.nc, 'orog_dir_target_grid': ${FIXLAM}, - 'orog_files_target_grid': ${CRES}${DOT_OR_USCORE}oro_data.tile${TILE_RGNL}.halo$((10#${NH4})).nc, + 'orog_files_target_grid': ${CRES}${DOT_OR_USCORE}oro_data.tile7.halo${NH4}.nc, 'vcoord_file_target_grid': ${FIXam}/global_hyblev.l65.txt, - 'varmap_file': ${UFS_UTILS_DIR}/parm/varmap_tables/${varmap_file}, + 'mosaic_file_input_grid': '', + 'orog_dir_input_grid': '', + 'base_install_dir': ${CHGRES_DIR}, + 'wgrib2_path': ${wgrib2_dir}, 'data_dir_input_grid': ${extrn_mdl_staging_dir}, 'atm_files_input_grid': ${fn_atm_nemsio}, 'sfc_files_input_grid': ${fn_sfc_nemsio}, 'grib2_file_input_grid': \"${fn_grib2}\", - 'cycle_mon': $((10#${mm})), - 'cycle_day': $((10#${dd})), - 'cycle_hour': $((10#${hh})), + 'cycle_mon': $((10#$mm)), + 'cycle_day': $((10#$dd)), + 'cycle_hour': $((10#$hh)), 'convert_atm': True, + 'convert_sfc': False, + 'convert_nst': False, 'regional': 2, - 'halo_bndy': $((10#${NH4})), - 'halo_blend': $((10#${HALO_BLEND})), + 'halo_bndy': ${NH4}, 'input_type': ${input_type}, 'external_model': ${external_model}, 'tracers_input': ${tracers_input}, 'tracers': ${tracers}, - 'thomp_mp_climo_file': ${thomp_mp_climo_file}, -} + 'phys_suite': ${phys_suite}, + } " # # Call the python script to create the namelist file. @@ -510,7 +542,7 @@ located in the following directory: # that of the external model since their start times may be offset). # fcst_hhh_FV3LAM=$( printf "%03d" "${LBC_SPEC_FCST_HRS[$i]}" ) - mv_vrfy gfs.bndy.nc ${lbcs_dir}/gfs_bndy.tile7.${fcst_hhh_FV3LAM}.nc + mv_vrfy gfs_bndy.nc ${lbcs_dir}/gfs_bndy.tile7.${fcst_hhh_FV3LAM}.nc done # diff --git a/sorc/global_equiv_resol.fd/Makefile_cheyenne b/sorc/global_equiv_resol.fd/Makefile_cheyenne new file mode 100644 index 000000000..456bb3fed --- /dev/null +++ b/sorc/global_equiv_resol.fd/Makefile_cheyenne @@ -0,0 +1,29 @@ +SHELL := bash + +MAKEFLAGS += --warn-undefined-variables + +INC = -I${NETCDF}/include + +LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ + ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a ${NETCDF}/lib/libsz.a -lz + +FC = ifort +FFLAGS = -g -O2 $(INC) + +EXEC = global_equiv_resol + +.PHONY: all +all : $(EXEC) + +$(EXEC): global_equiv_resol.o $(LIBS) + $(FC) $(FFLAGS) -o $@ $^ + +.SUFFIXES: +.SUFFIXES: .f90 .o + +.f90.o: + $(FC) $(FFLAGS) -c $< + +.PHONY: clean +clean: + rm -f *.o *.mod $(EXEC) diff --git a/sorc/global_equiv_resol.fd/Makefile_hera b/sorc/global_equiv_resol.fd/Makefile_hera new file mode 100644 index 000000000..c1f884090 --- /dev/null +++ b/sorc/global_equiv_resol.fd/Makefile_hera @@ -0,0 +1,29 @@ +SHELL := bash + +MAKEFLAGS += --warn-undefined-variables + +INC = -I${NETCDF}/include + +LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ + ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a /apps/szip/2.1/lib/libsz.a -lz + +FC = ifort +FFLAGS = -g -O2 $(INC) + +EXEC = global_equiv_resol + +.PHONY: all +all : $(EXEC) + +$(EXEC): global_equiv_resol.o $(LIBS) + $(FC) $(FFLAGS) -o $@ $^ + +.SUFFIXES: +.SUFFIXES: .f90 .o + +.f90.o: + $(FC) $(FFLAGS) -c $< + +.PHONY: clean +clean: + rm -f *.o *.mod $(EXEC) diff --git a/sorc/global_equiv_resol.fd/Makefile_jet b/sorc/global_equiv_resol.fd/Makefile_jet new file mode 100644 index 000000000..c1f884090 --- /dev/null +++ b/sorc/global_equiv_resol.fd/Makefile_jet @@ -0,0 +1,29 @@ +SHELL := bash + +MAKEFLAGS += --warn-undefined-variables + +INC = -I${NETCDF}/include + +LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ + ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a /apps/szip/2.1/lib/libsz.a -lz + +FC = ifort +FFLAGS = -g -O2 $(INC) + +EXEC = global_equiv_resol + +.PHONY: all +all : $(EXEC) + +$(EXEC): global_equiv_resol.o $(LIBS) + $(FC) $(FFLAGS) -o $@ $^ + +.SUFFIXES: +.SUFFIXES: .f90 .o + +.f90.o: + $(FC) $(FFLAGS) -c $< + +.PHONY: clean +clean: + rm -f *.o *.mod $(EXEC) diff --git a/sorc/global_equiv_resol.fd/Makefile_odin b/sorc/global_equiv_resol.fd/Makefile_odin new file mode 100644 index 000000000..9a6073837 --- /dev/null +++ b/sorc/global_equiv_resol.fd/Makefile_odin @@ -0,0 +1,29 @@ +SHELL := bash + +MAKEFLAGS += --warn-undefined-variables + +INC = -I${NETCDF}/include + +LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ + ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a -lz + +FC = ftn +FFLAGS = -g -O2 $(INC) + +EXEC = global_equiv_resol + +.PHONY: all +all : $(EXEC) + +$(EXEC): global_equiv_resol.o + $(FC) $(FFLAGS) -o $@ $^ $(LIBS) + +.SUFFIXES: +.SUFFIXES: .f90 .o + +.f90.o: + $(FC) $(FFLAGS) -c $< + +.PHONY: clean +clean: + rm -f *.o *.mod $(EXEC) diff --git a/sorc/global_equiv_resol.fd/Makefile_stampede b/sorc/global_equiv_resol.fd/Makefile_stampede new file mode 100644 index 000000000..ee9355051 --- /dev/null +++ b/sorc/global_equiv_resol.fd/Makefile_stampede @@ -0,0 +1,29 @@ +SHELL := bash + +MAKEFLAGS += --warn-undefined-variables + +INC = -I${NETCDF}/include + +LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ + ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a ${HDF5}/lib/libsz.a -lz + +FC = mpiifort +FFLAGS = -g -O2 $(INC) + +EXEC = global_equiv_resol + +.PHONY: all +all : $(EXEC) + +$(EXEC): global_equiv_resol.o + $(FC) $(FFLAGS) -o $@ $^ $(LIBS) + +.SUFFIXES: +.SUFFIXES: .f90 .o + +.f90.o: + $(FC) $(FFLAGS) -c $< + +.PHONY: clean +clean: + rm -f *.o *.mod $(EXEC) diff --git a/sorc/global_equiv_resol.fd/Makefile_theia b/sorc/global_equiv_resol.fd/Makefile_theia new file mode 100644 index 000000000..c1f884090 --- /dev/null +++ b/sorc/global_equiv_resol.fd/Makefile_theia @@ -0,0 +1,29 @@ +SHELL := bash + +MAKEFLAGS += --warn-undefined-variables + +INC = -I${NETCDF}/include + +LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ + ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a /apps/szip/2.1/lib/libsz.a -lz + +FC = ifort +FFLAGS = -g -O2 $(INC) + +EXEC = global_equiv_resol + +.PHONY: all +all : $(EXEC) + +$(EXEC): global_equiv_resol.o $(LIBS) + $(FC) $(FFLAGS) -o $@ $^ + +.SUFFIXES: +.SUFFIXES: .f90 .o + +.f90.o: + $(FC) $(FFLAGS) -c $< + +.PHONY: clean +clean: + rm -f *.o *.mod $(EXEC) diff --git a/sorc/global_equiv_resol.fd/compile.sh b/sorc/global_equiv_resol.fd/compile.sh new file mode 100755 index 000000000..7edd72c3b --- /dev/null +++ b/sorc/global_equiv_resol.fd/compile.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +module purge +module load intel/18.1.163 +module load netcdf/4.6.1 +module load hdf5/1.10.4 +module list + +make diff --git a/sorc/global_equiv_resol.fd/global_equiv_resol.f90 b/sorc/global_equiv_resol.fd/global_equiv_resol.f90 new file mode 100644 index 000000000..7bd9c813f --- /dev/null +++ b/sorc/global_equiv_resol.fd/global_equiv_resol.f90 @@ -0,0 +1,185 @@ +!======================================================================= +program global_equiv_resol +!======================================================================= + + use netcdf + + implicit none + + integer, parameter :: dp = kind(1.0d0) + real(dp), parameter :: pi_geom = 4.0*atan(1.0), & + radius_Earth = 6371000.0 + + character(len=256) :: grid_fn + integer :: ncid, nxSG_dimid, nySG_dimid, dASG_varid, num_args + integer :: nxSG, nySG, nx, ny, RES_equiv + real(dp) :: avg_cell_size, min_cell_size, max_cell_size + real(dp), dimension(:,:), allocatable :: & + quarter_dA_ll, quarter_dA_lr, quarter_dA_ur, quarter_dA_ul, & + dASG, dA, sqrt_dA +! +!======================================================================= +! +! Read in the name of the file from the command line. The command-line +! call to this program should have exactly one argument consisting of +! the path to the NetCDF grid specification file to be read in. If this +! is not the case, print out a usage message and exit. +! +!======================================================================= +! + num_args = command_argument_count() + if (num_args == 1) then + call get_command_argument(1, grid_fn) + else + WRITE(*,500) + WRITE(*,500) "Exactly one argument must be specified to program global_equiv_resol." + WRITE(*,500) "Usage:" + WRITE(*,500) + WRITE(*,500) " global_equiv_resol path_to_grid_file" + WRITE(*,500) + WRITE(*,500) "where path_to_grid_file is the path to the NetCDF grid file. Actual " + WRITE(*,500) "number of specified command line arguments is:" + WRITE(*,510) " num_args = ", num_args + WRITE(*,500) "Stopping." +500 FORMAT(A) +510 FORMAT(A, I3) + STOP + end if +! +!======================================================================= +! +! Open the grid file and read in the dimensions of the supergrid. The +! supergrid is a grid that has twice the resolution of the actual/compu- +! tational grid. In the file, the names of the supergrid dimensions are +! nx and ny. Here, however, we reserve those names for the dimensions +! of the actual grid (since in the FV3 code and in other data files, nx +! and ny are used to denote the dimensions of the actual grid) and in- +! stead use the variables nxSG and nySG to denote the dimensions of the +! supergrid. +! +!======================================================================= +! + WRITE(*,500) + WRITE(*,500) "Opening NetCDF grid file for reading/writing:" + WRITE(*,500) " grid_fn = " // trim(grid_fn) + + call check( nf90_open(trim(grid_fn), NF90_WRITE, ncid) ) + + call check( nf90_inq_dimid(ncid, "nx", nxSG_dimid) ) + call check( nf90_inquire_dimension(ncid, nxSG_dimid, len=nxSG) ) + + call check( nf90_inq_dimid(ncid, "ny", nySG_dimid) ) + call check( nf90_inquire_dimension(ncid, nySG_dimid, len=nySG) ) + + WRITE(*,500) + WRITE(*,500) "Dimensions of supergrid are:" + WRITE(*,520) " nxSG = ", nxSG + WRITE(*,520) " nySG = ", nySG +520 FORMAT(A, I7) +! +!======================================================================= +! +! Read in the cell areas on the supergrid. Then add the areas of the +! four supergrid cells that make up one grid cell to obtain the cell +! areas on the actual grid. +! +!======================================================================= +! + allocate(dASG(0:nxSG-1, 0:nySG-1)) + call check( nf90_inq_varid(ncid, "area", dASG_varid) ) + call check( nf90_get_var(ncid, dASG_varid, dASG) ) + + nx = nxSG/2 + ny = nySG/2 + + WRITE(*,500) + WRITE(*,500) "Dimensions of (actual, i.e. computational) grid are:" + WRITE(*,520) " nx = ", nx + WRITE(*,520) " ny = ", ny + + allocate(quarter_dA_ll(0:nx-1, 0:ny-1)) + allocate(quarter_dA_lr(0:nx-1, 0:ny-1)) + allocate(quarter_dA_ul(0:nx-1, 0:ny-1)) + allocate(quarter_dA_ur(0:nx-1, 0:ny-1)) + + quarter_dA_ll = dASG(0:nxSG-1:2, 0:nySG-1:2) + quarter_dA_lr = dASG(0:nxSG-1:2, 1:nySG-1:2) + quarter_dA_ur = dASG(1:nxSG-1:2, 1:nySG-1:2) + quarter_dA_ul = dASG(1:nxSG-1:2, 0:nySG-1:2) + + allocate(dA(0:nx-1, 0:ny-1)) + allocate(sqrt_dA(0:nx-1, 0:ny-1)) + + dA = quarter_dA_ll + quarter_dA_lr + quarter_dA_ur + quarter_dA_ul +! +!======================================================================= +! +! Calculate a typical/representative cell size for each cell by taking +! the square root of the area of the cell. Then calculate the minimum, +! maximum, and average cell sizes over the whole grid. +! +!======================================================================= +! + sqrt_dA = sqrt(dA) + min_cell_size = minval(sqrt_dA) + max_cell_size = maxval(sqrt_dA) + avg_cell_size = sum(sqrt_dA)/(nx*ny) + + WRITE(*,500) + WRITE(*,500) "Minimum, maximum, and average cell sizes are (based on square" + WRITE(*,500) "root of cell area):" + WRITE(*,530) " min_cell_size = ", min_cell_size + WRITE(*,530) " max_cell_size = ", max_cell_size + WRITE(*,530) " avg_cell_size = ", avg_cell_size +530 FORMAT(A, G) +! +!======================================================================= +! +! Use the average cell size to calculate an equivalent global uniform +! cubed-sphere resolution (in units of number of cells) for the regional +! grid. This is the RES that a global uniform (i.e. stretch factor of +! 1) cubed-sphere grid would need to have in order to have the same no- +! minal cell size as the average cell size of the regional grid. +! +!======================================================================= +! + RES_equiv = nint( (2.0*pi_geom*radius_Earth)/(4.0*avg_cell_size) ) + + WRITE(*,500) + WRITE(*,500) "Equivalent global uniform cubed-sphere resolution is:" + WRITE(*,530) " RES_equiv = ", RES_equiv +! +!======================================================================= +! +! Write the average cell size and equivalent global resolution to the +! grid file as a global attributes. +! +!======================================================================= +! + WRITE(*,500) + WRITE(*,500) "Writing avg_cell_size and RES_equiv to the grid specification" + WRITE(*,500) "file as global attributes..." + + call check( nf90_redef(ncid) ) + call check( nf90_put_att(ncid, NF90_GLOBAL, "avg_cell_size", avg_cell_size) ) + call check( nf90_put_att(ncid, NF90_GLOBAL, "RES_equiv", RES_equiv) ) + call check( nf90_enddef(ncid) ) + + call check( nf90_close(ncid) ) + + WRITE(*,500) + WRITE(*,500) "Done." + +end program global_equiv_resol + + +subroutine check(status) + use netcdf + integer,intent(in) :: status +! + if(status /= nf90_noerr) then + write(0,*) ' check netcdf status = ', status + write(0,'("error ", a)') trim(nf90_strerror(status)) + stop "Stopped" + endif +end subroutine check diff --git a/sorc/mosaic_file.fd/Makefile_cheyenne b/sorc/mosaic_file.fd/Makefile_cheyenne new file mode 100644 index 000000000..b7d132ffc --- /dev/null +++ b/sorc/mosaic_file.fd/Makefile_cheyenne @@ -0,0 +1,29 @@ +SHELL := bash + +MAKEFLAGS += --warn-undefined-variables + +INC = -I${NETCDF}/include + +LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ + ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a ${NETCDF}/lib/libsz.a -lz + +FC = ifort +FFLAGS = -g -O2 $(INC) + +EXEC = mosaic_file + +.PHONY: all +all : $(EXEC) + +$(EXEC): mosaic_file.o $(LIBS) + $(FC) $(FFLAGS) -o $@ $^ + +.SUFFIXES: +.SUFFIXES: .f90 .o + +.f90.o: + $(FC) $(FFLAGS) -c $< + +.PHONY: clean +clean: + rm -f *.o *.mod $(EXEC) diff --git a/sorc/mosaic_file.fd/Makefile_hera b/sorc/mosaic_file.fd/Makefile_hera new file mode 100644 index 000000000..9a405799c --- /dev/null +++ b/sorc/mosaic_file.fd/Makefile_hera @@ -0,0 +1,29 @@ +SHELL := bash + +MAKEFLAGS += --warn-undefined-variables + +INC = -I${NETCDF}/include + +LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ + ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a /apps/szip/2.1/lib/libsz.a -lz + +FC = ifort +FFLAGS = -g -O2 $(INC) + +EXEC = mosaic_file + +.PHONY: all +all : $(EXEC) + +$(EXEC): mosaic_file.o $(LIBS) + $(FC) $(FFLAGS) -o $@ $^ + +.SUFFIXES: +.SUFFIXES: .f90 .o + +.f90.o: + $(FC) $(FFLAGS) -c $< + +.PHONY: clean +clean: + rm -f *.o *.mod $(EXEC) diff --git a/sorc/mosaic_file.fd/Makefile_jet b/sorc/mosaic_file.fd/Makefile_jet new file mode 100644 index 000000000..9a405799c --- /dev/null +++ b/sorc/mosaic_file.fd/Makefile_jet @@ -0,0 +1,29 @@ +SHELL := bash + +MAKEFLAGS += --warn-undefined-variables + +INC = -I${NETCDF}/include + +LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ + ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a /apps/szip/2.1/lib/libsz.a -lz + +FC = ifort +FFLAGS = -g -O2 $(INC) + +EXEC = mosaic_file + +.PHONY: all +all : $(EXEC) + +$(EXEC): mosaic_file.o $(LIBS) + $(FC) $(FFLAGS) -o $@ $^ + +.SUFFIXES: +.SUFFIXES: .f90 .o + +.f90.o: + $(FC) $(FFLAGS) -c $< + +.PHONY: clean +clean: + rm -f *.o *.mod $(EXEC) diff --git a/sorc/mosaic_file.fd/Makefile_odin b/sorc/mosaic_file.fd/Makefile_odin new file mode 100644 index 000000000..97c191a3b --- /dev/null +++ b/sorc/mosaic_file.fd/Makefile_odin @@ -0,0 +1,29 @@ +SHELL := bash + +MAKEFLAGS += --warn-undefined-variables + +INC = -I${NETCDF}/include + +LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ + ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a -lz + +FC = ftn +FFLAGS = -g -O2 $(INC) + +EXEC = mosaic_file + +.PHONY: all +all : $(EXEC) + +$(EXEC): mosaic_file.o + $(FC) $(FFLAGS) -o $@ $^ $(LIBS) + +.SUFFIXES: +.SUFFIXES: .f90 .o + +.f90.o: + $(FC) $(FFLAGS) -c $< + +.PHONY: clean +clean: + rm -f *.o *.mod $(EXEC) diff --git a/sorc/mosaic_file.fd/Makefile_stampede b/sorc/mosaic_file.fd/Makefile_stampede new file mode 100644 index 000000000..8a3b1a83a --- /dev/null +++ b/sorc/mosaic_file.fd/Makefile_stampede @@ -0,0 +1,29 @@ +SHELL := bash + +MAKEFLAGS += --warn-undefined-variables + +INC = -I${NETCDF}/include + +LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ + ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a ${HDF5}/lib/libsz.a -lz + +FC = mpiifort +FFLAGS = -g -O2 $(INC) + +EXEC = mosaic_file + +.PHONY: all +all : $(EXEC) + +$(EXEC): mosaic_file.o + $(FC) $(FFLAGS) -o $@ $^ $(LIBS) + +.SUFFIXES: +.SUFFIXES: .f90 .o + +.f90.o: + $(FC) $(FFLAGS) -c $< + +.PHONY: clean +clean: + rm -f *.o *.mod $(EXEC) diff --git a/sorc/mosaic_file.fd/Makefile_theia b/sorc/mosaic_file.fd/Makefile_theia new file mode 100644 index 000000000..9a405799c --- /dev/null +++ b/sorc/mosaic_file.fd/Makefile_theia @@ -0,0 +1,29 @@ +SHELL := bash + +MAKEFLAGS += --warn-undefined-variables + +INC = -I${NETCDF}/include + +LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ + ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a /apps/szip/2.1/lib/libsz.a -lz + +FC = ifort +FFLAGS = -g -O2 $(INC) + +EXEC = mosaic_file + +.PHONY: all +all : $(EXEC) + +$(EXEC): mosaic_file.o $(LIBS) + $(FC) $(FFLAGS) -o $@ $^ + +.SUFFIXES: +.SUFFIXES: .f90 .o + +.f90.o: + $(FC) $(FFLAGS) -c $< + +.PHONY: clean +clean: + rm -f *.o *.mod $(EXEC) diff --git a/sorc/mosaic_file.fd/compile.sh b/sorc/mosaic_file.fd/compile.sh new file mode 100755 index 000000000..7edd72c3b --- /dev/null +++ b/sorc/mosaic_file.fd/compile.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +module purge +module load intel/18.1.163 +module load netcdf/4.6.1 +module load hdf5/1.10.4 +module list + +make diff --git a/sorc/mosaic_file.fd/mosaic_file.f90 b/sorc/mosaic_file.fd/mosaic_file.f90 new file mode 100644 index 000000000..7263e45bd --- /dev/null +++ b/sorc/mosaic_file.fd/mosaic_file.f90 @@ -0,0 +1,126 @@ +!======================================================================= +program mosaic_file +!======================================================================= + + use netcdf + + implicit none + + integer, parameter:: dp=kind(1.0d0) + + integer, parameter :: ntiles = 1 + integer, parameter :: string = 255 + + logical :: file_exists + integer :: num_args, i, ncid, & + ntiles_dimid, string_dimid, & + mosaic_varid, gridlocation_varid, & + gridfiles_varid, gridtiles_varid + integer, dimension(1) :: dimids1D + integer, dimension(2) :: dimids2D + integer, dimension(ntiles) :: tile_inds + character(len=string) :: mosaic_fn, mosaic, gridlocation, CRES, tmp_str +! +!======================================================================= +! +! Create the grid mosaic file that FV3 expects to be present in the IN- +! PUT subdirectory of the run directory. +! +!======================================================================= +! + num_args = command_argument_count() + if (num_args == 1) then + call get_command_argument(1, CRES) + else + WRITE(*,500) + WRITE(*,500) "Exactly one argument must be specified to program mosaic_file." + WRITE(*,500) "Usage:" + WRITE(*,500) + WRITE(*,500) " mosaic_file CRES" + WRITE(*,500) + WRITE(*,500) "where CRES is the cubed-sphere grid resolution that will" + WRITE(*,500) "be used to form the name of the grid specification file(s)" + WRITE(*,500) "stored in the variable gridfiles in the grid mosaic file." + WRITE(*,500) "Actual number of specified command line arguments is:" + WRITE(*,510) " num_args = ", num_args + WRITE(*,500) "Stopping." +500 FORMAT(A) +510 FORMAT(A, I3) + STOP + end if +! +!======================================================================= +! +! Create the grid mosaic file that FV3 expects to be present in the IN- +! PUT subdirectory of the run directory. Then create dimensions, varia- +! bles, and attributes within it. +! +!======================================================================= +! + mosaic_fn = trim(CRES) // "_mosaic.nc" + + call check( nf90_create(mosaic_fn, NF90_64BIT_OFFSET, ncid) ) + call check( nf90_def_dim(ncid, "ntiles", ntiles, ntiles_dimid) ) + call check( nf90_def_dim(ncid, "string", string, string_dimid) ) + + dimids1D = (/ string_dimid /) + call check( nf90_def_var(ncid, "mosaic", NF90_CHAR, dimids1D, mosaic_varid) ) + call check( nf90_put_att(ncid, mosaic_varid, "standard_name", "grid_mosaic_spec") ) + call check( nf90_put_att(ncid, mosaic_varid, "children", "gridtiles")) + call check( nf90_put_att(ncid, mosaic_varid, "contact_regions", "contacts") ) + call check( nf90_put_att(ncid, mosaic_varid, "grid_descriptor", "") ) + + dimids1D = (/ string_dimid /) + call check( nf90_def_var(ncid, "gridlocation", NF90_CHAR, dimids1D, gridlocation_varid) ) + call check( nf90_put_att(ncid, gridlocation_varid, "standard_name", "grid_file_location") ) + + dimids2D = (/ string_dimid, ntiles_dimid /) + call check( nf90_def_var(ncid, "gridfiles", NF90_CHAR, dimids2D, gridfiles_varid) ) + call check( nf90_def_var(ncid, "gridtiles", NF90_CHAR, dimids2D, gridtiles_varid) ) + + call check( nf90_put_att(ncid, NF90_GLOBAL, "grid_version", "") ) + call check( nf90_put_att(ncid, NF90_GLOBAL, "code_version", "") ) + call check( nf90_put_att(ncid, NF90_GLOBAL, "history", "") ) + + call check( nf90_enddef(ncid) ) +! +!======================================================================= +! +! Assign values to variables in the grid mosaic file. The only one that +! seems to be read by the FV3 code (at least in regional mode) is the +! string variable "gridfiles" that contains the name of the grid speci- +! fication file. +! +!======================================================================= +! + mosaic = mosaic_fn + gridlocation = "/path/to/directory" + + call check( nf90_put_var(ncid, mosaic_varid, trim(mosaic)) ) + call check( nf90_put_var(ncid, gridlocation_varid, trim(gridlocation))) + + tile_inds(1) = 7 + do i=1, ntiles + write(tmp_str, 520) "tile", tile_inds(i) + call check( nf90_put_var(ncid, gridtiles_varid, trim(tmp_str), start=(/1,i/)) ) + tmp_str = trim(CRES) // "_grid." // trim(tmp_str) // ".nc" + call check( nf90_put_var(ncid, gridfiles_varid, trim(tmp_str), start=(/1,i/)) ) + end do +520 FORMAT(A, I1) +530 FORMAT(4A) + + call check( nf90_close(ncid) ) + +end program mosaic_file + + +subroutine check(status) + use netcdf + integer,intent(in) :: status +! + if(status /= nf90_noerr) then + write(0,*) ' check netcdf status = ', status + write(0,'("error ", a)') trim(nf90_strerror(status)) + stop "Stopped" + endif +end subroutine check diff --git a/sorc/regional_grid.fd/Makefile_cheyenne b/sorc/regional_grid.fd/Makefile_cheyenne new file mode 100644 index 000000000..95f68ca54 --- /dev/null +++ b/sorc/regional_grid.fd/Makefile_cheyenne @@ -0,0 +1,29 @@ +SHELL := bash + +MAKEFLAGS += --warn-undefined-variables + +INC = -I${NETCDF}/include + +LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ + ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a ${NETCDF}/lib/libsz.a -lz + +FC = ifort +FFLAGS = -g -O2 $(INC) + +REGIONAL_GRID = regional_grid + +.PHONY: all +all : $(REGIONAL_GRID) + +$(REGIONAL_GRID): pkind.o pietc.o pmat.o pmat4.o pmat5.o psym2.o gen_schmidt.o hgrid_ak.o regional_grid.o $(LIBS) + $(FC) $(FFLAGS) -o $@ $^ + +.SUFFIXES: +.SUFFIXES: .f90 .o + +.f90.o: + $(FC) $(FFLAGS) -c $< + +.PHONY: clean +clean: + rm -f *.o *.mod $(REGIONAL_GRID) diff --git a/sorc/regional_grid.fd/Makefile_hera b/sorc/regional_grid.fd/Makefile_hera new file mode 100644 index 000000000..cdcb21494 --- /dev/null +++ b/sorc/regional_grid.fd/Makefile_hera @@ -0,0 +1,29 @@ +SHELL := bash + +MAKEFLAGS += --warn-undefined-variables + +INC = -I${NETCDF}/include + +LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ + ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a /apps/szip/2.1/lib/libsz.a -lz + +FC = ifort +FFLAGS = -g -O2 $(INC) + +REGIONAL_GRID = regional_grid + +.PHONY: all +all : $(REGIONAL_GRID) + +$(REGIONAL_GRID): pkind.o pietc.o pmat.o pmat4.o pmat5.o psym2.o gen_schmidt.o hgrid_ak.o regional_grid.o $(LIBS) + $(FC) $(FFLAGS) -o $@ $^ + +.SUFFIXES: +.SUFFIXES: .f90 .o + +.f90.o: + $(FC) $(FFLAGS) -c $< + +.PHONY: clean +clean: + rm -f *.o *.mod $(REGIONAL_GRID) diff --git a/sorc/regional_grid.fd/Makefile_jet b/sorc/regional_grid.fd/Makefile_jet new file mode 100644 index 000000000..cdcb21494 --- /dev/null +++ b/sorc/regional_grid.fd/Makefile_jet @@ -0,0 +1,29 @@ +SHELL := bash + +MAKEFLAGS += --warn-undefined-variables + +INC = -I${NETCDF}/include + +LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ + ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a /apps/szip/2.1/lib/libsz.a -lz + +FC = ifort +FFLAGS = -g -O2 $(INC) + +REGIONAL_GRID = regional_grid + +.PHONY: all +all : $(REGIONAL_GRID) + +$(REGIONAL_GRID): pkind.o pietc.o pmat.o pmat4.o pmat5.o psym2.o gen_schmidt.o hgrid_ak.o regional_grid.o $(LIBS) + $(FC) $(FFLAGS) -o $@ $^ + +.SUFFIXES: +.SUFFIXES: .f90 .o + +.f90.o: + $(FC) $(FFLAGS) -c $< + +.PHONY: clean +clean: + rm -f *.o *.mod $(REGIONAL_GRID) diff --git a/sorc/regional_grid.fd/Makefile_odin b/sorc/regional_grid.fd/Makefile_odin new file mode 100644 index 000000000..5b143a753 --- /dev/null +++ b/sorc/regional_grid.fd/Makefile_odin @@ -0,0 +1,29 @@ +SHELL := bash + +MAKEFLAGS += --warn-undefined-variables + +INC = -I${NETCDF}/include + +LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ + ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a -lz + +FC = ftn +FFLAGS = -g -O2 $(INC) + +REGIONAL_GRID = regional_grid + +.PHONY: all +all : $(REGIONAL_GRID) + +$(REGIONAL_GRID): pkind.o pietc.o pmat.o pmat4.o pmat5.o psym2.o gen_schmidt.o hgrid_ak.o regional_grid.o + $(FC) $(FFLAGS) -o $@ $^ $(LIBS) + +.SUFFIXES: +.SUFFIXES: .f90 .o + +.f90.o: + $(FC) $(FFLAGS) -c $< + +.PHONY: clean +clean: + rm -f *.o *.mod $(REGIONAL_GRID) diff --git a/sorc/regional_grid.fd/Makefile_stampede b/sorc/regional_grid.fd/Makefile_stampede new file mode 100644 index 000000000..5f584611b --- /dev/null +++ b/sorc/regional_grid.fd/Makefile_stampede @@ -0,0 +1,29 @@ + + +MAKEFLAGS += --warn-undefined-variables + +INC = -I${NETCDF}/include + +LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ + ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a ${HDF5}/lib/libsz.a -lz + +FC = mpiifort +FFLAGS = -g -O2 $(INC) + +REGIONAL_GRID = regional_grid + +.PHONY: all +all : $(REGIONAL_GRID) + +$(REGIONAL_GRID): pkind.o pietc.o pmat.o pmat4.o pmat5.o psym2.o gen_schmidt.o hgrid_ak.o regional_grid.o + $(FC) $(FFLAGS) -o $@ $^ $(LIBS) + +.SUFFIXES: +.SUFFIXES: .f90 .o + +.f90.o: + $(FC) $(FFLAGS) -c $< + +.PHONY: clean +clean: + rm -f *.o *.mod $(REGIONAL_GRID) diff --git a/sorc/regional_grid.fd/Makefile_theia b/sorc/regional_grid.fd/Makefile_theia new file mode 100644 index 000000000..cdcb21494 --- /dev/null +++ b/sorc/regional_grid.fd/Makefile_theia @@ -0,0 +1,29 @@ +SHELL := bash + +MAKEFLAGS += --warn-undefined-variables + +INC = -I${NETCDF}/include + +LIBS = ${NETCDF}/lib/libnetcdff.a ${NETCDF}/lib/libnetcdf.a \ + ${HDF5}/lib/libhdf5_hl.a ${HDF5}/lib/libhdf5.a /apps/szip/2.1/lib/libsz.a -lz + +FC = ifort +FFLAGS = -g -O2 $(INC) + +REGIONAL_GRID = regional_grid + +.PHONY: all +all : $(REGIONAL_GRID) + +$(REGIONAL_GRID): pkind.o pietc.o pmat.o pmat4.o pmat5.o psym2.o gen_schmidt.o hgrid_ak.o regional_grid.o $(LIBS) + $(FC) $(FFLAGS) -o $@ $^ + +.SUFFIXES: +.SUFFIXES: .f90 .o + +.f90.o: + $(FC) $(FFLAGS) -c $< + +.PHONY: clean +clean: + rm -f *.o *.mod $(REGIONAL_GRID) diff --git a/sorc/regional_grid.fd/compile.sh b/sorc/regional_grid.fd/compile.sh new file mode 100755 index 000000000..f931fce87 --- /dev/null +++ b/sorc/regional_grid.fd/compile.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +module purge +module load intel/18.1.163 +module load netcdf/4.6.1 +module load hdf5/1.10.4 +module list + +make -f Makefile_theia diff --git a/sorc/regional_grid.fd/gen_schmidt.f90 b/sorc/regional_grid.fd/gen_schmidt.f90 new file mode 100644 index 000000000..68fd2b6e2 --- /dev/null +++ b/sorc/regional_grid.fd/gen_schmidt.f90 @@ -0,0 +1,477 @@ +!============================================================================= +subroutine get_qqt(nxh,nyh,ncor,j0xy,p,q) +!============================================================================= +! Assume the grid to be mirror-symmetric across both medians, so that the +! computation of the quality diagnostic, Q, need only involve the positive +! quadrant of the grid. The norm associated with the definition of Q is the +! Frobenius norm (Q is the grid-mean of the squared-Frobenius norm of the +! log of the Gram matrix of the given distribution of jacobian matrices.) +!============================================================================= +use pkind, only: dp +use pietc, only: u0,u1,o2 +use pmat4, only: outer_product +use psym2 +implicit none +integer, intent(in ):: nxh,nyh,ncor +real(dp),dimension(3,2,0:nxh,0:nyh),intent(in ):: j0xy +real(dp),dimension(2,2), intent(inout):: p +real(dp), intent( out):: q +!----------------------------------------------------------------------------- +integer,parameter :: nit=5 +real(dp),parameter :: acrit=1.e-8,dpx=.0099 +real(dp),dimension(0:nxh,0:nyh) :: wxy +real(dp),dimension(3,2) :: j0,j +real(dp),dimension(2,2) :: el,pf,elp,elmean,g,ppx,pmx,ppy,pmy +real(dp),dimension(2) :: hess,grad +real(dp) :: anorm,q00,qpx,qmx,qpy,qmy,c,w +integer :: ix,iy,lx,ly,it +!============================================================================= +call get_wxy(nxh,nyh,ncor,wxy)! <- get 2D extended trapezoidal averaging wts +if(p(1,1)==u0)then; p=0; p(1,1)=u1; p(2,2)=u1; endif +! Iteratively calibrate preconditioner, p, to make elmean vanish: +anorm=1 +do it=1,nit + elmean=0 + q=0 + do iy=0,nyh; do ix=0,nxh + j0=j0xy(:,:,ix,iy); w=wxy(ix,iy) +! Precondition the Jacobian using latest iteration of P: + j=matmul(j0,p) +! Find the Gram matrix, G, implied by the column vectors of the new J: + g=matmul(transpose(j),j) +! Find the matrix logarithm, L = log(G), contrinutions to elmean and q: + call logsym2(g,el); el=el/2; elmean=elmean+w*el; q=q+w*sum(el**2) + enddo ; enddo + if(anormnit)then + print'("WARNING: In get_qqt, apparent failure of iteration to converge")' + read(*,*) +endif + +q00=q +ppx=p; ppx(1,1)=ppx(1,1)*(1+dpx);qpx=0 +pmx=p; pmx(1,1)=pmx(1,1)*(1-dpx);qmx=0 +ppy=p; ppy(2,2)=ppy(2,2)*(1+dpx);qpy=0 +pmy=p; pmy(2,2)=pmy(2,2)*(1-dpx);qmy=0 +do iy=0,nyh; do ix=0,nxh + j0=j0xy(:,:,ix,iy); w=wxy(ix,iy) + j=matmul(j0,ppx); g=matmul(transpose(j),j) + call logsym2(g,el); el=el/2; qpx=qpx+w*sum(el**2) + j=matmul(j0,pmx); g=matmul(transpose(j),j) + call logsym2(g,el); el=el/2; qmx=qmx+w*sum(el**2) + j=matmul(j0,ppy); g=matmul(transpose(j),j) + call logsym2(g,el); el=el/2; qpy=qpy+w*sum(el**2) + j=matmul(j0,pmy); g=matmul(transpose(j),j) + call logsym2(g,el); el=el/2; qmy=qmy+w*sum(el**2) +enddo; enddo +! Estimate a (diagonal) Hessian matrix and a gradient vector: +hess=(/ (qpx-2*q00+qmx)/dpx**2, (qpy-2*q00+qmy)/dpx**2 /) +grad=(/ (qpx-qmx)/(2*dpx) , (qpy-qmy)/(2*dpx) /) + +!!print'('' hessian components:'',t30,2(1x,e20.14))',hess !!!!!!! +!!print'('' grad components:'',t30,2(1x,e20.14))',grad !!!!!!! +! If the hessian is positive, polish the final p with a final Newton iteration: +if(hess(1)>0 .and. hess(2)>0.)then + c=u1-grad(1)/hess(1); p(:,1)=p(:,1)*c + c=u1-grad(2)/hess(2); p(:,2)=p(:,2)*c +endif + +! and calculate the new q. Keep it only if is numerically smaller than before: +q00=0 +do iy=0,nyh; do ix=0,nxh + j0=j0xy(:,:,ix,iy); w=wxy(ix,iy) + j=matmul(j0,p); g=matmul(transpose(j),j) + call logsym2(g,el); el=el/2; q00=q00+w*sum(el**2) +enddo; enddo +!!print'('' adjusted final q: '',e20.14)',q00 +if(q00nit)then + print'("WARNING: In get_qqt, apparent failure of iteration to converge")' + read(*,*) +endif + +q00=q +ppx=p; ppx(1,1)=ppx(1,1)*(1+dpx);qpx=0 +pmx=p; pmx(1,1)=pmx(1,1)*(1-dpx);qmx=0 +ppy=p; ppy(2,2)=ppy(2,2)*(1+dpx);qpy=0 +pmy=p; pmy(2,2)=pmy(2,2)*(1-dpx);qmy=0 +do iy=0,nyh; do ix=0,nxh + j0=j0xy(:,:,ix,iy); w=wxy(ix,iy) + j=matmul(j0,ppx); g=matmul(transpose(j),j) + call logsym2(g,el);el=el/2;qpx=qpx+w*(twc*sum(el**2)+tw*(el(1,1)+el(2,2))**2) + j=matmul(j0,pmx); g=matmul(transpose(j),j) + call logsym2(g,el);el=el/2;qmx=qmx+w*(twc*sum(el**2)+tw*(el(1,1)+el(2,2))**2) + j=matmul(j0,ppy); g=matmul(transpose(j),j) + call logsym2(g,el);el=el/2;qpy=qpy+w*(twc*sum(el**2)+tw*(el(1,1)+el(2,2))**2) + j=matmul(j0,pmy); g=matmul(transpose(j),j) + call logsym2(g,el);el=el/2;qmy=qmy+w*(twc*sum(el**2)+tw*(el(1,1)+el(2,2))**2) +enddo; enddo +! Estimate a (diagonal) Hessian matrix and a gradient vector: +hess=(/ (qpx-2*q00+qmx)/dpx**2, (qpy-2*q00+qmy)/dpx**2 /) +hess=(/8.,8./) +grad=(/ (qpx-qmx)/(2*dpx) , (qpy-qmy)/(2*dpx) /) +! If the hessian is positive, polish p with a final Newton iteration: +if(hess(1)>0 .and. hess(2)>0.)then + c=u1-grad(1)/hess(1); p(:,1)=p(:,1)*c + c=u1-grad(2)/hess(2); p(:,2)=p(:,2)*c +endif + +! and calculate the new q. Keep it only if it's numerically smaller than before: +q00=0 +do iy=0,nyh; do ix=0,nxh + j0=j0xy(:,:,ix,iy); w=wxy(ix,iy) + j=matmul(j0,p); g=matmul(transpose(j),j) + call logsym2(g,el);el=el/2;q00=q00+w*(twc*sum(el**2)+tw*(el(1,1)+el(2,2))**2) +enddo; enddo +if(q004)stop 'In get_wxy; ncor is out of bounds' +if(ncor>=min(nxh,nyh))stop 'In get_wxy; ncor is too large for this small grid' +! the wx and wy are the weight coefficients for an unnormalized +! extended trapezoidal integration. The end correction coefficients can +! be found by staggering, then summing, the Adams-Moulton coefficients +! at both ends. +wx=u1; wx(0)=o2; wx(nxh:nxh-ncor:-1)=cor +wy=u1; wy(0)=o2; wy(nyh:nyh-ncor:-1)=cor +wxy=outer_product(wx,wy); wxy=wxy/sum(wxy) +end subroutine get_wxy + +!============================================================================= +subroutine getedges(arcx,arcy,edgex,edgey) +!============================================================================= +! For angles (degrees) of the arcs spanning the halfwidths between the +! region's center and its x and y edges, get the two cartesian vectors +! that represent the locations of these edge midpoints in the positive x and y +! directions. +!============================================================================= +use pkind, only: dp +use pietc, only: u0,dtor +implicit none +real(dp), intent(in ):: arcx,arcy +real(dp),dimension(3),intent(out):: edgex,edgey +!------------------------------------------------------------------------------ +real(dp):: cx,sx,cy,sy +!============================================================================== +cx=cos(arcx*dtor); sx=sin(arcx*dtor) +cy=cos(arcy*dtor); sy=sin(arcy*dtor) +edgex=(/sx,u0,cx/); edgey=(/u0,sy,cy/) +end subroutine getedges + +!============================================================================== +subroutine xmtoxc_ak(a,kappa,xm,xc,xcd,ff) +!============================================================================== +! Assuming the A-kappa parameterization of the generalized schmidt-transformed +! gnomonic mapping, and given a map-space 2-vector, xm, find the corresponding +! cartesian unit 3-vector and its derivative wrt xm, jacobian matrix, xcd. +! If for any reason the mapping cannot be done, return a raised failure +! flag, FF. +!============================================================================= +use pkind, only: dp +use pietc, only: T,F +implicit none +real(dp), intent(in ):: a,kappa +real(dp),dimension(2), intent(in ):: xm +real(dp),dimension(3), intent(out):: xc +real(dp),dimension(3,2),intent(out):: xcd +logical, intent(out):: ff +!----------------------------------------------------------------------------- +real(dp),dimension(2,2):: xtd,xsd +real(dp),dimension(2) :: xt,xs +!============================================================================= +call xmtoxt(a,xm,xt,xtd,ff); if(ff)return +call xttoxs(kappa,xt,xs,xsd,ff); if(ff)return +xsd=matmul(xsd,xtd) +call xstoxc(xs,xc,xcd) +xcd=matmul(xcd,xsd) +end subroutine xmtoxc_ak + +!============================================================================= +subroutine xctoxm_ak(a,kappa,xc,xm,ff) +!============================================================================= +! Inverse mapping of xmtoxc_ak. That is, go from given cartesian unit 3-vector, +! xc, to map coordinate 2-vector xm (or return a raised failure flag, FF, if +! the attempt fails). +!============================================================================= +use pkind, only: dp +use pietc, only: F,T,u0,u1 +implicit none +real(dp), intent(in ):: a,kappa +real(dp),dimension(3),intent(in ):: xc +real(dp),dimension(2),intent(out):: xm +logical, intent(out):: ff +!----------------------------------------------------------------------------- +real(dp),dimension(2):: xs,xt +!============================================================================= +ff=F +call xctoxs(xc,xs) +call xstoxt(kappa,xs,xt,ff); if(ff)return +call xttoxm(a,xt,xm,ff) +end subroutine xctoxm_ak + +!============================================================================== +subroutine zmtozt(a,zm,zt,ztd,ff) +!============================================================================== +! Evaluate the function, zt = tan(sqrt(A)*z)/sqrt(A), and its deivative, ztd, +! for positive and negative A and for the limiting case, A --> 0 +!============================================================================== +use pkind, only: dp +use pietc, only: F,T,u1,pih +implicit none +real(dp),intent(in ):: a,zm +real(dp),intent(out):: zt,ztd +logical, intent(out):: ff +!------------------------------------------------------------------------------ +real(dp):: ra +!============================================================================== +ff=f +if (a>0)then; ra=sqrt( a); zt=tan (ra*zm)/ra; ff=abs(ra*zm)>=pih +elseif(a<0)then; ra=sqrt(-a); zt=tanh(ra*zm)/ra +else ; zt=zm +endif +ztd=u1+a*zt*zt +end subroutine zmtozt + +!============================================================================= +subroutine zttozm(a,zt,zm,ff) +!============================================================================= +! Inverse of zmtozt +!============================================================================= +use pkind, only: dp +use pietc, only: F,u1 +implicit none +real(dp),intent(in ):: a,zt +real(dp),intent(out):: zm +logical, intent(out):: ff +!----------------------------------------------------------------------------- +real(dp):: ra,razt +!============================================================================= +ff=F +if (a>0)then; ra=sqrt( a); razt=ra*zt; zm=atan (razt)/ra +elseif(a<0)then; ra=sqrt(-a); razt=ra*zt; ff=abs(razt)>=u1; if(ff)return + zm=atanh(razt)/ra +else ; zm=zt +endif +end subroutine zttozm + +!============================================================================== +subroutine xmtoxt(a,xm,xt,xtd,ff) +!============================================================================== +! Like zmtozt, but for 2-vector xm and xt, and 2*2 diagonal Jacobian xtd +!============================================================================== +use pkind, only: dp +implicit none +real(dp), intent(in ):: a +real(dp),dimension(2), intent(in ):: xm +real(dp),dimension(2), intent(out):: xt +real(dp),dimension(2,2),intent(out):: xtd +logical, intent(out):: ff +!----------------------------------------------------------------------------- +integer:: i +!============================================================================== +xtd=0; do i=1,2; call zmtozt(a,xm(i),xt(i),xtd(i,i),ff); if(ff)return; enddo +end subroutine xmtoxt + +!============================================================================= +subroutine xttoxm(a,xt,xm,ff) +!============================================================================= +! Inverse of xmtoxt +!============================================================================ +use pkind, only: dp +use pietc, only: F +implicit none +real(dp), intent(in ):: a +real(dp),dimension(2),intent(in ):: xt +real(dp),dimension(2),intent(out):: xm +logical ,intent(out):: ff +!----------------------------------------------------------------------------- +integer:: i +!============================================================================= +do i=1,2; call zttozm(a,xt(i),xm(i),ff); if(ff)return; enddo +end subroutine xttoxm + +!============================================================================== +subroutine xttoxs(kappa,xt,xs,xsd,ff) +!============================================================================== +! Scaled gnomonic plane xt to standard stereographic plane xs +!============================================================================== +use pkind, only: dp +use pietc, only: u0,u1 +implicit none +real(dp), intent(in ):: kappa +real(dp),dimension(2), intent(in ):: xt +real(dp),dimension(2), intent(out):: xs +real(dp),dimension(2,2),intent(out):: xsd +logical, intent(out):: ff +!------------------------------------------------------------------------------ +real(dp):: s,sp,rsp,rspp,rspps,rspdx,rspdy +!============================================================================== +s=kappa*(xt(1)*xt(1) + xt(2)*xt(2)); sp=u1+s +ff=(sp<=u0); if(ff)return +rsp=sqrt(sp) +rspp=u1+rsp +rspps=rspp**2 +xs=xt/rspp +rspdx=kappa*xt(1)/rsp +rspdy=kappa*xt(2)/rsp +xsd(1,1)=u1/rspp -xt(1)*rspdx/rspps +xsd(1,2)= -xt(1)*rspdy/rspps +xsd(2,1)= -xt(2)*rspdx/rspps +xsd(2,2)=u1/rspp -xt(2)*rspdy/rspps +end subroutine xttoxs + +!============================================================================= +subroutine xstoxt(kappa,xs,xt,ff) +!============================================================================= +! Inverse of xttoxs. +!============================================================================= +use pkind, only: dp +use pietc, only: u1 +implicit none +real(dp), intent(in ):: kappa +real(dp),dimension(2),intent(in ):: xs +real(dp),dimension(2),intent(out):: xt +logical, intent(out):: ff +!----------------------------------------------------------------------------- +real(dp):: s,sc +!============================================================================= +s=kappa*(xs(1)*xs(1)+xs(2)*xs(2)); sc=u1-s +ff=(sc<=0); if(ff)return +xt=2*xs/sc +end subroutine xstoxt + +!============================================================================= +subroutine xstoxc(xs,xc,xcd) +!============================================================================= +! Standard transformation from polar stereographic map coordinates, xs, to +! cartesian, xc, assuming the projection axis is polar. +! xcd=d(xc)/d(xs) is the jacobian matrix +!============================================================================= +use pkind, only: dp +use pietc, only: u1,u2 +use pmat4, only: outer_product +implicit none +real(dp),dimension(2), intent(in ):: xs +real(dp),dimension(3), intent(out):: xc +real(dp),dimension(3,2),intent(out):: xcd +!----------------------------------------------------------------------------- +real(dp):: zp +!============================================================================= +zp=u2/(u1+dot_product(xs,xs)); xc(1:2)=xs*zp; xc(3)=zp +xcd=-outer_product(xc,xs)*zp; xcd(1,1)=xcd(1,1)+zp; xcd(2,2)=xcd(2,2)+zp +xc(3)=xc(3)-u1 +end subroutine xstoxc + +!============================================================================= +subroutine xctoxs(xc,xs) +!============================================================================= +! Inverse of xstoxc. I.e., cartesians to stereographic +!============================================================================= +use pkind, only: dp +use pietc, only: u1 +implicit none +real(dp),dimension(3),intent(in ):: xc +real(dp),dimension(2),intent(out):: xs +!----------------------------------------------------------------------------- +real(dp):: zp +!============================================================================= +zp=u1+xc(3); xs=xc(1:2)/zp +end subroutine xctoxs diff --git a/sorc/regional_grid.fd/hgrid_ak.f90 b/sorc/regional_grid.fd/hgrid_ak.f90 new file mode 100644 index 000000000..389f53a69 --- /dev/null +++ b/sorc/regional_grid.fd/hgrid_ak.f90 @@ -0,0 +1,104 @@ +!============================================================================= +subroutine hgrid_ak(lx,ly,nx,ny,a,k,plat,plon,pazi, & + re,delx,dely, glat,glon,garea, ff) +!============================================================================= +! Use a and k as the parameters of a generalized Schmidt-transformed +! gnomonic mapping centered at (plat,plon) and twisted about this center +! by an azimuth angle of pazi counterclockwise (these angles in radians). +! +! Assuming the radius of the earth is re, and using the central mapping +! point as the coordinate origin, set up the grid with central x-spacing delx +! and y-spacing dely in physical units, and with the location of the left-lower +! corner of the grid at center-relative grid index pair, (lx,ly) and with +! the number of the grid spaces in x and y directions given by nx and ny. +! (Note that, for a centered rectangular grid lx and ly are negative and, in +! magnitude, half the values of nx and ny respectively.) +! Return the latitude and longitude, in radians again, of the grid points thus +! defined in the arrays, glat and glon, and return a rectangular array, garea, +! of dimensions nx-1 by ny-1, that contains the areas of each of the grid cells +! in the SQUARE of the same physical length unit that was employed to define +! the radius of the earth, re (and the central grid steps, delx and dely). +! +! if all goes well, return a .FALSE. failure flag, ff. If, for some +! reason, it is not possible to complete this task, return the failure flag +! as .TRUE. +!============================================================================= +use pkind, only: dp +use pietc, only: u0,u1,dtor +use pmat4, only: sarea +use pmat5, only: ctog +implicit none +integer, intent(in ):: lx,ly,nx,ny +real(dp), intent(in ):: a,k,plat,plon,pazi, & + re,delx,dely +real(dp),dimension(lx:lx+nx ,ly:ly+ny ),intent(out):: glat,glon +real(dp),dimension(lx:lx+nx-1,ly:ly+ny-1),intent(out):: garea +logical, intent(out):: ff +!----------------------------------------------------------------------------- +real(dp),dimension(3,3):: prot,azirot +real(dp),dimension(3,2):: xcd +real(dp),dimension(3) :: xc +real(dp),dimension(2) :: xm +real(dp) :: clat,slat,clon,slon,cazi,sazi,& + rlat,drlata,drlatb,drlatc, & + rlon,drlona,drlonb,drlonc, rre +integer :: ix,iy,mx,my +!============================================================================= +clat=cos(plat); slat=sin(plat) +clon=cos(plon); slon=sin(plon) +cazi=cos(pazi); sazi=sin(pazi) + +azirot(:,1)=(/ cazi, sazi, u0/) +azirot(:,2)=(/-sazi, cazi, u0/) +azirot(:,3)=(/ u0, u0, u1/) + +prot(:,1)=(/ -slon, clon, u0/) +prot(:,2)=(/-slat*clon, -slat*slon, clat/) +prot(:,3)=(/ clat*clon, clat*slon, slat/) +prot=matmul(prot,azirot) +mx=lx+nx ! Index of the 'right' edge of the rectangular grid +my=ly+ny ! Index of the 'top' edge of the rectangular grid +!This code assumes symmetry about the grid center +do iy=ly,my + !xm(2)=iy*dely/re + xm(2)=-iy*dely/re + do ix=lx,mx + !xm(1)=ix*delx/re + xm(1)=-ix*delx/re + call xmtoxc_ak(a,k,xm,xc,xcd,ff) + if(ff)return + xcd=matmul(prot,xcd) + xc =matmul(prot,xc ) + call ctog(xc,glat(ix,iy),glon(ix,iy)) + enddo +enddo + +! Convert degrees to radians in the glat and glon arrays: +glat=glat*dtor +glon=glon*dtor + +! Compute the areas of the quadrilateral grid cells: +do iy=ly,my-1 + do ix=lx,mx-1 + rlat =glat(ix ,iy ) + drlata=glat(ix+1,iy )-rlat + drlatb=glat(ix+1,iy+1)-rlat + drlatc=glat(ix ,iy+1)-rlat + rlon =glon(ix ,iy ) + drlona=glon(ix+1,iy )-rlon + drlonb=glon(ix+1,iy+1)-rlon + drlonc=glon(ix ,iy+1)-rlon +! If 'I' is the grid point (ix,iy), 'A' is (ix+1,iy); 'B' is (ix+1,iy+1) +! and 'C' is (ix,iy+1), then the area of the grid cell IABC is the sum of +! the areas of the traingles, IAB and IBC (the latter being the negative +! of the signed area of triangle, ICB): + garea(ix,iy)=sarea(rlat, drlata,drlona, drlatb,drlonb) & + -sarea(rlat, drlatc,drlonc, drlatb,drlonb) + enddo +enddo +! Convert the areas to area units consistent with the length units used for +! the radius, re, of the sphere: +rre=re*re +garea=garea*rre + +end subroutine hgrid_ak diff --git a/sorc/regional_grid.fd/pietc.f90 b/sorc/regional_grid.fd/pietc.f90 new file mode 100644 index 000000000..f6abe1af3 --- /dev/null +++ b/sorc/regional_grid.fd/pietc.f90 @@ -0,0 +1,95 @@ +! +!============================================================================= +module pietc +!============================================================================= +! R. J. Purser (jim.purser@noaa.gov) 2014 +! Some of the commonly used constants (pi etc) mainly for double-precision +! subroutines. +! ms10 etc are needed to satisfy the some (eg., gnu fortran) compilers' +! more rigorous standards regarding the way "data" statements are initialized. +! Zero and the first few units are u0,u1,u2, etc., their reciprocals being, +! o2,o3 etc and their square roots, r2,r3. Reciprocal roots are or2,or3 etc. +!============================================================================= +use pkind, only: dp,dpc +implicit none +logical ,parameter:: T=.true.,F=.false. !<- for pain-relief in logical ops +real(dp),parameter:: & + u0=0,u1=1,mu1=-u1,u2=2,mu2=-u2,u3=3,mu3=-u3,u4=4,mu4=-u4,u5=5,mu5=-u5, & + u6=6,mu6=-u6,o2=u1/2,o3=u1/3,o4=u1/4,o5=u1/5,o6=u1/6, & + pi =3.1415926535897932384626433832795028841971693993751058209749e0_dp, & + pi2=6.2831853071795864769252867665590057683943387987502116419498e0_dp, & + pih=1.5707963267948966192313216916397514420985846996875529104874e0_dp, & + rpi=1.7724538509055160272981674833411451827975494561223871282138e0_dp, & +! Important square-roots + r2 =1.4142135623730950488016887242096980785696718753769480731766e0_dp, & + r3 =1.7320508075688772935274463415058723669428052538103806280558e0_dp, & + r5 =2.2360679774997896964091736687312762354406183596115257242708e0_dp, & + or2=u1/r2,or3=u1/r3,or5=u1/r5, & +! Golden number: + phi=1.6180339887498948482045868343656381177203091798057628621354e0_dp, & +! Euler-Mascheroni constant: + euler=0.57721566490153286060651209008240243104215933593992359880e0_dp, & +! Degree to radians; radians to degrees: + dtor=pi/180,rtod=180/pi, & +! Sines of all main fractions of 90 degrees (down to ninths): + s10=.173648177666930348851716626769314796000375677184069387236241e0_dp,& + s11=.195090322016128267848284868477022240927691617751954807754502e0_dp,& + s13=.222520933956314404288902564496794759466355568764544955311987e0_dp,& + s15=.258819045102520762348898837624048328349068901319930513814003e0_dp,& + s18=.309016994374947424102293417182819058860154589902881431067724e0_dp,& + s20=.342020143325668733044099614682259580763083367514160628465048e0_dp,& + s22=.382683432365089771728459984030398866761344562485627041433800e0_dp,& + s26=.433883739117558120475768332848358754609990727787459876444547e0_dp,& + s30=o2, & + s34=.555570233019602224742830813948532874374937190754804045924153e0_dp,& + s36=.587785252292473129168705954639072768597652437643145991072272e0_dp,& + s39=.623489801858733530525004884004239810632274730896402105365549e0_dp,& + s40=.642787609686539326322643409907263432907559884205681790324977e0_dp,& + s45=or2, & + s50=.766044443118978035202392650555416673935832457080395245854045e0_dp,& + s51=.781831482468029808708444526674057750232334518708687528980634e0_dp,& + s54=.809016994374947424102293417182819058860154589902881431067724e0_dp,& + s56=.831469612302545237078788377617905756738560811987249963446124e0_dp,& + s60=r3*o2, & + s64=.900968867902419126236102319507445051165919162131857150053562e0_dp,& + s68=.923879532511286756128183189396788286822416625863642486115097e0_dp,& + s70=.939692620785908384054109277324731469936208134264464633090286e0_dp,& + s72=.951056516295153572116439333379382143405698634125750222447305e0_dp,& + s75=.965925826289068286749743199728897367633904839008404550402343e0_dp,& + s77=.974927912181823607018131682993931217232785800619997437648079e0_dp,& + s79=.980785280403230449126182236134239036973933730893336095002916e0_dp,& + s80=.984807753012208059366743024589523013670643251719842418790025e0_dp,& +! ... and their minuses: + ms10=-s10,ms11=-s11,ms13=-s13,ms15=-s15,ms18=-s18,ms20=-s20,ms22=-s22,& + ms26=-s26,ms30=-s30,ms34=-s34,ms36=-s36,ms39=-s39,ms40=-s40,ms45=-s45,& + ms50=-s50,ms51=-s51,ms54=-s54,ms56=-s56,ms60=-s60,ms64=-s64,ms68=-s68,& + ms70=-s70,ms72=-s72,ms75=-s75,ms77=-s77,ms79=-s79,ms80=-s80 + +complex(dpc),parameter:: & + c0=(u0,u0),c1=(u1,u0),mc1=-c1,ci=(u0,u1),mci=-ci,cipi=ci*pi, & +! Main fractional rotations, as unimodular complex numbers: + z000=c1 ,z010=( s80,s10),z011=( s79,s11),z013=( s77,s13),& + z015=( s75,s15),z018=( s72,s18),z020=( s70,s20),z022=( s68,s22),& + z026=( s64,s26),z030=( s60,s30),z034=( s56,s34),z036=( s54,s36),& + z039=( s51,s39),z040=( s50,s40),z045=( s45,s45),z050=( s40,s50),& + z051=( s39,s51),z054=( s36,s54),z056=( s34,s56),z060=( s30,s60),& + z064=( s26,s64),z068=( s22,s68),z070=( s20,s70),z072=( s18,s72),& + z075=( s15,s75),z077=( s13,s77),z079=( s11,s79),z080=( s10,s80),& + z090=ci, z100=(ms10,s80),z101=(ms11,s79),z103=(ms13,s77),& + z105=(ms15,s75),z108=(ms18,s72),z110=(ms20,s70),z112=(ms22,s68),& + z116=(ms26,s64),z120=(ms30,s60),z124=(ms34,s56),z126=(ms36,s54),& + z129=(ms39,s51),z130=(ms40,s50),z135=(ms45,s45),z140=(ms50,s40),& + z141=(ms51,s39),z144=(ms54,s36),z146=(ms56,s34),z150=(ms60,s30),& + z154=(ms64,s26),z158=(ms68,s22),z160=(ms70,s20),z162=(ms72,s18),& + z165=(ms75,s15),z167=(ms77,s13),z169=(ms79,s11),z170=(ms80,s10),& + z180=-z000,z190=-z010,z191=-z011,z193=-z013,z195=-z015,z198=-z018,& + z200=-z020,z202=-z022,z206=-z026,z210=-z030,z214=-z034,z216=-z036,& + z219=-z039,z220=-z040,z225=-z045,z230=-z050,z231=-z051,z234=-z054,& + z236=-z056,z240=-z060,z244=-z064,z248=-z068,z250=-z070,z252=-z072,& + z255=-z075,z257=-z077,z259=-z079,z260=-z080,z270=-z090,z280=-z100,& + z281=-z101,z283=-z103,z285=-z105,z288=-z108,z290=-z110,z292=-z112,& + z296=-z116,z300=-z120,z304=-z124,z306=-z126,z309=-z129,z310=-z130,& + z315=-z135,z320=-z140,z321=-z141,z324=-z144,z326=-z146,z330=-z150,& + z334=-z154,z338=-z158,z340=-z160,z342=-z162,z345=-z165,z347=-z167,& + z349=-z169,z350=-z170 +end module pietc diff --git a/sorc/regional_grid.fd/pkind.f90 b/sorc/regional_grid.fd/pkind.f90 new file mode 100644 index 000000000..abc5841b7 --- /dev/null +++ b/sorc/regional_grid.fd/pkind.f90 @@ -0,0 +1,8 @@ +module pkind +private:: one_dpi; integer(8),parameter:: one_dpi=1 +integer,parameter:: dpi=kind(one_dpi) +integer,parameter:: sp=kind(1.0) +integer,parameter:: dp=kind(1.0d0) +integer,parameter:: spc=kind((1.0,1.0)) +integer,parameter:: dpc=kind((1.0d0,1.0d0)) +end module pkind diff --git a/sorc/regional_grid.fd/pmat.f90 b/sorc/regional_grid.fd/pmat.f90 new file mode 100644 index 000000000..11f1b0f7b --- /dev/null +++ b/sorc/regional_grid.fd/pmat.f90 @@ -0,0 +1,1082 @@ +! +! ********************************************** +! * MODULE pmat * +! * R. J. Purser, NOAA/NCEP/EMC 1993 * +! * and Tsukasa Fujita, visiting scientist * +! * from JMA. * +! * Major modifications: 2002, 2009, 2012 * +! * jim.purser@noaa.gov * +! * * +! ********************************************** +! +! Utility routines for various linear inversions and Cholesky. +! Dependency: modules pkind, pietc +! Originally, these routines were copies of the purely "inversion" members +! of pmat1.f90 (a most extensive collection of matrix routines -- not just +! inversions). As well as having both single and double precision versions +! of each routine, these versions also make provision for a more graceful +! termination in cases where the system matrix is detected to be +! essentially singular (and therefore noninvertible). This provision takes +! the form of an optional "failure flag", FF, which is normally returned +! as .FALSE., but is returned as .TRUE. when inversion fails. +! In Sep 2012, these routines were collected together into pmat.f90 so +! that all the main matrix routines could be in the same library, pmat.a. +! +! DIRECT DEPENDENCIES: +! Modules: pkind, pietc +! +!============================================================================= +module pmat +!============================================================================= +use pkind, only: sp,dp,spc,dpc +use pietc, only: t,f +implicit none +private +public:: ldum,udlmm,inv,L1Lm,LdLm,invl,invu +interface swpvv; module procedure sswpvv,dswpvv,cswpvv; end interface +interface ldum + module procedure sldum,dldum,cldum,sldumf,dldumf,cldumf; end interface +interface udlmm + module procedure sudlmm,dudlmm,cudlmm,sudlmv,dudlmv,cudlmv; end interface +interface inv + module procedure & +sinvmt, dinvmt, cinvmt, slinmmt, dlinmmt, clinmmt, slinmvt, dlinmvt, clinmvt, & +sinvmtf,dinvmtf,cinvmtf,slinmmtf,dlinmmtf,clinmmtf,slinmvtf,dlinmvtf,clinmvtf,& +iinvf + end interface +interface L1Lm; module procedure sL1Lm,dL1Lm,sL1Lmf,dL1Lmf; end interface +interface LdLm; module procedure sLdLm,dLdLm,sLdLmf,dLdLmf; end interface +interface invl; module procedure sinvl,dinvl,slinlv,dlinlv; end interface +interface invu; module procedure sinvu,dinvu,slinuv,dlinuv; end interface + +contains + +!============================================================================= +subroutine sswpvv(d,e)! [swpvv] +!============================================================================= +! Swap vectors +!------------- +real(sp), intent(inout) :: d(:), e(:) +real(sp) :: tv(size(d)) +!============================================================================= +tv = d; d = e; e = tv +end subroutine sswpvv +!============================================================================= +subroutine dswpvv(d,e)! [swpvv] +!============================================================================= +real(dp), intent(inout) :: d(:), e(:) +real(dp) :: tv(size(d)) +!============================================================================= +tv = d; d = e; e = tv +end subroutine dswpvv +!============================================================================= +subroutine cswpvv(d,e)! [swpvv] +!============================================================================= +complex(dpc),intent(inout) :: d(:), e(:) +complex(dpc) :: tv(size(d)) +!============================================================================= +tv = d; d = e; e = tv +end subroutine cswpvv + +!============================================================================= +subroutine sinvmt(a)! [inv] +!============================================================================= +real(sp),dimension(:,:),intent(INOUT):: a +logical :: ff +call sinvmtf(a,ff) +if(ff)stop 'In sinvmt; Unable to invert matrix' +end subroutine sinvmt +!============================================================================= +subroutine dinvmt(a)! [inv] +!============================================================================= +real(dp),dimension(:,:),intent(inout):: a +logical :: ff +call dinvmtf(a,ff) +if(ff)stop 'In dinvmt; Unable to invert matrix' +end subroutine dinvmt +!============================================================================= +subroutine cinvmt(a)! [inv] +!============================================================================= +complex(dpc),dimension(:,:),intent(inout):: a +logical :: ff +call cinvmtf(a,ff) +if(ff)stop 'In cinvmt; Unable to invert matrix' +end subroutine cinvmt +!============================================================================= +subroutine sinvmtf(a,ff)! [inv] +!============================================================================= +! Invert matrix (or flag if can't) +!---------------- +real(sp),dimension(:,:),intent(inout):: a +logical, intent( out):: ff +integer :: m,i,j,jp,l +real(sp) :: d +integer,dimension(size(a,1)) :: ipiv +!============================================================================= +m=size(a,1) +if(m /= size(a,2))stop 'In sinvmtf; matrix passed to sinvmtf is not square' +! Perform a pivoted L-D-U decomposition on matrix a: +call sldumf(a,ipiv,d,ff) +if(ff)then + print '(" In sinvmtf; failed call to sldumf")' + return +endif + +! Invert upper triangular portion U in place: +do i=1,m; a(i,i)=1./a(i,i); enddo +do i=1,m-1 + do j=i+1,m; a(i,j)=-a(j,j)*dot_product(a(i:j-1,j),a(i,i:j-1)); enddo +enddo + +! Invert lower triangular portion L in place: +do j=1,m-1; jp=j+1 + do i=jp,m; a(i,j)=-a(i,j)-dot_product(a(jp:i-1,j),a(i,jp:i-1)); enddo +enddo + +! Form the product of U**-1 and L**-1 in place +do j=1,m-1; jp=j+1 + do i=1,j; a(i,j)=a(i,j)+dot_product(a(jp:m,j),a(i,jp:m)); enddo + do i=jp,m; a(i,j)=dot_product(a(i:m,j),a(i,i:m)); enddo +enddo + +! Permute columns according to ipiv +do j=m-1,1,-1; l=ipiv(j); call sswpvv(a(:,j),a(:,l)); enddo +end subroutine sinvmtf +!============================================================================= +subroutine dinvmtf(a,ff)! [inv] +!============================================================================= +real(DP),dimension(:,:),intent(INOUT):: a +logical, intent( OUT):: ff +integer :: m,i,j,jp,l +real(DP) :: d +integer, dimension(size(a,1)) :: ipiv +!============================================================================= +m=size(a,1) +if(m /= size(a,2))stop 'In inv; matrix passed to dinvmtf is not square' +! Perform a pivoted L-D-U decomposition on matrix a: +call dldumf(a,ipiv,d,ff) +if(ff)then + print '(" In dinvmtf; failed call to dldumf")' + return +endif + +! Invert upper triangular portion U in place: +do i=1,m; a(i,i)=1/a(i,i); enddo +do i=1,m-1 + do j=i+1,m; a(i,j)=-a(j,j)*dot_product(a(i:j-1,j),a(i,i:j-1)); enddo +enddo + +! Invert lower triangular portion L in place: +do j=1,m-1; jp=j+1 + do i=jp,m; a(i,j)=-a(i,j)-dot_product(a(jp:i-1,j),a(i,jp:i-1)); enddo +enddo + +! Form the product of U**-1 and L**-1 in place +do j=1,m-1; jp=j+1 + do i=1,j; a(i,j)=a(i,j)+dot_product(a(jp:m,j),a(i,jp:m)); enddo + do i=jp,m; a(i,j)=dot_product(a(i:m,j),a(i,i:m)); enddo +enddo + +! Permute columns according to ipiv +do j=m-1,1,-1; l=ipiv(j); call dswpvv(a(:,j),a(:,l)); enddo +end subroutine dinvmtf +!============================================================================= +subroutine cinvmtf(a,ff)! [inv] +!============================================================================= +complex(dpc),dimension(:,:),intent(INOUT):: a +logical, intent( OUT):: ff +integer :: m,i,j,jp,l +complex(dpc) :: d +integer, dimension(size(a,1)) :: ipiv +!============================================================================= +m=size(a,1) +if(m /= size(a,2))stop 'In inv; matrix passed to cinvmtf is not square' +! Perform a pivoted L-D-U decomposition on matrix a: +call cldumf(a,ipiv,d,ff) +if(ff)then + print '(" In cinvmtf; failed call to cldumf")' + return +endif + +! Invert upper triangular portion U in place: +do i=1,m; a(i,i)=1/a(i,i); enddo +do i=1,m-1 + do j=i+1,m; a(i,j)=-a(j,j)*sum(a(i:j-1,j)*a(i,i:j-1)); enddo +enddo + +! Invert lower triangular portion L in place: +do j=1,m-1; jp=j+1 + do i=jp,m; a(i,j)=-a(i,j)-sum(a(jp:i-1,j)*a(i,jp:i-1)); enddo +enddo + +! Form the product of U**-1 and L**-1 in place +do j=1,m-1; jp=j+1 + do i=1,j; a(i,j)=a(i,j)+sum(a(jp:m,j)*a(i,jp:m)); enddo + do i=jp,m; a(i,j)=sum(a(i:m,j)*a(i,i:m)); enddo +enddo + +! Permute columns according to ipiv +do j=m-1,1,-1; l=ipiv(j); call cswpvv(a(:,j),a(:,l)); enddo +end subroutine cinvmtf + +!============================================================================= +subroutine slinmmt(a,b)! [inv] +!============================================================================= +real(sp),dimension(:,:),intent(inout):: a,b +logical :: ff +call slinmmtf(a,b,ff) +if(ff)stop 'In slinmmt; unable to invert linear system' +end subroutine slinmmt +!============================================================================= +subroutine dlinmmt(a,b)! [inv] +!============================================================================= +real(dp),dimension(:,:),intent(inout):: a,b +logical :: ff +call dlinmmtf(a,b,ff) +if(ff)stop 'In dlinmmt; unable to invert linear system' +end subroutine dlinmmt +!============================================================================= +subroutine clinmmt(a,b)! [inv] +!============================================================================= +complex(dpc),dimension(:,:),intent(inout):: a,b +logical :: ff +call clinmmtf(a,b,ff) +if(ff)stop 'In clinmmt; unable to invert linear system' +end subroutine clinmmt +!============================================================================= +subroutine slinmmtf(a,b,ff)! [inv] +!============================================================================= +real(SP), dimension(:,:),intent(INOUT):: a,b +logical, intent( OUT):: ff +integer,dimension(size(a,1)) :: ipiv +integer :: m +real(sp) :: d +!============================================================================= +m=size(a,1) +if(m /= size(a,2))stop 'In inv; matrix passed to slinmmtf is not square' +if(m /= size(b,1))& + stop 'In inv; matrix and vectors in slinmmtf have unmatched sizes' +call sldumf(a,ipiv,d,ff) +if(ff)then + print '("In slinmmtf; failed call to sldumf")' + return +endif +call sudlmm(a,b,ipiv) +end subroutine slinmmtf +!============================================================================= +subroutine dlinmmtf(a,b,ff)! [inv] +!============================================================================= +real(dp),dimension(:,:), intent(inout):: a,b +logical, intent( out):: ff +integer, dimension(size(a,1)) :: ipiv +integer :: m +real(dp) :: d +!============================================================================= +m=size(a,1) +if(m /= size(a,2))stop 'In inv; matrix passed to dlinmmtf is not square' +if(m /= size(b,1))& + stop 'In inv; matrix and vectors in dlinmmtf have unmatched sizes' +call dldumf(a,ipiv,d,ff) +if(ff)then + print '("In dlinmmtf; failed call to dldumf")' + return +endif +call dudlmm(a,b,ipiv) +end subroutine dlinmmtf +!============================================================================= +subroutine clinmmtf(a,b,ff)! [inv] +!============================================================================= +complex(dpc),dimension(:,:),intent(INOUT):: a,b +logical, intent( OUT):: ff +integer, dimension(size(a,1)) :: ipiv +integer :: m +complex(dpc) :: d +!============================================================================= +m=size(a,1) +if(m /= size(a,2))stop 'In inv; matrix passed to dlinmmtf is not square' +if(m /= size(b,1))& + stop 'In inv; matrix and vectors in dlinmmtf have unmatched sizes' +call cldumf(a,ipiv,d,ff) +if(ff)then + print '("In clinmmtf; failed call to cldumf")' + return +endif +call cudlmm(a,b,ipiv) +end subroutine clinmmtf + +!============================================================================= +subroutine slinmvt(a,b)! [inv] +!============================================================================= +real(sp), dimension(:,:),intent(inout):: a +real(sp), dimension(:), intent(inout):: b +logical :: ff +call slinmvtf(a,b,ff) +if(ff)stop 'In slinmvt; matrix singular, unable to continue' +end subroutine slinmvt +!============================================================================= +subroutine dlinmvt(a,b)! [inv] +!============================================================================= +real(dp), dimension(:,:),intent(inout):: a +real(dp), dimension(:), intent(inout):: b +logical :: ff +call dlinmvtf(a,b,ff) +if(ff)stop 'In dlinmvt; matrix singular, unable to continue' +end subroutine dlinmvt +!============================================================================= +subroutine clinmvt(a,b)! [inv] +!============================================================================= +complex(dpc), dimension(:,:),intent(inout):: a +complex(dpc), dimension(:), intent(inout):: b +logical :: ff +call clinmvtf(a,b,ff) +if(ff)stop 'In clinmvt; matrix singular, unable to continue' +end subroutine clinmvt +!============================================================================= +subroutine slinmvtf(a,b,ff)! [inv] +!============================================================================= +real(sp),dimension(:,:),intent(inout):: a +real(sp),dimension(:), intent(inout):: b +logical, intent( out):: ff +integer,dimension(size(a,1)) :: ipiv +real(sp) :: d +!============================================================================= +if(size(a,1) /= size(a,2).or. size(a,1) /= size(b))& + stop 'In inv; In slinmvtf; incompatible array dimensions' +call sldumf(a,ipiv,d,ff) +if(ff)then + print '("In slinmvtf; failed call to sldumf")' + return +endif +call sudlmv(a,b,ipiv) +end subroutine slinmvtf +!============================================================================= +subroutine dlinmvtf(a,b,ff)! [inv] +!============================================================================= +real(dp),dimension(:,:),intent(inout):: a +real(dp),dimension(:), intent(inout):: b +logical, intent( out):: ff +integer, dimension(size(a,1)) :: ipiv +real(dp) :: d +!============================================================================= +if(size(a,1) /= size(a,2).or. size(a,1) /= size(b))& + stop 'In inv; incompatible array dimensions passed to dlinmvtf' +call dldumf(a,ipiv,d,ff) +if(ff)then + print '("In dlinmvtf; failed call to dldumf")' + return +endif +call dudlmv(a,b,ipiv) +end subroutine dlinmvtf +!============================================================================= +subroutine clinmvtf(a,b,ff)! [inv] +!============================================================================= +complex(dpc),dimension(:,:),intent(inout):: a +complex(dpc),dimension(:), intent(inout):: b +logical, intent( out):: ff +integer, dimension(size(a,1)) :: ipiv +complex(dpc) :: d +!============================================================================= +if(size(a,1) /= size(a,2).or. size(a,1) /= size(b))& + stop 'In inv; incompatible array dimensions passed to clinmvtf' +call cldumf(a,ipiv,d,ff) +if(ff)then + print '("In clinmvtf; failed call to cldumf")' + return +endif +call cudlmv(a,b,ipiv) +end subroutine clinmvtf + +!============================================================================= +subroutine iinvf(imat,ff)! [inv] +!============================================================================= +! Invert integer square array, imat, if possible, but flag ff=.true. +! if not possible. (Determinant of imat must be +1 or -1 +!============================================================================= +integer,dimension(:,:),intent(INOUT):: imat +logical, intent( OUT):: ff +!----------------------------------------------------------------------------- +real(dp),parameter :: eps=1.e-10_dp +real(dp),dimension(size(imat,1),size(imat,1)):: dmat +integer :: m,i,j +!============================================================================= +m=size(imat,1) +if(m /= size(imat,2))stop 'In inv; matrix passed to iinvf is not square' +dmat=imat; call inv(dmat,ff) +if(.not.ff)then + do j=1,m + do i=1,m + imat(i,j)=nint(dmat(i,j)); if(abs(dmat(i,j)-imat(i,j))>eps)ff=t + enddo + enddo +endif +end subroutine iinvf + +!============================================================================= +subroutine sldum(a,ipiv,d)! [ldum] +!============================================================================= +real(sp),intent(inout) :: a(:,:) +real(sp),intent(out ) :: d +integer, intent(out ) :: ipiv(:) +logical :: ff +call sldumf(a,ipiv,d,ff) +if(ff)stop 'In sldum; matrix singular, unable to continue' +end subroutine sldum +!============================================================================= +subroutine dldum(a,ipiv,d)! [ldum] +!============================================================================= +real(dp),intent(inout) :: a(:,:) +real(dp),intent(out ) :: d +integer, intent(out ) :: ipiv(:) +logical:: ff +call dldumf(a,ipiv,d,ff) +if(ff)stop 'In dldum; matrix singular, unable to continue' +end subroutine dldum +!============================================================================= +subroutine cldum(a,ipiv,d)! [ldum] +!============================================================================= +complex(dpc),intent(inout) :: a(:,:) +complex(dpc),intent(out ) :: d +integer, intent(out ) :: ipiv(:) +logical:: ff +call cldumf(a,ipiv,d,ff) +if(ff)stop 'In cldum; matrix singular, unable to continue' +end subroutine cldum +!============================================================================= +subroutine sldumf(a,ipiv,d,ff)! [ldum] +!============================================================================= +! R.J.Purser, NCEP, Washington D.C. 1996 +! SUBROUTINE LDUM +! perform l-d-u decomposition of square matrix a in place with +! pivoting. +! +! <-> a square matrix to be factorized +! <-- ipiv array encoding the pivoting sequence +! <-- d indicator for possible sign change of determinant +! <-- ff: failure flag, set to .true. when determinant of a vanishes. +!============================================================================= +real(SP),intent(INOUT) :: a(:,:) +real(SP),intent(OUT ) :: d +integer, intent(OUT ) :: ipiv(:) +logical, intent(OUT ) :: ff +integer :: m,i, j, jp, ibig, jm +real(SP) :: s(size(a,1)), aam, aa, abig, ajj, ajji, aij +!============================================================================= +ff=f +m=size(a,1) +do i=1,m + aam=0 + do j=1,m + aa=abs(a(i,j)) + if(aa > aam)aam=aa + enddo + if(aam == 0)then + print '("In sldumf; row ",i6," of matrix vanishes")',i + ff=t + return + endif + s(i)=1/aam +enddo +d=1. +ipiv(m)=m +do j=1,m-1 + jp=j+1 + abig=s(j)*abs(a(j,j)) + ibig=j + do i=jp,m + aa=s(i)*abs(a(i,j)) + if(aa > abig)then + ibig=i + abig=aa + endif + enddo +! swap rows, recording changed sign of determinant + ipiv(j)=ibig + if(ibig /= j)then + d=-d + call sswpvv(a(j,:),a(ibig,:)) + s(ibig)=s(j) + endif + ajj=a(j,j) + if(ajj == 0)then + jm=j-1 + print '(" failure in sldumf:"/" matrix singular, rank=",i3)',jm + ff=t + return + endif + ajji=1/ajj + do i=jp,m + aij=ajji*a(i,j) + a(i,j)=aij + a(i,jp:m) = a(i,jp:m) - aij*a(j,jp:m) + enddo +enddo +end subroutine sldumf +!============================================================================= +subroutine DLDUMf(A,IPIV,D,ff)! [ldum] +!============================================================================= +real(DP), intent(INOUT) :: a(:,:) +real(DP), intent(OUT ) :: d +integer, intent(OUT ) :: ipiv(:) +logical, intent(OUT ) :: ff +integer :: m,i, j, jp, ibig, jm +real(DP) :: s(size(a,1)), aam, aa, abig, ajj, ajji, aij +!============================================================================= +ff=f +m=size(a,1) +do i=1,m + aam=0 + do j=1,m + aa=abs(a(i,j)) + if(aa > aam)aam=aa + enddo + if(aam == 0)then + print '("In dldumf; row ",i6," of matrix vanishes")',i + ff=t + return + endif + s(i)=1/aam +enddo +d=1. +ipiv(m)=m +do j=1,m-1 + jp=j+1 + abig=s(j)*abs(a(j,j)) + ibig=j + do i=jp,m + aa=s(i)*abs(a(i,j)) + if(aa > abig)then + ibig=i + abig=aa + endif + enddo +! swap rows, recording changed sign of determinant + ipiv(j)=ibig + if(ibig /= j)then + d=-d + call dswpvv(a(j,:),a(ibig,:)) + s(ibig)=s(j) + endif + ajj=a(j,j) + if(ajj == 0)then + jm=j-1 + print '(" Failure in dldumf:"/" matrix singular, rank=",i3)',jm + ff=t + return + endif + ajji=1/ajj + do i=jp,m + aij=ajji*a(i,j) + a(i,j)=aij + a(i,jp:m) = a(i,jp:m) - aij*a(j,jp:m) + enddo +enddo +end subroutine DLDUMf +!============================================================================= +subroutine cldumf(a,ipiv,d,ff)! [ldum] +!============================================================================= +use pietc, only: c0 +complex(dpc), intent(INOUT) :: a(:,:) +complex(dpc), intent(OUT ) :: d +integer, intent(OUT ) :: ipiv(:) +logical, intent(OUT ) :: ff +integer :: m,i, j, jp, ibig, jm +complex(dpc) :: ajj, ajji, aij +real(dp) :: aam,aa,abig +real(dp),dimension(size(a,1)):: s +!============================================================================= +ff=f +m=size(a,1) +do i=1,m + aam=0 + do j=1,m + aa=abs(a(i,j)) + if(aa > aam)aam=aa + enddo + if(aam == 0)then + print '("In cldumf; row ",i6," of matrix vanishes")',i + ff=t + return + endif + s(i)=1/aam +enddo +d=1. +ipiv(m)=m +do j=1,m-1 + jp=j+1 + abig=s(j)*abs(a(j,j)) + ibig=j + do i=jp,m + aa=s(i)*abs(a(i,j)) + if(aa > abig)then + ibig=i + abig=aa + endif + enddo +! swap rows, recording changed sign of determinant + ipiv(j)=ibig + if(ibig /= j)then + d=-d + call cswpvv(a(j,:),a(ibig,:)) + s(ibig)=s(j) + endif + ajj=a(j,j) + if(ajj == c0)then + jm=j-1 + print '(" Failure in cldumf:"/" matrix singular, rank=",i3)',jm + ff=t + return + endif + ajji=1/ajj + do i=jp,m + aij=ajji*a(i,j) + a(i,j)=aij + a(i,jp:m) = a(i,jp:m) - aij*a(j,jp:m) + enddo +enddo +end subroutine cldumf + +!============================================================================= +subroutine sudlmm(a,b,ipiv)! [udlmm] +!============================================================================= +! R.J.Purser, National Meteorological Center, Washington D.C. 1993 +! SUBROUTINE UDLMM +! use l-u factors in A to back-substitute for several rhs in B, using ipiv to +! define the pivoting permutation used in the l-u decomposition. +! +! --> A L-D-U factorization of linear system matrux +! <-> B rt-hand-sides vectors on input, corresponding solutions on return +! --> IPIV array encoding the pivoting sequence +!============================================================================= +integer, dimension(:), intent(in) :: ipiv +real(sp),dimension(:,:),intent(in) :: a +real(sp),dimension(:,:),intent(inout) :: b +integer :: m,i, k, l +real(sp) :: s,aiii +!============================================================================= +m=size(a,1) +do k=1,size(b,2) !loop over columns of b + do i=1,m + l=ipiv(i) + s=b(l,k) + b(l,k)=b(i,k) + s = s - sum(b(1:i-1,k)*a(i,1:i-1)) + b(i,k)=s + enddo + b(m,k)=b(m,k)/a(m,m) + do i=m-1,1,-1 + aiii=1/a(i,i) + b(i,k) = b(i,k) - sum(b(i+1:m,k)*a(i,i+1:m)) + b(i,k)=b(i,k)*aiii + enddo +enddo +end subroutine sudlmm +!============================================================================= +subroutine dudlmm(a,b,ipiv)! [udlmm] +!============================================================================= +integer, dimension(:), intent(in ) :: ipiv +real(dp), dimension(:,:),intent(in ) :: a +real(dp), dimension(:,:),intent(inout) :: b +integer :: m,i, k, l +real(dp) :: s,aiii +!============================================================================= +m=size(a,1) +do k=1, size(b,2)!loop over columns of b + do i=1,m + l=ipiv(i) + s=b(l,k) + b(l,k)=b(i,k) + s = s - sum(b(1:i-1,k)*a(i,1:i-1)) + b(i,k)=s + enddo + b(m,k)=b(m,k)/a(m,m) + do i=m-1,1,-1 + aiii=1/a(i,i) + b(i,k) = b(i,k) - sum(b(i+1:m,k)*a(i,i+1:m)) + b(i,k)=b(i,k)*aiii + enddo +enddo +end subroutine dudlmm +!============================================================================= +subroutine cudlmm(a,b,ipiv)! [udlmm] +!============================================================================= +integer, dimension(:), intent(in ) :: ipiv +complex(dpc),dimension(:,:),intent(in ) :: a +complex(dpc),dimension(:,:),intent(inout) :: b +integer :: m,i, k, l +complex(dpc) :: s,aiii +!============================================================================= +m=size(a,1) +do k=1, size(b,2)!loop over columns of b + do i=1,m + l=ipiv(i) + s=b(l,k) + b(l,k)=b(i,k) + s = s - sum(b(1:i-1,k)*a(i,1:i-1)) + b(i,k)=s + enddo + b(m,k)=b(m,k)/a(m,m) + do i=m-1,1,-1 + aiii=1/a(i,i) + b(i,k) = b(i,k) - sum(b(i+1:m,k)*a(i,i+1:m)) + b(i,k)=b(i,k)*aiii + enddo +enddo +end subroutine cudlmm + +!============================================================================= +subroutine sudlmv(a,b,ipiv)! [udlmv] +!============================================================================= +! R.J.Purser, National Meteorological Center, Washington D.C. 1993 +! SUBROUTINE UDLMV +! use l-u factors in A to back-substitute for 1 rhs in B, using ipiv to +! define the pivoting permutation used in the l-u decomposition. +! +! --> A L-D-U factorization of linear system matrix +! <-> B right-hand-side vector on input, corresponding solution on return +! --> IPIV array encoding the pivoting sequence +!============================================================================= +integer, dimension(:), intent(in) :: ipiv +real(sp),dimension(:,:),intent(in) :: a +real(sp),dimension(:), intent(inout) :: b +integer :: m,i, l +real(sp) :: s,aiii +!============================================================================= +m=size(a,1) +do i=1,m + l=ipiv(i) + s=b(l) + b(l)=b(i) + s = s - sum(b(1:i-1)*a(i,1:i-1)) + b(i)=s +enddo +b(m)=b(m)/a(m,m) +do i=m-1,1,-1 + aiii=1/a(i,i) + b(i) = b(i) - sum(b(i+1:m)*a(i,i+1:m)) + b(i)=b(i)*aiii +enddo +end subroutine sudlmv +!============================================================================= +subroutine dudlmv(a,b,ipiv)! [udlmv] +!============================================================================= +integer, dimension(:), intent(in ) :: ipiv(:) +real(dp), dimension(:,:),intent(in ) :: a(:,:) +real(dp), dimension(:), intent(inout) :: b(:) +integer :: m,i, l +real(dp) :: s,aiii +!============================================================================= +m=size(a,1) +do i=1,m + l=ipiv(i) + s=b(l) + b(l)=b(i) + s = s - sum(b(1:i-1)*a(i,1:i-1)) + b(i)=s +enddo +b(m)=b(m)/a(m,m) +do i=m-1,1,-1 + aiii=1/a(i,i) + b(i) = b(i) - sum(b(i+1:m)*a(i,i+1:m)) + b(i)=b(i)*aiii +enddo +end subroutine dudlmv +!============================================================================= +subroutine cudlmv(a,b,ipiv)! [udlmv] +!============================================================================= +integer, dimension(:), intent(in ) :: ipiv(:) +complex(dpc),dimension(:,:),intent(in ) :: a(:,:) +complex(dpc),dimension(:), intent(inout) :: b(:) +integer :: m,i, l +complex(dpc) :: s,aiii +!============================================================================= +m=size(a,1) +do i=1,m + l=ipiv(i) + s=b(l) + b(l)=b(i) + s = s - sum(b(1:i-1)*a(i,1:i-1)) + b(i)=s +enddo +b(m)=b(m)/a(m,m) +do i=m-1,1,-1 + aiii=1/a(i,i) + b(i) = b(i) - sum(b(i+1:m)*a(i,i+1:m)) + b(i)=b(i)*aiii +enddo +end subroutine cudlmv + +!============================================================================= +subroutine sl1lm(a,b) ! [l1lm] +!============================================================================= +! Cholesky, M -> L*U, U(i,j)=L(j,i) +!============================================================================= +real(sp), intent(in ) :: a(:,:) +real(sp), intent(inout) :: b(:,:) +!----------------------------------------------------------------------------- +logical:: ff +call sl1lmf(a,b,ff) +if(ff)stop 'In sl1lm; matrix singular, unable to continue' +end subroutine sl1lm +!============================================================================= +subroutine dl1lm(a,b) ! [l1lm] +!============================================================================= +! Cholesky, M -> L*U, U(i,j)=L(j,i) +!============================================================================= +real(dp), intent(in ) :: a(:,:) +real(dp), intent(inout) :: b(:,:) +!----------------------------------------------------------------------------- +logical:: ff +call dl1lmf(a,b,ff) +if(ff)stop 'In dl1lm; matrix singular, unable to continue' +end subroutine dl1lm + +!============================================================================= +subroutine sl1lmf(a,b,ff)! [L1Lm] +!============================================================================= +! Cholesky, M -> L*U, U(i,j)=L(j,i) +!============================================================================= +real(sp), intent(IN ) :: a(:,:) +real(sp), intent(INOUT) :: b(:,:) +logical :: ff +!----------------------------------------------------------------------------- +integer :: m,j, jm, jp, i +real(sp) :: s, bjji +!============================================================================= +m=size(a,1) +ff=f +do j=1,m + jm=j-1 + jp=j+1 + s = a(j,j) - sum(b(j,1:jm)*b(j,1:jm)) + ff=(S <= 0) + if(ff)then + print '("sL1Lmf detects nonpositive a, rank=",i6)',jm + return + endif + b(j,j)=sqrt(s) + bjji=1/b(j,j) + do i=jp,m + s = a(i,j) - sum(b(i,1:jm)*b(j,1:jm)) + b(i,j)=s*bjji + enddo + b(1:jm,j) = 0 +enddo +end subroutine sl1lmf +!============================================================================= +subroutine dl1lmf(a,b,ff) ! [L1Lm] +!============================================================================= +real(dp), intent(IN ) :: a(:,:) +real(dp), intent(INOUT) :: b(:,:) +logical :: ff +!----------------------------------------------------------------------------- +integer :: m,j, jm, jp, i +real(dp) :: s, bjji +!============================================================================= +m=size(a,1) +ff=f +do j=1,m + jm=j-1 + jp=j+1 + s = a(j,j) - sum(b(j,1:jm)*b(j,1:jm)) + ff=(s <= 0) + if(ff)then + print '("dL1LMF detects nonpositive A, rank=",i6)',jm + return + endif + b(j,j)=sqrt(s) + bjji=1/b(j,j) + do i=jp,m + s = a(i,j) - sum(b(i,1:jm)*b(j,1:jm)) + b(i,j)=s*bjji + enddo + b(1:jm,j) = 0 +enddo +return +end subroutine dl1lmf + +!============================================================================= +subroutine sldlm(a,b,d)! [LdLm] +!============================================================================= +! Modified Cholesky decompose Q --> L*D*U, U(i,j)=L(j,i) +!============================================================================= +real(sp), intent(IN ):: a(:,:) +real(sp), intent(INOUT):: b(:,:) +real(sp), intent( OUT):: d(:) +!----------------------------------------------------------------------------- +logical:: ff +call sldlmf(a,b,d,ff) +if(ff)stop 'In sldlm; matrix singular, unable to continue' +end subroutine sldlm +!============================================================================= +subroutine dldlm(a,b,d)! [LdLm] +!============================================================================= +real(dp), intent(IN ):: a(:,:) +real(dp), intent(INOUT):: b(:,:) +real(dp), intent( OUT):: d(:) +!----------------------------------------------------------------------------- +logical:: ff +call dldlmf(a,b,d,ff) +if(ff)stop 'In dldlm; matrix singular, unable to continue' +end subroutine dldlm + +!============================================================================= +subroutine sldlmf(a,b,d,ff) ! [LDLM] +!============================================================================= +! Modified Cholesky decompose Q --> L*D*U +!============================================================================= +real(sp), intent(IN ):: a(:,:) +real(sp), intent(INOUT):: b(:,:) +real(sp), intent( OUT):: d(:) +logical, intent( OUT):: ff +!----------------------------------------------------------------------------- +integer :: m,j, jm, jp, i +real(sp) :: bjji +!============================================================================= +m=size(a,1) +ff=f +do j=1,m + jm=j-1 + jp=j+1 + d(j)=a(j,j) - sum(b(1:jm,j)*b(j,1:jm)) + b(j,j) = 1 + ff=(d(j) == 0) + if(ff)then + print '("In sldlmf; singularity of matrix detected")' + print '("Rank of matrix: ",i6)',jm + return + endif + bjji=1/d(j) + do i=jp,m + b(j,i)=a(i,j) - dot_product(b(1:jm,j),b(i,1:jm)) + b(i,j)=b(j,i)*bjji + enddo + b(1:jm,j)=0 +enddo +end subroutine sldlmf +!============================================================================= +subroutine dldlmf(a,b,d,ff) ! [LDLM] +!============================================================================= +! Modified Cholesky Q --> L*D*U, U(i,j)=L(j,i) +!============================================================================= +real(dp), intent(IN ) :: a(:,:) +real(dp), intent(INOUT) :: b(:,:) +real(dp), intent( OUT) :: d(:) +logical, intent( OUT) :: ff +!----------------------------------------------------------------------------- +integer :: m,j, jm, jp, i +real(dp) :: bjji +!============================================================================= +m=size(a,1) +ff=f +do j=1,m; jm=j-1; jp=j+1 + d(j)=a(j,j) - sum(b(1:jm,j)*b(j,1:jm)) + b(j,j) = 1 + ff=(d(j) == 0) + if(ff)then + print '("In dldlmf; singularity of matrix detected")' + print '("Rank of matrix: ",i6)',jm + return + endif + bjji=1/d(j) + do i=jp,m + b(j,i)=a(i,j) - dot_product(b(1:jm,j),b(i,1:jm)) + b(i,j)=b(j,i)*bjji + enddo + b(1:jm,j)=0 +enddo +end subroutine dldlmf + +!============================================================================== +subroutine sinvu(a)! [invu] +!============================================================================== +! Invert the upper triangular matrix in place by transposing, calling +! invl, and transposing again. +!============================================================================== +real,dimension(:,:),intent(inout):: a +a=transpose(a); call sinvl(a); a=transpose(a) +end subroutine sinvu +!============================================================================== +subroutine dinvu(a)! [invu] +!============================================================================== +real(dp),dimension(:,:),intent(inout):: a +a=transpose(a); call dinvl(a); a=transpose(a) +end subroutine dinvu +!============================================================================== +subroutine sinvl(a)! [invl] +!============================================================================== +! Invert lower triangular matrix in place +!============================================================================== +real(sp), intent(inout) :: a(:,:) +integer :: m,j, i +m=size(a,1) +do j=m,1,-1 + a(1:j-1,j) = 0.0 + a(j,j)=1./a(j,j) + do i=j+1,m + a(i,j)=-a(i,i)*sum(a(j:i-1,j)*a(i,j:i-1)) + enddo +enddo +end subroutine sinvl +!============================================================================== +subroutine dinvl(a)! [invl] +!============================================================================== +real(dp), intent(inout) :: a(:,:) +integer :: m,j, i +m=size(a,1) +do j=m,1,-1 + a(1:j-1,j) = 0.0 + a(j,j)=1./a(j,j) + do i=j+1,m + a(i,j)=-a(i,i)*sum(a(j:i-1,j)*a(i,j:i-1)) + enddo +enddo +end subroutine dinvl + +!============================================================================== +subroutine slinlv(a,u)! [invl] +!============================================================================== +! Solve linear system involving lower triangular system matrix. +!============================================================================== +real, intent(in ) :: a(:,:) +real, intent(inout) :: u(:) +integer :: i +if(size(a,1) /= size(a,2) .or. size(a,1) /= size(u))& + stop 'In slinlv; incompatible array dimensions' +do i=1,size(u); u(i)=(u(i) - sum(u(:i-1)*a(i,:i-1)))/a(i,i); enddo +end subroutine slinlv +!============================================================================== +subroutine dlinlv(a,u)! [invl] +!============================================================================== +real(dp), intent(in ) :: a(:,:) +real(dp), intent(inout) :: u(:) +integer :: i +if(size(a,1) /= size(a,2) .or. size(a,1) /= size(u))& + stop 'In dlinlv; incompatible array dimensions' +do i=1,size(u); u(i)=(u(i) - sum(u(:i-1)*a(i,:i-1)))/a(i,i); enddo +end subroutine dlinlv + +!============================================================================== +subroutine slinuv(a,u)! [invu] +!============================================================================== +! Solve linear system involving upper triangular system matrix. +!============================================================================== +real, intent(in ) :: a(:,:) +real, intent(inout) :: u(:) +integer :: i +if(size(a,1) /= size(a,2) .or. size(a,1) /= size(u))& + stop 'In linuv; incompatible array dimensions' +do i=size(u),1,-1; u(i)=(u(i) - sum(a(i+1:,i)*u(i+1:)))/a(i,i); enddo +end subroutine slinuv +!============================================================================== +subroutine dlinuv(a,u)! [invu] +!============================================================================== +real(dp), intent(in ) :: a(:,:) +real(dp), intent(inout) :: u(:) +integer :: i +if(size(a,1) /= size(a,2) .or. size(a,1) /= size(u))& + stop 'In dlinuv; incompatible array dimensions' +do i=size(u),1,-1; u(i)=(u(i) - sum(a(i+1:,i)*u(i+1:)))/a(i,i); enddo +end subroutine dlinuv + +end module pmat + diff --git a/sorc/regional_grid.fd/pmat4.f90 b/sorc/regional_grid.fd/pmat4.f90 new file mode 100644 index 000000000..8cb2fcb70 --- /dev/null +++ b/sorc/regional_grid.fd/pmat4.f90 @@ -0,0 +1,1924 @@ +! +! ********************************************** +! * MODULE pmat4 * +! * R. J. Purser, NOAA/NCEP/EMC Oct 2005 * +! * 18th May 2012 * +! * jim.purser@noaa.gov * +! * * +! ********************************************** +! +! Euclidean geometry, geometric (stereographic) projections, +! related transformations (Mobius). +! Package for handy vector and matrix operations in Euclidean geometry. +! This package is primarily intended for 3D operations and three of the +! functions (Cross_product, Triple_product and Axial) do not possess simple +! generalizations to a generic number N of dimensions. The others, while +! admitting such N-dimensional generalizations, have not all been provided +! with such generic forms here at the time of writing, though some of these +! may be added at a future date. +! +! May 2017: Added routines to facilitate manipulation of 3D rotations, +! their representations by axial vectors, and routines to compute the +! exponentials of matrices (without resort to eigen methods). Also added +! Quaternion and spinor representations of 3D rotations, and their +! conversion routines. +! +! FUNCTION: +! absv: Absolute magnitude of vector as its euclidean length +! Normalized: Normalized version of given real vector +! Orthogonalized: Orthogonalized version of second vector rel. to first unit v. +! Cross_product: Vector cross-product of the given 2 vectors +! Outer_product: outer-product matrix of the given 2 vectors +! Triple_product: Scalar triple product of given 3 vectors +! Det: Determinant of given matrix +! Axial: Convert axial-vector <--> 2-form (antisymmetric matrix) +! Diag: Diagnl of given matrix, or diagonal matrix of given elements +! Trace: Trace of given matrix +! Identity: Identity 3*3 matrix, or identity n*n matrix for a given n +! Sarea: Spherical area subtended by three vectors, or by lat-lon +! increments forming a triangle or quadrilateral +! Huarea: Spherical area subtended by right-angled spherical triangle +! SUBROUTINE: +! Gram: Right-handed orthogonal basis and rank, nrank. The first +! nrank basis vectors span the column range of matrix given, +! OR ("plain" version) simple unpivoted Gram-Schmidt of a +! square matrix. +! +! In addition, we include routines that relate to stereographic projections +! and some associated mobius transformation utilities, since these complex +! operations have a strong geometrical flavor. +! +! DIRECT DEPENDENCIES +! Libraries[their Modules]: pmat[pmat] +! Additional Modules : pkind, pietc +! +!============================================================================ +module pmat4 +!============================================================================ +use pkind, only: sp,dp,dpc +implicit none +private +public:: absv,normalized,orthogonalized, & + cross_product,outer_product,triple_product,det,axial, & + diag,trace,identity,sarea,huarea,dlltoxy, & + normalize,gram,rowops,corral, & + axtoq,qtoax, & + rottoax,axtorot,spintoq,qtospin,rottoq,qtorot,mulqq, & + expmat,zntay,znfun, & + ctoz,ztoc,setmobius, & + mobius,mobiusi + +interface absv; module procedure absv_s,absv_d; end interface +interface normalized;module procedure normalized_s,normalized_d;end interface +interface orthogonalized + module procedure orthogonalized_s,orthogonalized_d; end interface +interface cross_product + module procedure cross_product_s,cross_product_d; end interface +interface outer_product + module procedure outer_product_s,outer_product_d,outer_product_i + end interface +interface triple_product + module procedure triple_product_s,triple_product_d; end interface +interface det; module procedure det_s,det_d,det_i,det_id; end interface +interface axial + module procedure axial3_s,axial3_d,axial33_s,axial33_d; end interface +interface diag + module procedure diagn_s,diagn_d,diagn_i,diagnn_s,diagnn_d,diagnn_i + end interface +interface trace; module procedure trace_s,trace_d,trace_i; end interface +interface identity; module procedure identity_i,identity3_i; end interface +interface huarea; module procedure huarea_s,huarea_d; end interface +interface sarea + module procedure sarea_s,sarea_d,dtarea_s,dtarea_d,dqarea_s,dqarea_d + end interface +interface dlltoxy; module procedure dlltoxy_s,dlltoxy_d; end interface +interface hav; module procedure hav_s, hav_d; end interface +interface normalize;module procedure normalize_s,normalize_d; end interface +interface gram + module procedure gram_s,gram_d,graml_d,plaingram_s,plaingram_d,rowgram + end interface +interface rowops; module procedure rowops; end interface +interface corral; module procedure corral; end interface +interface rottoax; module procedure rottoax; end interface +interface axtorot; module procedure axtorot; end interface +interface spintoq; module procedure spintoq; end interface +interface qtospin; module procedure qtospin; end interface +interface rottoq; module procedure rottoq; end interface +interface qtorot; module procedure qtorot; end interface +interface axtoq; module procedure axtoq; end interface +interface qtoax; module procedure qtoax; end interface +interface setem; module procedure setem; end interface +interface mulqq; module procedure mulqq; end interface +interface expmat; module procedure expmat,expmatd,expmatdd; end interface +interface zntay; module procedure zntay; end interface +interface znfun; module procedure znfun; end interface +interface ctoz; module procedure ctoz; end interface +interface ztoc; module procedure ztoc,ztocd; end interface +interface setmobius;module procedure setmobius,zsetmobius; end interface +interface mobius; module procedure zmobius,cmobius; end interface +interface mobiusi; module procedure zmobiusi; end interface + +contains + +!============================================================================= +function absv_s(a)result(s)! [absv] +!============================================================================= +real(sp),dimension(:),intent(in):: a +real(sp) :: s +s=sqrt(dot_product(a,a)) +end function absv_s +!============================================================================= +function absv_d(a)result(s)! [absv] +!============================================================================= +real(dp),dimension(:),intent(in):: a +real(dp) :: s +s=sqrt(dot_product(a,a)) +end function absv_d + +!============================================================================= +function normalized_s(a)result(b)! [normalized] +!============================================================================= +real(sp),dimension(:),intent(IN):: a +real(sp),dimension(size(a)) :: b +real(sp) :: s +s=absv_s(a); if(s==0)then; b=0;else;b=a/s;endif +end function normalized_s +!============================================================================= +function normalized_d(a)result(b)! [normalized] +!============================================================================= +real(dp),dimension(:),intent(IN):: a +real(dp),dimension(size(a)) :: b +real(dp) :: s +s=absv_d(a); if(s==0)then; b=0;else;b=a/s;endif +end function normalized_d + +!============================================================================= +function orthogonalized_s(u,a)result(b)! [orthogonalized] +!============================================================================= +real(sp),dimension(:),intent(in):: u,a +real(sp),dimension(size(u)) :: b +real(sp) :: s +! Note: this routine assumes u is already normalized +s=dot_product(u,a); b=a-u*s +end function orthogonalized_s +!============================================================================= +function orthogonalized_d(u,a)result(b)! [orthogonalized] +!============================================================================= +real(dp),dimension(:),intent(in):: u,a +real(dp),dimension(size(u)) :: b +real(dp) :: s +! Note: this routine assumes u is already normalized +s=dot_product(u,a); b=a-u*s +end function orthogonalized_d + +!============================================================================= +function cross_product_s(a,b)result(c)! [cross_product] +!============================================================================= +real(sp),dimension(3),intent(in):: a,b +real(sp),dimension(3) :: c +c(1)=a(2)*b(3)-a(3)*b(2); c(2)=a(3)*b(1)-a(1)*b(3); c(3)=a(1)*b(2)-a(2)*b(1) +end function cross_product_s +!============================================================================= +function cross_product_d(a,b)result(c)! [cross_product] +!============================================================================= +real(dp),dimension(3),intent(in):: a,b +real(dp),dimension(3) :: c +c(1)=a(2)*b(3)-a(3)*b(2); c(2)=a(3)*b(1)-a(1)*b(3); c(3)=a(1)*b(2)-a(2)*b(1) +end function cross_product_d + +!============================================================================= +function outer_product_s(a,b)result(c)! [outer_product] +!============================================================================= +real(sp),dimension(:), intent(in ):: a +real(sp),dimension(:), intent(in ):: b +real(sp),DIMENSION(size(a),size(b)):: c +integer :: nb,i +nb=size(b) +do i=1,nb; c(:,i)=a*b(i); enddo +end function outer_product_s +!============================================================================= +function outer_product_d(a,b)result(c)! [outer_product] +!============================================================================= +real(dp),dimension(:), intent(in ):: a +real(dp),dimension(:), intent(in ):: b +real(dp),dimension(size(a),size(b)):: c +integer :: nb,i +nb=size(b) +do i=1,nb; c(:,i)=a*b(i); enddo +end function outer_product_d +!============================================================================= +function outer_product_i(a,b)result(c)! [outer_product] +!============================================================================= +integer,dimension(:), intent(in ):: a +integer,dimension(:), intent(in ):: b +integer,dimension(size(a),size(b)):: c +integer :: nb,i +nb=size(b) +do i=1,nb; c(:,i)=a*b(i); enddo +end function outer_product_i + +!============================================================================= +function triple_product_s(a,b,c)result(tripleproduct)! [triple_product] +!============================================================================= +real(sp),dimension(3),intent(IN ):: a,b,c +real(sp) :: tripleproduct +tripleproduct=dot_product( cross_product(a,b),c ) +end function triple_product_s +!============================================================================= +function triple_product_d(a,b,c)result(tripleproduct)! [triple_product] +!============================================================================= +real(dp),dimension(3),intent(IN ):: a,b,c +real(dp) :: tripleproduct +tripleproduct=dot_product( cross_product(a,b),c ) +end function triple_product_d + +!============================================================================= +function det_s(a)result(det)! [det] +!============================================================================= +real(sp),dimension(:,:),intent(IN ) ::a +real(sp) :: det +real(sp),dimension(size(a,1),size(a,1)):: b +integer :: n,nrank +n=size(a,1) +if(n==3)then + det=triple_product(a(:,1),a(:,2),a(:,3)) +else + call gram(a,b,nrank,det) + if(nranknrank)exit + ab(k:m,k:n)=matmul( transpose(a(:,k:m)),b(:,k:n) ) + ii =maxloc( abs( ab(k:m,k:n)) )+k-1 + val=maxval( abs( ab(k:m,k:n)) ) + if(val<=vcrit)then + nrank=k-1 + exit + endif + i=ii(1) + j=ii(2) + tv=b(:,j) + b(:,j)=-b(:,k) + b(:,k)=tv + tv=a(:,i) + a(:,i)=-a(:,k) + a(:,k)=tv + w(k:n)=matmul( transpose(b(:,k:n)),tv ) + b(:,k)=matmul(b(:,k:n),w(k:n) ) + s=dot_product(b(:,k),b(:,k)) + s=sqrt(s) + if(w(k)<0)s=-s + det=det*s + b(:,k)=b(:,k)/s + do l=k,n + do j=l+1,n + s=dot_product(b(:,l),b(:,j)) + b(:,j)=normalized( b(:,j)-b(:,l)*s ) + enddo + enddo +enddo +end subroutine gram_s + +!============================================================================= +subroutine gram_d(as,b,nrank,det)! [gram] +!============================================================================= +real(dp),dimension(:,:),intent(IN ) :: as +real(dp),dimension(:,:),intent(OUT) :: b +integer, intent(OUT) :: nrank +real(dp), intent(OUT) :: det +!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +real(dp),parameter :: crit=1.e-9_dp +real(dp),dimension(size(as,1),size(as,2)):: a +real(dp),dimension(size(as,2),size(as,1)):: ab +real(dp),dimension(size(as,1)) :: tv,w +real(dp) :: val,s,vcrit +integer :: i,j,k,l,m,n +integer,dimension(2) :: ii +!============================================================================= +n=size(as,1) +m=size(as,2) +if(n/=size(b,1) .or. n/=size(b,2))stop 'In gram; incompatible dimensions' +a=as +b=identity(n) +det=1 +val=maxval(abs(a)) +if(val==0)then + nrank=0 + return +endif +vcrit=val*crit +nrank=min(n,m) +do k=1,n + if(k>nrank)exit + ab(k:m,k:n)=matmul( transpose(a(:,k:m)),b(:,k:n) ) + ii =maxloc( abs( ab(k:m,k:n)) )+k-1 + val=maxval( abs( ab(k:m,k:n)) ) + if(val<=vcrit)then + nrank=k-1 + exit + endif + i=ii(1) + j=ii(2) + tv=b(:,j) + b(:,j)=-b(:,k) + b(:,k)=tv + tv=a(:,i) + a(:,i)=-a(:,k) + a(:,k)=tv + w(k:n)=matmul( transpose(b(:,k:n)),tv ) + b(:,k)=matmul(b(:,k:n),w(k:n) ) + s=dot_product(b(:,k),b(:,k)) + s=sqrt(s) + if(w(k)<0)s=-s + det=det*s + b(:,k)=b(:,k)/s + do l=k,n + do j=l+1,n + s=dot_product(b(:,l),b(:,j)) + b(:,j)=normalized( b(:,j)-b(:,l)*s ) + enddo + enddo +enddo +end subroutine gram_d + +!============================================================================= +subroutine graml_d(as,b,nrank,detsign,ldet)! [gram] +!============================================================================= +! A version of gram_d where the determinant information is returned in +! logarithmic form (to avoid overflows for large matrices). When the +! matrix is singular, the "sign" of the determinant, detsign, is returned +! as zero (instead of either +1 or -1) and ldet is then just the log of +! the nonzero factors found by the process. +!============================================================================= +real(dp),dimension(:,:),intent(IN ) :: as +real(dp),dimension(:,:),intent(OUT) :: b +integer, intent(OUT) :: nrank +integer, intent(out) :: detsign +real(dp), intent(OUT) :: ldet +!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +real(dp),parameter :: crit=1.e-9_dp +real(dp),dimension(size(as,1),size(as,2)):: a +real(dp),dimension(size(as,2),size(as,1)):: ab +real(dp),dimension(size(as,1)) :: tv,w +real(dp) :: val,s,vcrit +integer :: i,j,k,l,m,n +integer,dimension(2) :: ii +!============================================================================= +detsign=1 +n=size(as,1) +m=size(as,2) +if(n/=size(b,1) .or. n/=size(b,2))stop 'In gram; incompatible dimensions' +a=as +b=identity(n) +!det=1 +ldet=0 +val=maxval(abs(a)) +if(val==0)then + nrank=0 + return +endif +vcrit=val*crit +nrank=min(n,m) +do k=1,n + if(k>nrank)exit + ab(k:m,k:n)=matmul( transpose(a(:,k:m)),b(:,k:n) ) + ii =maxloc( abs( ab(k:m,k:n)) )+k-1 + val=maxval( abs( ab(k:m,k:n)) ) + if(val<=vcrit)then + nrank=k-1 + exit + endif + i=ii(1) + j=ii(2) + tv=b(:,j) + b(:,j)=-b(:,k) + b(:,k)=tv + tv=a(:,i) + a(:,i)=-a(:,k) + a(:,k)=tv + w(k:n)=matmul( transpose(b(:,k:n)),tv ) + b(:,k)=matmul(b(:,k:n),w(k:n) ) + s=dot_product(b(:,k),b(:,k)) + s=sqrt(s) + if(w(k)<0)s=-s + if(s<0)then + ldet=ldet+log(-s) + detsign=-detsign + elseif(s>0)then + ldet=ldet+log(s) + else + detsign=0 + endif + +! det=det*s + b(:,k)=b(:,k)/s + do l=k,n + do j=l+1,n + s=dot_product(b(:,l),b(:,j)) + b(:,j)=normalized( b(:,j)-b(:,l)*s ) + enddo + enddo +enddo +end subroutine graml_d + +!============================================================================= +subroutine plaingram_s(b,nrank)! [gram] +!============================================================================= +! A "plain" (unpivoted) version of Gram-Schmidt, for square matrices only. +real(sp),dimension(:,:),intent(INOUT) :: b +integer, intent( OUT) :: nrank +!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +real(sp),parameter :: crit=1.e-5_sp +real(sp) :: val,vcrit +integer :: j,k,n +!============================================================================= +n=size(b,1); if(n/=size(b,2))stop 'In gram; matrix needs to be square' +val=maxval(abs(b)) +nrank=0 +if(val==0)then + b=0 + return +endif +vcrit=val*crit +do k=1,n + val=sqrt(dot_product(b(:,k),b(:,k))) + if(val<=vcrit)then + b(:,k:n)=0 + return + endif + b(:,k)=b(:,k)/val + nrank=k + do j=k+1,n + b(:,j)=b(:,j)-b(:,k)*dot_product(b(:,k),b(:,j)) + enddo +enddo +end subroutine plaingram_s + +!============================================================================= +subroutine plaingram_d(b,nrank)! [gram] +!============================================================================= +! A "plain" (unpivoted) version of Gram-Schmidt, for square matrices only. +real(dp),dimension(:,:),intent(INOUT) :: b +integer, intent( OUT) :: nrank +!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +real(dp),parameter :: crit=1.e-9_dp +real(dp) :: val,vcrit +integer :: j,k,n +!============================================================================= +n=size(b,1); if(n/=size(b,2))stop 'In gram; matrix needs to be square' +val=maxval(abs(b)) +nrank=0 +if(val==0)then + b=0 + return +endif +vcrit=val*crit +do k=1,n + val=sqrt(dot_product(b(:,k),b(:,k))) + if(val<=vcrit)then + b(:,k:n)=0 + return + endif + b(:,k)=b(:,k)/val + nrank=k + do j=k+1,n + b(:,j)=b(:,j)-b(:,k)*dot_product(b(:,k),b(:,j)) + enddo +enddo +end subroutine plaingram_d + +!============================================================================= +subroutine rowgram(m,n,a,ipiv,tt,b,rank)! [gram] +!============================================================================= +! Without changing (tall) rectangular input matrix a, perform pivoted gram- +! schmidt operations to orthogonalize the rows, until rows that remain become +! negligible. Record the pivoting sequence in ipiv, and the row-normalization +! in tt(j,j) and the row-orthogonalization in tt(i,j), for i>j. Note that +! tt(i,j)=0 for i=n please' +nepss=n*epss +rank=n +aa=a +tt=0 +do ii=1,n + +! At this stage, all rows less than ii are already orthonormalized and are +! orthogonal to all rows at and beyond ii. Find the norms of these lower +! rows and pivot the largest of them into position ii: + maxp=0 + maxi=ii + do i=ii,m + p(i)=dot_product(aa(i,:),aa(i,:)) + if(p(i)>maxp)then + maxp=p(i) + maxi=i + endif + enddo + if(maxpu1(2))then + j=3 +else + j=2 +endif +ss=u1(j) +if(ss==0)stop 'In rotov; invalid rot' +if(j/=2)t1(2,:)=t1(3,:) +t1(2,:)=t1(2,:)/sqrt(ss) + +! Form t1(3,:) as the cross product of t1(1,:) and t1(2,:) +t1(3,1)=t1(1,2)*t1(2,3)-t1(1,3)*t1(2,2) +t1(3,2)=t1(1,3)*t1(2,1)-t1(1,1)*t1(2,3) +t1(3,3)=t1(1,1)*t1(2,2)-t1(1,2)*t1(2,1) + +! Project rot into the frame whose axes are the rows of t1: +t2=matmul(t1,matmul(rot,transpose(t1))) + +! Obtain the rotation angle, gamma, implied by rot, and gammah=gamma/2: +gamma=atan2(t2(2,1),t2(1,1)); gammah=gamma/2 + +! Hence deduce coefficients (in the form of a real 4-vector) of one of the two +! possible equivalent spinors: +s=sin(gammah) +q(0)=cos(gammah) +q(1:3)=t1(3,:)*s +end subroutine rottoq + +!============================================================================== +subroutine qtorot(q,rot)! [qtorot] +!============================================================================== +! Go from quaternion to rotation matrix representations +!============================================================================== +real(dp),dimension(0:3),intent(IN ):: q +real(dp),dimension(3,3),intent(OUT):: rot +!============================================================================= +call setem(q(0),q(1),q(2),q(3),rot) +end subroutine qtorot + +!============================================================================= +subroutine axtoq(v,q)! [axtoq] +!============================================================================= +! Go from an axial 3-vector to its equivalent quaternion +!============================================================================= +real(dp),dimension(3), intent(in ):: v +real(dp),dimension(0:3),intent(out):: q +!----------------------------------------------------------------------------- +real(dp),dimension(3,3):: rot +!============================================================================= +call axtorot(v,rot) +call rottoq(rot,q) +end subroutine axtoq + +!============================================================================= +subroutine qtoax(q,v)! [qtoax] +!============================================================================= +! Go from quaternion to axial 3-vector +!============================================================================= +real(dp),dimension(0:3),intent(in ):: q +real(dp),dimension(3), intent(out):: v +!----------------------------------------------------------------------------- +real(dp),dimension(3,3):: rot +!============================================================================= +call qtorot(q,rot) +call rottoax(rot,v) +end subroutine qtoax + +!============================================================================= +subroutine setem(c,d,e,g,r)! [setem] +!============================================================================= +real(dp), intent(IN ):: c,d,e,g +real(dp),dimension(3,3),intent(OUT):: r +!----------------------------------------------------------------------------- +real(dp):: cc,dd,ee,gg,de,dg,eg,dc,ec,gc +!============================================================================= +cc=c*c; dd=d*d; ee=e*e; gg=g*g +de=d*e; dg=d*g; eg=e*g +dc=d*c; ec=e*c; gc=g*c +r(1,1)=cc+dd-ee-gg; r(2,2)=cc-dd+ee-gg; r(3,3)=cc-dd-ee+gg +r(2,3)=2*(eg-dc); r(3,1)=2*(dg-ec); r(1,2)=2*(de-gc) +r(3,2)=2*(eg+dc); r(1,3)=2*(dg+ec); r(2,1)=2*(de+gc) +end subroutine setem + +!============================================================================= +function mulqq(a,b)result(c)! [mulqq] +!============================================================================= +! Multiply quaternions, a*b, assuming operation performed from right to left +!============================================================================= +real(dp),dimension(0:3),intent(IN ):: a,b +real(dp),dimension(0:3) :: c +!------------------------------------------- +c(0)=a(0)*b(0) -a(1)*b(1) -a(2)*b(2) -a(3)*b(3) +c(1)=a(0)*b(1) +a(1)*b(0) +a(2)*b(3) -a(3)*b(2) +c(2)=a(0)*b(2) +a(2)*b(0) +a(3)*b(1) -a(1)*b(3) +c(3)=a(0)*b(3) +a(3)*b(0) +a(1)*b(2) -a(2)*b(1) +end function mulqq +!============================================================================= +subroutine expmat(n,a,b,detb)! [expmat] +!============================================================================= +! Evaluate the exponential, b, of a matrix, a, of degree n. +! Apply the iterated squaring method, m times, to the approximation to +! exp(a/(2**m)) obtained as a Taylor expansion of degree L +! See Fung, T. C., 2004, Int. J. Numer. Meth. Engng, 59, 1273--1286. +!============================================================================= +use pietc, only: u1,u2,o2 +integer, intent(IN ):: n +real(dp),dimension(n,n),intent(IN ):: a +real(dp),dimension(n,n),intent(OUT):: b +real(dp), intent(OUT):: detb +!----------------------------------------------------------------------------- +integer,parameter :: L=5 +real(dp),dimension(n,n):: c,p +real(dp) :: t +integer :: i,m +!============================================================================= +m=10+log(u1+maxval(abs(a)))/log(u2) +t=o2**m +c=a*t +p=c +b=p +do i=2,L + p=matmul(p,c)/i + b=b+p +enddo +do i=1,m + b=b*2+matmul(b,b) +enddo +do i=1,n + b(i,i)=b(i,i)+1 +enddo +detb=0; do i=1,n; detb=detb+a(i,i); enddo; detb=exp(detb) +end subroutine expmat + +!============================================================================= +subroutine expmatd(n,a,b,bd,detb,detbd)! [expmat] +!============================================================================= +! Like expmat, but for the 1st derivatives also. +!============================================================================= +use pietc, only: u1,u2,o2 +integer, intent(IN ):: n +real(dp),dimension(n,n), intent(IN ):: a +real(dp),dimension(n,n), intent(OUT):: b +real(dp),dimension(n,n,(n*(n+1))/2),intent(OUT):: bd +real(dp), intent(OUT):: detb +real(dp),dimension((n*(n+1))/2), intent(OUT):: detbd +!----------------------------------------------------------------------------- +integer,parameter :: L=5 +real(dp),dimension(n,n) :: c,p +real(dp),dimension(n,n,(n*(n+1))/2):: pd,cd +real(dp) :: t +integer :: i,j,k,m,n1 +!============================================================================= +n1=(n*(n+1))/2 +m=10+log(u1+maxval(abs(a)))/log(u2) +t=o2**m +c=a*t +p=c +pd=0 +do k=1,n + pd(k,k,k)=t +enddo +k=n +do i=1,n-1 + do j=i+1,n + k=k+1 + pd(i,j,k)=t + pd(j,i,k)=t + enddo +enddo +if(k/=n1)stop 'In expmatd; n1 is inconsistent with n' +cd=pd +b=p +bd=pd + +do i=2,L + do k=1,n1 + pd(:,:,k)=(matmul(cd(:,:,k),p)+matmul(c,pd(:,:,k)))/i + enddo + p=matmul(c,p)/i + b=b+p + bd=bd+pd +enddo +do i=1,m + do k=1,n1 + bd(:,:,k)=2*bd(:,:,k)+matmul(bd(:,:,k),b)+matmul(b,bd(:,:,k)) + enddo + b=b*2+matmul(b,b) +enddo +do i=1,n + b(i,i)=b(i,i)+1 +enddo +detb=0; do i=1,n; detb=detb+a(i,i); enddo; detb=exp(detb) +detbd=0; do k=1,n; detbd(k)=detb; enddo +end subroutine expmatd + +!============================================================================= +subroutine expmatdd(n,a,b,bd,bdd,detb,detbd,detbdd)! [expmat] +!============================================================================= +! Like expmat, but for the 1st and 2nd derivatives also. +!============================================================================= +use pietc, only: u1,u2,o2 +integer, intent(IN ):: n +real(dp),dimension(n,n), intent(IN ):: a +real(dp),dimension(n,n), intent(OUT):: b +real(dp),dimension(n,n,(n*(n+1))/2), intent(OUT):: bd +real(dp),dimension(n,n,(n*(n+1))/2,(n*(n+1))/2),intent(OUT):: bdd +real(dp), intent(OUT):: detb +real(dp),dimension((n*(n+1))/2), intent(OUT):: detbd +real(dp),dimension((n*(n+1))/2,(n*(n+1))/2), intent(OUT):: detbdd +!----------------------------------------------------------------------------- +integer,parameter :: L=5 +real(dp),dimension(n,n) :: c,p +real(dp),dimension(n,n,(n*(n+1))/2) :: pd,cd +real(dp),dimension(n,n,(n*(n+1))/2,(n*(n+1))/2):: pdd,cdd +real(dp) :: t +integer :: i,j,k,ki,kj,m,n1 +!============================================================================= +n1=(n*(n+1))/2 +m=10+log(u1+maxval(abs(a)))/log(u2) +t=o2**m +c=a*t +p=c +pd=0 +pdd=0 +do k=1,n + pd(k,k,k)=t +enddo +k=n +do i=1,n-1 + do j=i+1,n + k=k+1 + pd(i,j,k)=t + pd(j,i,k)=t + enddo +enddo +if(k/=n1)stop 'In expmatd; n1 is inconsistent with n' +cd=pd +cdd=0 +b=p +bd=pd +bdd=0 + +do i=2,L + do ki=1,n1 + do kj=1,n1 + pdd(:,:,ki,kj)=(matmul(cd(:,:,ki),pd(:,:,kj)) & + + matmul(cd(:,:,kj),pd(:,:,ki)) & + + matmul(c,pdd(:,:,ki,kj)))/i + enddo + enddo + do k=1,n1 + pd(:,:,k)=(matmul(cd(:,:,k),p)+matmul(c,pd(:,:,k)))/i + enddo + p=matmul(c,p)/i + b=b+p + bd=bd+pd + bdd=bdd+pdd +enddo +do i=1,m + do ki=1,n1 + do kj=1,n1 + bdd(:,:,ki,kj)=2*bdd(:,:,ki,kj) & + +matmul(bdd(:,:,ki,kj),b) & + +matmul(bd(:,:,ki),bd(:,:,kj)) & + +matmul(bd(:,:,kj),bd(:,:,ki)) & + +matmul(b,bdd(:,:,ki,kj)) + enddo + enddo + do k=1,n1 + bd(:,:,k)=2*bd(:,:,k)+matmul(bd(:,:,k),b)+matmul(b,bd(:,:,k)) + enddo + b=b*2+matmul(b,b) +enddo +do i=1,n + b(i,i)=b(i,i)+1 +enddo +detb=0; do i=1,n; detb=detb+a(i,i); enddo; detb=exp(detb) +detbd=0; do k=1,n; detbd(k)=detb; enddo +detbdd=0; do ki=1,n; do kj=1,n; detbdd(ki,kj)=detb; enddo; enddo +end subroutine expmatdd + +!============================================================================= +subroutine zntay(n,z,zn)! [zntay] +!============================================================================= +integer, intent(IN ):: n +real(dp),intent(IN ):: z +real(dp),intent(OUT):: zn +!----------------------------------------------------------------------------- +integer,parameter :: ni=100 +real(dp),parameter :: eps0=1.e-16 +integer :: i,i2,n2 +real(dp) :: t,eps,z2 +!============================================================================= +z2=z*2 +n2=n*2 +t=1 +do i=1,n + t=t/(i*2-1) +enddo +eps=t*eps0 +zn=t +t=t +do i=1,ni + i2=i*2 + t=t*z2/(i2*(i2+n2-1)) + zn=zn+t + if(abs(t)0)then + zn=cosh(rz2) + znd=sinh(rz2)/rz2 + zndd=(zn-znd)/z2 + znddd=(znd-3*zndd)/z2 + do i=1,n + i2p3=i*2+3 + zn=znd + znd=zndd + zndd=znddd + znddd=(znd-i2p3*zndd)/z2 + enddo + else + zn=cos(rz2) + znd=sin(rz2)/rz2 + zndd=-(zn-znd)/z2 + znddd=-(znd-3*zndd)/z2 + do i=1,n + i2p3=i*2+3 + zn=znd + znd=zndd + zndd=znddd + znddd=-(znd-i2p3*zndd)/z2 + enddo + endif +endif +end subroutine znfun + +!============================================================================= +! Utility code for various Mobius transformations. If aa1,bb1,cc1,dd1 are +! the coefficients for one transformation, and aa2,bb2,cc2,dd2 are the +! coefficients for a second one, then the coefficients for the mapping +! of a test point, zz, by aa1 etc to zw, followed by a mapping of zw, by +! aa2 etc to zv, is equivalent to a single mapping zz-->zv by the transformatn +! with coefficients aa3,bb3,cc3,dd3, such that, as 2*2 complex matrices: +! +! [ aa3, bb3 ] [ aa2, bb2 ] [ aa1, bb1 ] +! [ ] = [ ] * [ ] +! [ cc3, dd3 ] [ cc2, dd2 ] [ cc1, dd1 ] . +! +! Note that the determinant of these matrices is always +1 +! +!============================================================================= +subroutine ctoz(v, z,infz)! [ctoz] +!============================================================================= +real(dp),dimension(3),intent(IN ):: v +complex(dpc), intent(OUT):: z +logical, intent(OUT):: infz +!----------------------------------------------------------------------------- +real(dp),parameter:: zero=0,one=1 +real(dp) :: rr,zzpi +!============================================================================= +infz=.false. +z=cmplx(v(1),v(2),dpc) +if(v(3)>0)then + zzpi=one/(one+v(3)) +else + rr=v(1)**2+v(2)**2 + infz=(rr==zero); if(infz)return ! <- The point is mapped to infinity (90S) + zzpi=(one-v(3))/rr +endif +z=z*zzpi +end subroutine ctoz + +!============================================================================= +subroutine ztoc(z,infz, v)! [ztoc] +!============================================================================= +complex(dpc), intent(IN ):: z +logical, intent(IN ):: infz +real(dp),dimension(3),intent(OUT):: v +!----------------------------------------------------------------------------- +real(dp),parameter:: zero=0,one=1 +real(dp) :: r,q,rs,rsc,rsbi +!============================================================================= +if(infz)then; v=(/zero,zero,-one/); return; endif +r=real(z); q=aimag(z); rs=r*r+q*q +rsc=one-rs +rsbi=one/(one+rs) +v(1)=2*rsbi*r +v(2)=2*rsbi*q +v(3)=rsc*rsbi +end subroutine ztoc + +!============================================================================= +subroutine ztocd(z,infz, v,vd)! [ztoc] +!============================================================================= +! The convention adopted for the complex derivative is that, for a complex +! infinitesimal map displacement, delta_z, the corresponding infinitesimal +! change of cartesian vector position is delta_v given by: +! delta_v = Real(vd*delta_z). +! Thus, by a kind of Cauchy-Riemann relation, Imag(vd)=v CROSS Real(vd). +! THE DERIVATIVE FOR THE IDEAL POINT AT INFINITY HAS NOT BEEN CODED YET!!! +!============================================================================= +complex(dpc), intent(IN ):: z +logical, intent(IN ):: infz +real(dp),dimension(3), intent(OUT):: v +complex(dpc),dimension(3),intent(OUT):: vd +!----------------------------------------------------------------------------- +real(dp),parameter :: zero=0,one=1 +real(dp) :: r,q,rs,rsc,rsbi,rsbis +real(dp),dimension(3):: u1,u2 +integer :: i +!============================================================================= +if(infz)then; v=(/zero,zero,-one/); return; endif +r=real(z); q=aimag(z); rs=r*r+q*q +rsc=one-rs +rsbi=one/(one+rs) +rsbis=rsbi**2 +v(1)=2*rsbi*r +v(2)=2*rsbi*q +v(3)=rsc*rsbi +u1(1)=2*(one+q*q-r*r)*rsbis +u1(2)=-4*r*q*rsbis +u1(3)=-4*r*rsbis +u2=cross_product(v,u1) +do i=1,3 + vd(i)=cmplx(u1(i),-u2(i),dpc) +enddo +end subroutine ztocd + +!============================================================================ +subroutine setmobius(xc0,xc1,xc2, aa,bb,cc,dd)! [setmobius] +!============================================================================ +! Find the Mobius transformation complex coefficients, aa,bb,cc,dd, +! with aa*dd-bb*cc=1, for a standard (north-)polar stereographic transformation +! that takes cartesian point, xc0 to the north pole, xc1 to (lat=0,lon=0), +! xc2 to the south pole (=complex infinity). +!============================================================================ +real(dp),dimension(3),intent(IN ):: xc0,xc1,xc2 +complex(dpc), intent(OUT):: aa,bb,cc,dd +!---------------------------------------------------------------------------- +real(dp),parameter:: zero=0,one=1 +logical :: infz0,infz1,infz2 +complex(dpc) :: z0,z1,z2,z02,z10,z21 +!============================================================================ +call ctoz(xc0,z0,infz0) +call ctoz(xc1,z1,infz1) +call ctoz(xc2,z2,infz2) +z21=z2-z1 +z02=z0-z2 +z10=z1-z0 + +if( (z0==z1.and.infz0.eqv.infz1).or.& + (z1==z2.and.infz1.eqv.infz2).or.& + (z2==z0.and.infz2.eqv.infz0)) & + stop 'In setmobius; anchor points must be distinct' + +if(infz2 .or. (.not.infz0 .and. abs(z0) XE three cartesian components. +! <-- DLAT degrees latitude +! <-- DLON degrees longitude +!============================================================================= +use pietc, only: u0,rtod +real(sp),dimension(3),intent(IN ):: xe +real(sp), intent(OUT):: dlat,dlon +!----------------------------------------------------------------------------- +real(sp) :: r +!============================================================================= +r=sqrt(xe(1)**2+xe(2)**2) +dlat=atan2(xe(3),r)*rtod +if(r==u0)then + dlon=u0 +else + dlon=atan2(xe(2),xe(1))*rtod +endif +end subroutine sctog + +!============================================================================= +subroutine dctog(xe,dlat,dlon)! [ctog] +!============================================================================= +use pietc, only: u0,rtod +real(dp),dimension(3),intent(IN ):: xe +real(dp), intent(OUT):: dlat,dlon +!----------------------------------------------------------------------------- +real(dp) :: r +!============================================================================= +r=sqrt(xe(1)**2+xe(2)**2) +dlat=atan2(xe(3),r)*rtod +if(r==u0)then + dlon=u0 +else + dlon=atan2(xe(2),xe(1))*rtod +endif +end subroutine dctog + +!============================================================================= +subroutine sgtoc(dlat,dlon,xe)! [gtoc] +!============================================================================= +! R.J.Purser, National Meteorological Center, Washington D.C. 1994 +! SUBROUTINE GTOC +! Transform "Geographical" to "Cartesian" coordinates, where the +! geographical coordinates refer to latitude and longitude (degrees) +! and cartesian coordinates are standard earth-centered cartesian +! coordinates: xe(3) pointing north, xe(1) pointing to the 0-meridian. +! --> DLAT degrees latitude +! --> DLON degrees longitude +! <-- XE three cartesian components. +!============================================================================= +use pietc, only: dtor +real(sp), intent(IN ):: dlat,dlon +real(sp),dimension(3),intent(OUT):: xe +!----------------------------------------------------------------------------- +real(sp) :: rlat,rlon,sla,cla,slo,clo +!============================================================================= +rlat=dtor*dlat; rlon=dtor*dlon +sla=sin(rlat); cla=cos(rlat) +slo=sin(rlon); clo=cos(rlon) +xe(1)=cla*clo; xe(2)=cla*slo; xe(3)=sla +end subroutine sgtoc +!============================================================================= +subroutine dgtoc(dlat,dlon,xe)! [gtoc] +!============================================================================= +use pietc, only: dtor +real(dp), intent(IN ):: dlat,dlon +real(dp),dimension(3),intent(OUT):: xe +!----------------------------------------------------------------------------- +real(dp) :: rlat,rlon,sla,cla,slo,clo +!============================================================================= +rlat=dtor*dlat; rlon=dtor*dlon +sla=sin(rlat); cla=cos(rlat) +slo=sin(rlon); clo=cos(rlon) +xe(1)=cla*clo; xe(2)=cla*slo; xe(3)=sla +end subroutine dgtoc +!============================================================================= +subroutine sgtocd(dlat,dlon,xe,dxedlat,dxedlon)! [gtoc] +!============================================================================= +real(sp), intent(IN ):: dlat,dlon +real(sp),dimension(3),intent(OUT):: xe,dxedlat,dxedlon +!----------------------------------------------------------------------------- +real(dp) :: dlat_d,dlon_d +real(dp),dimension(3):: xe_d,dxedlat_d,dxedlon_d +!============================================================================= +dlat_d=dlat; dlon_d=dlon +call dgtocd(dlat_d,dlon_d,xe_d,dxedlat_d,dxedlon_d) +xe =xe_d +dxedlat=dxedlat_d +dxedlon=dxedlon_d +end subroutine sgtocd +!============================================================================= +subroutine dgtocd(dlat,dlon,xe,dxedlat,dxedlon)! [gtoc] +!============================================================================= +use pietc, only: dtor +real(dp), intent(IN ):: dlat,dlon +real(dp),dimension(3),intent(OUT):: xe,dxedlat,dxedlon +!----------------------------------------------------------------------------- +real(dp) :: rlat,rlon,sla,cla,slo,clo +!============================================================================= +rlat=dtor*dlat; rlon=dtor*dlon +sla=sin(rlat); cla=cos(rlat) +slo=sin(rlon); clo=cos(rlon) +xe(1)=cla*clo; xe(2)=cla*slo; xe(3)=sla +dxedlat(1)=-sla*clo; dxedlat(2)=-sla*slo; dxedlat(3)=cla; dxedlat=dxedlat*dtor +dxedlon(1)=-cla*slo; dxedlon(2)= cla*clo; dxedlon(3)=0 ; dxedlon=dxedlon*dtor +end subroutine dgtocd +!============================================================================= +subroutine sgtocdd(dlat,dlon,xe,dxedlat,dxedlon, & + ddxedlatdlat,ddxedlatdlon,ddxedlondlon)! [gtoc] +!============================================================================= +use pietc, only: dtor +real(sp), intent(IN ):: dlat,dlon +real(sp),dimension(3),intent(OUT):: xe,dxedlat,dxedlon, & + ddxedlatdlat,ddxedlatdlon,ddxedlondlon +!----------------------------------------------------------------------------- +real(dp) :: dlat_d,dlon_d +real(dp),dimension(3):: xe_d,dxedlat_d,dxedlon_d, & + ddxedlatdlat_d,ddxedlatdlon_d,ddxedlondlon_d +!============================================================================= +dlat_d=dlat; dlon_d=dlon +call dgtocdd(dlat_d,dlon_d,xe_d,dxedlat_d,dxedlon_d, & + ddxedlatdlat_d,ddxedlatdlon_d,ddxedlondlon_d) +xe =xe_d +dxedlat =dxedlat_d +dxedlon =dxedlon_d +ddxedlatdlat=ddxedlatdlat_d +ddxedlatdlon=ddxedlatdlon_d +ddxedlondlon=ddxedlondlon_d +end subroutine sgtocdd +!============================================================================= +subroutine dgtocdd(dlat,dlon,xe,dxedlat,dxedlon, & + ddxedlatdlat,ddxedlatdlon,ddxedlondlon)! [gtoc] +!============================================================================= +use pietc, only: dtor +real(dp), intent(IN ):: dlat,dlon +real(dp),dimension(3),intent(OUT):: xe,dxedlat,dxedlon, & + ddxedlatdlat,ddxedlatdlon,ddxedlondlon +!----------------------------------------------------------------------------- +real(dp) :: rlat,rlon,sla,cla,slo,clo +!============================================================================= +rlat=dtor*dlat; rlon=dtor*dlon +sla=sin(rlat); cla=cos(rlat) +slo=sin(rlon); clo=cos(rlon) +xe(1)=cla*clo; xe(2)=cla*slo; xe(3)=sla +dxedlat(1)=-sla*clo; dxedlat(2)=-sla*slo; dxedlat(3)=cla; dxedlat=dxedlat*dtor +dxedlon(1)=-cla*slo; dxedlon(2)= cla*clo; dxedlon(3)=0 ; dxedlon=dxedlon*dtor +ddxedlatdlat(1)=-cla*clo +ddxedlatdlat(2)=-cla*slo +ddxedlatdlat(3)=-sla +ddxedlatdlon(1)= sla*slo +ddxedlatdlon(2)=-sla*clo +ddxedlatdlon(3)= 0 +ddxedlondlon(1)=-cla*clo +ddxedlondlon(2)=-cla*slo +ddxedlondlon(3)= 0 +ddxedlatdlat=ddxedlatdlat*dtor**2 +ddxedlatdlon=ddxedlatdlon*dtor**2 +ddxedlondlon=ddxedlondlon*dtor**2 +end subroutine dgtocdd + +!============================================================================== +subroutine sgtoframem(splat,splon,sorth)! [gtoframe] +!============================================================================== +real(sp), intent(in ):: splat,splon +real(sp),dimension(3,3),intent(out):: sorth +!------------------------------------------------------------------------------ +real(dp):: plat,plon +real(dp),dimension(3,3):: orth +!============================================================================== +plat=splat; plon=splon; call gtoframem(plat,plon,orth); sorth=orth +end subroutine sgtoframem +!============================================================================== +subroutine gtoframem(plat,plon,orth)! [gtoframe] +!============================================================================== +! From the degree lat and lo (plat and plon) return the standard orthogonal +! 3D frame at this location as an orthonormal matrix, orth. +!============================================================================== +real(dp), intent(in ):: plat,plon +real(dp),dimension(3,3),intent(out):: orth +!------------------------------------------------------------------------------ +real(dp),dimension(3):: xp,yp,zp +!============================================================================== +call gtoframev(plat,plon, xp,yp,zp) +orth(:,1)=xp; orth(:,2)=yp; orth(:,3)=zp +end subroutine gtoframem +!============================================================================== +subroutine sgtoframev(splat,splon,sxp,syp,szp)! [gtoframe] +!============================================================================== +real(sp), intent(in ):: splat,splon +real(sp),dimension(3),intent(out):: sxp,syp,szp +!------------------------------------------------------------------------------ +real(dp) :: plat,plon +real(dp),dimension(3):: xp,yp,zp +!============================================================================== +plat=splat; plon=splon +call gtoframev(plat,plon, xp,yp,zp) +sxp=xp; syp=yp; szp=zp +end subroutine sgtoframev +!============================================================================== +subroutine gtoframev(plat,plon, xp,yp,zp)! [gtoframe] +!============================================================================== +! Given a geographical point by its degrees lat and lon, plat and plon, +! return its standard orthogonal cartesian frame, {xp,yp,zp} in earth-centered +! coordinates. +!============================================================================= +use pietc, only: u0,u1 +real(dp), intent(in ):: plat,plon +real(dp),dimension(3),intent(out):: xp,yp,zp +!------------------------------------------------------------------------------ +real(dp),dimension(3):: dzpdlat,dzpdlon +!============================================================================== +if(plat==90)then ! is this the north pole? + xp=(/ u0,u1, u0/) ! Assume the limiting case lat-->90 along the 0-meridian + yp=(/-u1,u0, u0/) ! + zp=(/ u0,u0, u1/) +elseif(plat==-90)then + xp=(/ u0,u1, u0/) ! Assume the limiting case lat-->90 along the 0-meridian + yp=(/ u1,u0, u0/) ! + zp=(/ u0,u0,-u1/) +else + call gtoc(plat,plon,zp,dzpdlat,dzpdlon) + xp=dzpdlon/sqrt(dot_product(dzpdlon,dzpdlon)) + yp=dzpdlat/sqrt(dot_product(dzpdlat,dzpdlat)) +endif +end subroutine gtoframev + +!============================================================================== +subroutine sparaframe(sxp,syp,szp, sxv,syv,szv)! [paraframe] +!============================================================================== +real(sp),dimension(3),intent(in ):: sxp,syp,szp, szv +real(sp),dimension(3),intent(out):: sxv,syv +!----------------------------------------------------------------------------- +real(dp),dimension(3):: xp,yp,zp, xv,yv,zv +!============================================================================= +xp=sxp; yp=syp; zp=szp +call paraframe(xp,yp,zp, xv,yv,zv) +sxv=xv; syv=yv +end subroutine sparaframe +!============================================================================== +subroutine paraframe(xp,yp,zp, xv,yv,zv)! [paraframe] +!============================================================================== +! Take a principal reference orthonormal frame, {xp,yp,zp} and a dependent +! point defined by unit vector, zv, and complete the V-frame cartesian +! components, {xv,yv}, that are the result of parallel-transport of {xp,yp} +! along the geodesic between P and V +!============================================================================== +use pmat4, only: cross_product,normalized +real(dp),dimension(3),intent(in ):: xp,yp,zp, zv +real(dp),dimension(3),intent(out):: xv,yv +!------------------------------------------------------------------------------ +real(dp) :: xpofv,ypofv,theta,ctheta,stheta +real(dp),dimension(3):: xq,yq +!============================================================================== +xpofv=dot_product(xp,zv) +ypofv=dot_product(yp,zv) +theta=atan2(ypofv,xpofv); ctheta=cos(theta); stheta=sin(theta) +xq=zv-zp; xq=xq-zv*dot_product(xq,zv); xq=normalized(xq) +yq=cross_product(zv,xq) +xv=xq*ctheta-yq*stheta +yv=xq*stheta+yq*ctheta +end subroutine paraframe + +!============================================================================== +subroutine sframetwist(sxp,syp,szp, sxv,syv,szv, stwist)! [frametwist] +!============================================================================== +real(sp),dimension(3),intent(in ):: sxp,syp,szp, sxv,syv,szv +real(sp), intent(out):: stwist +!------------------------------------------------------------------------------ +real(dp),dimension(3):: xp,yp,zp, xv,yv,zv +real(dp) :: twist +!============================================================================== +xp=sxp;yp=syp; zp=szp; xv=sxv; yv=syv; zv=szv +call frametwist(xp,yp,zp, xv,yv,zv, twist) +stwist=twist +end subroutine sframetwist +!============================================================================== +subroutine frametwist(xp,yp,zp, xv,yv,zv, twist)! [frametwist] +!============================================================================== +! Given a principal cartesian orthonormal frame, {xp,yp,zp} (i.e., at P with +! Earth-centered cartesians, zp), and another similar frame {xv,yv,zv} at V +! with Earth-centered cartesians zv, find the relative rotation angle, "twist" +! by which the frame at V is rotated in the counterclockwise sense relative +! to the parallel-transportation of P's frame to V. +! Note that, by symmetry, transposing P and V leads to the opposite twist. +!============================================================================== +real(dp),dimension(3),intent(in ):: xp,yp,zp, xv,yv,zv +real(dp), intent(out):: twist +!------------------------------------------------------------------------------ +real(dp),dimension(3):: xxv,yyv +real(dp) :: c,s +!============================================================================== +call paraframe(xp,yp,zp, xxv,yyv,zv) +c=dot_product(xv,xxv); s=dot_product(xv,yyv) +twist=atan2(s,c) +end subroutine frametwist + +!============================================================================= +subroutine sctoc(s,xc1,xc2)! [ctoc_schm] +!============================================================================= +! Evaluate schmidt transformation, xc1 --> xc2, with scaling parameter s +!============================================================================= +real(sp), intent(IN ):: s +real(sp),dimension(3),intent(INOUT):: xc1,xc2 +!----------------------------------------------------------------------------- +real(sp) :: x,y,z,a,b,d,e,ab2,aa,bb,di,aapbb,aambb +!============================================================================= +x=xc1(1); y=xc1(2); z=xc1(3) +a=s+1 +b=s-1 +ab2=a*b*2 +aa=a*a +bb=b*b +aapbb=aa+bb +aambb=aa-bb +d=aapbb-ab2*z +e=aapbb*z-ab2 +di=1/d +xc2(1)=(aambb*x)*di +xc2(2)=(aambb*y)*di +xc2(3)=e*di +end subroutine sctoc + +!============================================================================= +subroutine sctocd(s,xc1,xc2,dxc2)! [ctoc_schm] +!============================================================================= +! Evaluate schmidt transformation, xc1 --> xc2, with scaling parameter s, +! and its jacobian, dxc2. +!============================================================================= +real(sp),intent(IN) :: s +real(sp),dimension(3), intent(INOUT):: xc1,xc2 +real(sp),dimension(3,3),intent( OUT):: dxc2 +!----------------------------------------------------------------------------- +real(sp) :: x,y,z,a,b,d,e, & + ab2,aa,bb,di,ddi,aapbb,aambb +!============================================================================= +x=xc1(1); y=xc1(2); z=xc1(3) +a=s+1 +b=s-1 +ab2=a*b*2 +aa=a*a +bb=b*b +aapbb=aa+bb +aambb=aa-bb +d=aapbb-ab2*z +e=aapbb*z-ab2 +di=1/d +xc2(1)=(aambb*x)*di +xc2(2)=(aambb*y)*di +xc2(3)=e*di +ddi=di*di + +dxc2=0 +dxc2(1,1)=aambb*di +dxc2(1,3)=ab2*aambb*x*ddi +dxc2(2,2)=aambb*di +dxc2(2,3)=ab2*aambb*y*ddi +dxc2(3,3)=aapbb*di +ab2*e*ddi +end subroutine sctocd + +!============================================================================= +subroutine sctocdd(s,xc1,xc2,dxc2,ddxc2)! [ctoc_schm] +!============================================================================= +! Evaluate schmidt transformation, xc1 --> xc2, with scaling parameter s, +! its jacobian, dxc2, and its 2nd derivative, ddxc2. +!============================================================================= +real(sp), intent(IN ):: s +real(sp),dimension(3), intent(INOUT):: xc1,xc2 +real(sp),dimension(3,3), intent( OUT):: dxc2 +real(sp),dimension(3,3,3),intent( OUT):: ddxc2 +!----------------------------------------------------------------------------- +real(sp) :: x,y,z,a,b,d,e, & + ab2,aa,bb,di,ddi,dddi, & + aapbb,aambb +!============================================================================= +x=xc1(1); y=xc1(2); z=xc1(3) +a=s+1 +b=s-1 +ab2=a*b*2 +aa=a*a +bb=b*b +aapbb=aa+bb +aambb=aa-bb +d=aapbb-ab2*z +e=aapbb*z-ab2 +di=1/d +xc2(1)=(aambb*x)*di +xc2(2)=(aambb*y)*di +xc2(3)=e*di +ddi=di*di +dddi=ddi*di + +dxc2=0 +dxc2(1,1)=aambb*di +dxc2(1,3)=ab2*aambb*x*ddi +dxc2(2,2)=aambb*di +dxc2(2,3)=ab2*aambb*y*ddi +dxc2(3,3)=aapbb*di +ab2*e*ddi + +ddxc2=0 +ddxc2(1,1,3)=ab2*aambb*ddi +ddxc2(1,3,1)=ddxc2(1,1,3) +ddxc2(1,3,3)=2*ab2**2*aambb*x*dddi +ddxc2(2,2,3)=ab2*aambb*ddi +ddxc2(2,3,2)=ddxc2(2,2,3) +ddxc2(2,3,3)=2*ab2**2*aambb*y*dddi +ddxc2(3,3,3)=2*ab2*(aapbb*ddi+ab2*e*dddi) +end subroutine sctocdd + +!============================================================================= +subroutine dctoc(s,xc1,xc2)! [ctoc_schm] +!============================================================================= +! Evaluate schmidt transformation, xc1 --> xc2, with scaling parameter s +!============================================================================= +real(dp), intent(IN ):: s +real(dp),dimension(3),intent(INOUT):: xc1,xc2 +!----------------------------------------------------------------------------- +real(dp) :: x,y,z,a,b,d,e, & + ab2,aa,bb,di,aapbb,aambb +!============================================================================= +x=xc1(1); y=xc1(2); z=xc1(3) +a=s+1 +b=s-1 +ab2=a*b*2 +aa=a*a +bb=b*b +aapbb=aa+bb +aambb=aa-bb +d=aapbb-ab2*z +e=aapbb*z-ab2 +di=1/d +xc2(1)=(aambb*x)*di +xc2(2)=(aambb*y)*di +xc2(3)=e*di +end subroutine dctoc + +!============================================================================= +subroutine dctocd(s,xc1,xc2,dxc2)! [ctoc_schm] +!============================================================================= +! Evaluate schmidt transformation, xc1 --> xc2, with scaling parameter s, +! and its jacobian, dxc2. +!============================================================================= +real(dp), intent(IN ):: s +real(dp),dimension(3), intent(INOUT):: xc1,xc2 +real(dp),dimension(3,3),intent( OUT):: dxc2 +!----------------------------------------------------------------------------- +real(dp) :: x,y,z,a,b,d,e, & + ab2,aa,bb,di,ddi,aapbb,aambb +!============================================================================= +x=xc1(1); y=xc1(2); z=xc1(3) +a=s+1 +b=s-1 +ab2=a*b*2 +aa=a*a +bb=b*b +aapbb=aa+bb +aambb=aa-bb +d=aapbb-ab2*z +e=aapbb*z-ab2 +di=1/d +xc2(1)=(aambb*x)*di +xc2(2)=(aambb*y)*di +xc2(3)=e*di +ddi=di*di + +dxc2=0 +dxc2(1,1)=aambb*di +dxc2(1,3)=ab2*aambb*x*ddi +dxc2(2,2)=aambb*di +dxc2(2,3)=ab2*aambb*y*ddi +dxc2(3,3)=aapbb*di +ab2*e*ddi +end subroutine dctocd + +!============================================================================= +subroutine dctocdd(s,xc1,xc2,dxc2,ddxc2)! [ctoc_schm] +!============================================================================= +! Evaluate schmidt transformation, xc1 --> xc2, with scaling parameter s, +! its jacobian, dxc2, and its 2nd derivative, ddxc2. +!============================================================================= +real(dp),intent(IN) :: s +real(dp),dimension(3), intent(INOUT):: xc1,xc2 +real(dp),dimension(3,3), intent(OUT ):: dxc2 +real(dp),dimension(3,3,3),intent(OUT ):: ddxc2 +!----------------------------------------------------------------------------- +real(dp) :: x,y,z,a,b,d,e, & + ab2,aa,bb,di,ddi,dddi, & + aapbb,aambb +!============================================================================= +x=xc1(1); y=xc1(2); z=xc1(3) +a=s+1 +b=s-1 +ab2=a*b*2 +aa=a*a +bb=b*b +aapbb=aa+bb +aambb=aa-bb +d=aapbb-ab2*z +e=aapbb*z-ab2 +di=1/d +xc2(1)=(aambb*x)*di +xc2(2)=(aambb*y)*di +xc2(3)=e*di +ddi=di*di +dddi=ddi*di + +dxc2=0 +dxc2(1,1)=aambb*di +dxc2(1,3)=ab2*aambb*x*ddi +dxc2(2,2)=aambb*di +dxc2(2,3)=ab2*aambb*y*ddi +dxc2(3,3)=aapbb*di +ab2*e*ddi + +ddxc2=0 +ddxc2(1,1,3)=ab2*aambb*ddi +ddxc2(1,3,1)=ddxc2(1,1,3) +ddxc2(1,3,3)=2*ab2**2*aambb*x*dddi +ddxc2(2,2,3)=ab2*aambb*ddi +ddxc2(2,3,2)=ddxc2(2,2,3) +ddxc2(2,3,3)=2*ab2**2*aambb*y*dddi +ddxc2(3,3,3)=2*ab2*(aapbb*ddi+ab2*e*dddi) +end subroutine dctocdd + +!============================================================================= +subroutine plrot(rot3,n,x,y,z)! [plrot] +!============================================================================= +! Apply a constant rotation to a three dimensional polyline +!============================================================================= +integer, intent(IN ):: n +real(sp),dimension(3,3),intent(IN ):: rot3 +real(sp),dimension(n), intent(INOUT):: x,y,z +!----------------------------------------------------------------------------- +real(sp),dimension(3) :: t +integer :: k +!============================================================================= +do k=1,n + t(1)=x(k); t(2)=y(k); t(3)=z(k) + t=matmul(rot3,t) + x(k)=t(1); y(k)=t(2); z(k)=t(3) +enddo +end subroutine plrot + +!============================================================================= +subroutine plroti(rot3,n,x,y,z)! [plroti] +!============================================================================= +! Invert the rotation of a three-dimensional polyline +!============================================================================= +integer, intent(IN ):: n +real(sp),dimension(3,3),intent(IN ):: rot3 +real(sp),dimension(n), intent(INOUT):: x,y,z +!----------------------------------------------------------------------------- +real(sp),dimension(3) :: t +integer :: k +!============================================================================= +do k=1,n + t(1)=x(k); t(2)=y(k); t(3)=z(k) + t=matmul(t,rot3) + x(k)=t(1); y(k)=t(2); z(k)=t(3) +enddo +end subroutine plroti + +!============================================================================= +subroutine dplrot(rot3,n,x,y,z)! [plrot] +!============================================================================= +! Apply a constant rotation to a three dimensional polyline +!============================================================================= +integer, intent(IN ):: n +real(dP),dimension(3,3),intent(IN ):: rot3 +real(dP),dimension(n), intent(INOUT):: x,y,z +!----------------------------------------------------------------------------- +real(dP),dimension(3) :: t +integer :: k +!============================================================================= +do k=1,n + t(1)=x(k); t(2)=y(k); t(3)=z(k) + t=matmul(rot3,t) + x(k)=t(1); y(k)=t(2); z(k)=t(3) +enddo +end subroutine dplrot + +!============================================================================= +subroutine dplroti(rot3,n,x,y,z)! [plroti] +!============================================================================= +! Invert the rotation of a three-dimensional polyline +!============================================================================= +integer, intent(IN ):: n +real(dP),dimension(3,3),intent(IN ):: rot3 +real(dP),dimension(n), intent(INOUT):: x,y,z +!----------------------------------------------------------------------------- +real(dP),dimension(3) :: t +integer :: k +!============================================================================= +do k=1,n + t(1)=x(k); t(2)=y(k); t(3)=z(k) + t=matmul(t,rot3) + x(k)=t(1); y(k)=t(2); z(k)=t(3) +enddo +end subroutine dplroti + +!============================================================================= +subroutine plctoc(s,n,x,y,z)! [plctoc] +!============================================================================= +! Perform schmidt transformation with scaling parameter s to a polyline +!============================================================================= +integer, intent(IN ):: n +real(sp), intent(IN ):: s +real(sp),dimension(n),intent(INOUT):: x,y,z +!----------------------------------------------------------------------------- +real(sp) :: a,b,d,e,ab2,aa,bb,di,aapbb,aambb +integer :: i +!============================================================================= +a=s+1 +b=s-1 +ab2=a*b*2 +aa=a*a +bb=b*b +aapbb=aa+bb +aambb=aa-bb +do i=1,n + d=aapbb-ab2*z(i) + e=aapbb*z(i)-ab2 + di=1/d + x(i)=(aambb*x(i))*di + y(i)=(aambb*y(i))*di + z(i)=e*di +enddo +end subroutine plctoc + +end module pmat5 + + + diff --git a/sorc/regional_grid.fd/psym2.f90 b/sorc/regional_grid.fd/psym2.f90 new file mode 100644 index 000000000..3b6459047 --- /dev/null +++ b/sorc/regional_grid.fd/psym2.f90 @@ -0,0 +1,498 @@ +! *********************************** +! * module psym2 * +! * R. J. Purser * +! * NOAA/NCEP/EMC September 2018 * +! * jim.purser@noaa.gov * +! *********************************** +! +! A suite of routines to perform the eigen-decomposition of symmetric 2*2 +! matrices and to deliver basic analytic functions, and the derivatives +! of these functions, of such matrices. +! +! DIRECT DEPENDENCIES +! Module: pkind, pietc +! +!============================================================================= +module psym2 +!============================================================================= +use pkind, only: dp +use pietc, only: u0,u1,o2 +implicit none +private +public:: eigensym2,invsym2,sqrtsym2,expsym2,logsym2,id2222 + +real(dp),dimension(2,2,2,2):: id +data id/u1,u0,u0,u0, u0,o2,o2,u0, u0,o2,o2,u0, u0,u0,u0,u1/! Effective identity + +interface eigensym2; module procedure eigensym2,eigensym2d; end interface +interface invsym2; module procedure invsym2,invsym2d; end interface +interface sqrtsym2; module procedure sqrtsym2,sqrtsym2d; end interface +interface sqrtsym2d_e; module procedure sqrtsym2d_e; end interface +interface sqrtsym2d_t; module procedure sqrtsym2d_t; end interface +interface expsym2; module procedure expsym2,expsym2d; end interface +interface expsym2d_e; module procedure expsym2d_e; end interface +interface expsym2d_t; module procedure expsym2d_t; end interface +interface logsym2; module procedure logsym2,logsym2d ; end interface +interface logsym2d_e; module procedure logsym2d_e; end interface +interface logsym2d_t; module procedure logsym2d_t; end interface +interface id2222; module procedure id2222; end interface + +contains + +!============================================================================= +subroutine eigensym2(em,vv,oo)! [eigensym2] +!============================================================================= +! Get the orthogonal eigenvectors, vv, and diagonal matrix of eigenvalues, oo, +! of the symmetric 2*2 matrix, em. +!============================================================================= +real(dp),dimension(2,2),intent(in ):: em +real(dp),dimension(2,2),intent(out):: vv,oo +!----------------------------------------------------------------------------- +real(dp):: a,b,c,d,e,f,g,h +!============================================================================= +a=em(1,1); b=em(1,2); c=em(2,2) +d=a*c-b*b! <- det(em) +e=(a+c)/2; f=(a-c)/2 +h=sqrt(f**2+b**2) +g=sqrt(b**2+(h+abs(f))**2) +if (g==0)then; vv(:,1)=(/u1,u0/) +elseif(f> 0)then; vv(:,1)=(/h+f,b/)/g +else ; vv(:,1)=(/b,h-f/)/g +endif +vv(:,2)=(/-vv(2,1),vv(1,1)/) +oo=matmul(transpose(vv),matmul(em,vv)) +oo(1,2)=u0; oo(2,1)=u0 +end subroutine eigensym2 +!============================================================================= +subroutine eigensym2d(em,vv,oo,vvd,ood,ff)! [eigensym2] +!============================================================================= +! For a symmetric 2*2 matrix, em, return the normalized eigenvectors, vv, and +! the diagonal matrix of eigenvalues, oo. If the two eigenvalues are equal, +! proceed no further and raise the logical failure flagg, ff, to .true.; +! otherwise, return with vvd=d(vv)/d(em) and ood=d(oo)/d(em) and ff=.false., +! and maintain the symmetries between the last two of the indices of +! these derivatives. +!============================================================================= +real(dp),dimension(2,2), intent(in ):: em +real(dp),dimension(2,2), intent(out):: vv,oo +real(dp),dimension(2,2,2,2),intent(out):: vvd,ood +logical, intent(out):: ff +!----------------------------------------------------------------------------- +real(dp),dimension(2,2):: emd,tt,vvr +real(dp) :: oodif,dtheta +integer :: i,j +!============================================================================= +call eigensym2(em,vv,oo); vvr(1,:)=-vv(2,:); vvr(2,:)=vv(1,:) +oodif=oo(1,1)-oo(2,2); ff=oodif==u0; if(ff)return +ood=0 +vvd=0 +do j=1,2 + do i=1,2 + emd=0 + if(i==j)then + emd(i,j)=u1 + else + emd(i,j)=o2; emd(j,i)=o2 + endif + tt=matmul(transpose(vv),matmul(emd,vv)) + ood(1,1,i,j)=tt(1,1) + ood(2,2,i,j)=tt(2,2) + dtheta=tt(1,2)/oodif + vvd(:,:,i,j)=vvr*dtheta + enddo +enddo +end subroutine eigensym2d + +!============================================================================= +subroutine invsym2(em,z)! [invsym2] +!============================================================================= +! Get the inverse of a 2*2 matrix (need not be symmetric in this case). +!============================================================================= +real(dp),dimension(2,2),intent(in ):: em +real(dp),dimension(2,2),intent(out):: z +!----------------------------------------------------------------------------- +real(dp):: detem +!============================================================================= +z(1,1)=em(2,2); z(2,1)=-em(2,1); z(1,2)=-em(1,2); z(2,2)=em(1,1) +detem=em(1,1)*em(2,2)-em(2,1)*em(1,2) +z=z/detem +end subroutine invsym2 +!============================================================================= +subroutine invsym2d(em,z,zd)! [invsym2] +!============================================================================= +! Get the inverse, z,of a 2*2 symmetric matrix, em, and its derivative, zd, +! with respect to symmetric variations of its components. I.e., for a +! symmetric infinitesimal change, delta_em, in em, the resulting +! infinitesimal change in z would be: +! delta_z(i,j) = matmul(zd(i,j,:,:),delta_em) +!============================================================================= +real(dp),dimension(2,2) ,intent(in ):: em +real(dp),dimension(2,2) ,intent(out):: z +real(dp),dimension(2,2,2,2),intent(out):: zd +!----------------------------------------------------------------------------- +integer:: k,l +!============================================================================= +call invsym2(em,z) +call id2222(zd) +do l=1,2; do k=1,2 + zd(:,:,k,l)=-matmul(matmul(z,zd(:,:,k,l)),z) +enddo; enddo +end subroutine invsym2d + +!============================================================================= +subroutine sqrtsym2(em,z)! [sqrtsym2] +!============================================================================= +! Get the sqrt of a symmetric positive-definite 2*2 matrix +!============================================================================= +real(dp),dimension(2,2),intent(in ):: em +real(dp),dimension(2,2),intent(out):: z +!----------------------------------------------------------------------------- +real(dp),dimension(2,2):: vv,oo +integer :: i +!============================================================================= +call eigensym2(em,vv,oo) +do i=1,2 +if(oo(i,i)<0)stop 'In sqrtsym2; matrix em is not non-negative' +oo(i,i)=sqrt(oo(i,i)); enddo +z=matmul(vv,matmul(oo,transpose(vv))) +end subroutine sqrtsym2 + +!============================================================================= +subroutine sqrtsym2d(x,z,zd)! [sqrtsym2] +!============================================================================= +! General routine to evaluate z=sqrt(x), and the symmetric +! derivative, zd = dz/dx, where x is a symmetric 2*2 positive-definite +! matrix. If the eigenvalues are very close together, extract their +! geometric mean for "preconditioning" a scaled version, px, of x, whose +! sqrt, and hence its derivative, can be easily obtained by the series +! expansion method. Otherwise, use the eigen-method (which entails dividing +! by the difference in the eignevalues to get zd, and which therefore +! fails when the eigenvalues become too similar). +!============================================================================= +real(dp),dimension(2,2), intent(in ):: x +real(dp),dimension(2,2), intent(out):: z +real(dp),dimension(2,2,2,2),intent(out):: zd +!----------------------------------------------------------------------------- +real(dp),dimension(2,2):: px +real(dp) :: rdetx,lrdetx,htrpxs,q +!============================================================================= +rdetx=sqrt(x(1,1)*x(2,2)-x(1,2)*x(2,1)) ! <- sqrt(determinant of x) +lrdetx=sqrt(rdetx) +px=x/rdetx ! <- preconditioned x (has unit determinant) +htrpxs= ((px(1,1)+px(2,2))/2)**2 ! <- {half-trace-px}-squared +q=htrpxs-u1 +if(q<.05)then ! <- Taylor expansion method + call sqrtsym2d_t(px,z,zd) + z=z*lrdetx; zd=zd/lrdetx +else + call sqrtsym2d_e(x,z,zd) ! <- Eigen-method +endif +end subroutine sqrtsym2d + +!============================================================================= +subroutine sqrtsym2d_e(x,z,zd)! [sqrtsym2d_e] +!============================================================================= +real(dp),dimension(2,2), intent(in ):: x +real(dp),dimension(2,2), intent(out):: z +real(dp),dimension(2,2,2,2),intent(out):: zd +!----------------------------------------------------------------------------- +real(dp),dimension(2,2,2,2):: vvd,ood +real(dp),dimension(2,2) :: vv,oo,oori,tt +integer :: i,j +logical :: ff +!============================================================================= +call eigensym2(x,vv,oo,vvd,ood,ff) +z=u0; z(1,1)=sqrt(oo(1,1)); z(2,2)=sqrt(oo(2,2)) +z=matmul(matmul(vv,z),transpose(vv)) +oori=0; oori(1,1)=u1/sqrt(oo(1,1)); oori(2,2)=u1/sqrt(oo(2,2)) +do j=1,2 +do i=1,2 + tt=matmul(vvd(:,:,i,j),transpose(vv)) + zd(:,:,i,j)=o2*matmul(matmul(matmul(vv,ood(:,:,i,j)),oori),transpose(vv))& + +matmul(tt,z)-matmul(z,tt) +enddo +enddo +end subroutine sqrtsym2d_e + +!============================================================================= +subroutine sqrtsym2d_t(x,z,zd)! [sqrtsym2d_t] +!============================================================================= +! Use the Taylor-series method (eigenvalues both fairly close to unity). +! For a 2*2 positive definite symmetric matrix x, try to get both the z=sqrt(x) +! and dz/dx using the binomial-expansion method applied to the intermediate +! matrix, r = (x-1). ie z=sqrt(x) = (1+r)^{1/2} = I + (1/2)*r -(1/8)*r^2 ... +! + [(-)^n *(2n)!/{(n+1)! * n! *2^{2*n-1}} ]*r^{n+1} +!============================================================================= +real(dp),dimension(2,2), intent(in ):: x +real(dp),dimension(2,2), intent(out):: z +real(dp),dimension(2,2,2,2),intent(out):: zd +!----------------------------------------------------------------------------- +integer,parameter :: nit=300 ! number of iterative increments allowed +real(dp),parameter :: crit=1.e-17 +real(dp),dimension(2,2) :: r,rp,rd,rpd +real(dp) :: c +integer :: i,j,n +!============================================================================= +r=x; r(1,1)=x(1,1)-1; r(2,2)=x(2,2)-1 +z=0; z(1,1)=u1; z(2,2)=u1 +rp=r +c=o2 +do n=0,nit + z=z+c*rp + rp=matmul(rp,r) + if(sum(abs(rp)) lx = ly = + a = + k = / diff --git a/ush/valid_param_vals.sh b/ush/valid_param_vals.sh index b4214486f..fbd0cbb6f 100644 --- a/ush/valid_param_vals.sh +++ b/ush/valid_param_vals.sh @@ -33,8 +33,8 @@ valid_vals_CCPP_PHYS_SUITE=( \ "FV3_RRFS_v0" ) valid_vals_OZONE_PARAM_NO_CCPP=("ozphys_2015" "ozphys") valid_vals_GFDLgrid_RES=("48" "96" "192" "384" "768" "1152" "3072") -valid_vals_EXTRN_MDL_NAME_ICS=("GSMGFS" "FV3GFS" "RAPX" "HRRRX" "NAM") -valid_vals_EXTRN_MDL_NAME_LBCS=("GSMGFS" "FV3GFS" "RAPX" "HRRRX" "NAM") +valid_vals_EXTRN_MDL_NAME_ICS=("GSMGFS" "FV3GFS" "RAPX" "HRRRX") +valid_vals_EXTRN_MDL_NAME_LBCS=("GSMGFS" "FV3GFS" "RAPX" "HRRRX") valid_vals_FV3GFS_FILE_FMT_ICS=("nemsio" "grib2") valid_vals_FV3GFS_FILE_FMT_LBCS=("nemsio" "grib2") valid_vals_GRID_GEN_METHOD=("GFDLgrid" "ESGgrid") From 91cba4b0b9c4182a1312350a70c867e4952bf809 Mon Sep 17 00:00:00 2001 From: gsketefian <31046882+gsketefian@users.noreply.github.com> Date: Mon, 14 Sep 2020 15:35:10 -0600 Subject: [PATCH 15/19] Fix else-statement bug in make_orog task; fix model_config bug for ensemble forecasts; remove obsolete physics suites; get WE2E tests to run on cheyenne (#287) ## DESCRIPTION OF CHANGES: ### Bugs fixed: * In exregional_make_orog.sh, remove the else-statement that causes the script to exit if the suite is not FV3_RRFS_v1beta. * In exregional_run_fcst.sh, remove lines that create a symlink in the run directory to the model_configure file in the cycle directory. These lines seem to have been inadvertantly reintroduced into the script and cause ensemble forecasts to fail. ### Other modifications: * Remove suites FV3_GSD_SAR_v1 and FV3_RRFS_v0 from workflow since they are no longer in ufs-weather-model. Also remove the WE2E test configuration files for these suites (config.regional_013.sh and config.regional_016.sh). * In exregional_make_orog.sh, for the RRFS_v1beta suite, modify the command that copies the orography statistics files needed by the drag parameterization such that only files matching *_ls*.nc and *_ss*.nc are copied instead of everything (because the source directory may contain other files that do not need to be copied). * In the WE2E configuration file for the RRFS_v1beta suite (config.FV3_RRFS_v1beta.sh), change the location where the additional orography files needed by this suite are copied from to a common location rather than a user directory. * Remove unused script create_model_config_files.sh. * Rename the function (and file) create_model_config_file(.sh) to create_model_configure_file(.sh) because the file that this function creates is called model_configure, not model_config. * Modify WE2E test configuration files as well as the test run script (tests/run_experiments.sh) to get the tests to run more easily on cheyenne. Still need to make a manual change to the settings in run_experiments.sh, but this made it possible to run the tests. ## TESTS CONDUCTED: Ran all 26 WE2E tests both **on hera and cheyenne**. 24 of the 26 succeeded. Details: * regional_010 failed, but it was already broken. * user_download_extrn_files failed. It seems to have failed to obtain the external model files from NOMADS (and this step is done during workflow generation, not as part of any workflow task). This test is completely unrelated to this PR, so the failure may have already existed in the develop branch. * The remaining 24 tests (including the one for the FV3_RRFS_v1beta suite) succeeded without problems. Note that the FV3_RRFS_v1beta suite was also tested on the GSD_HRRR3km grid. This failed at around hour 4 (for a 6-hour forecast) with a very non-informative error. This test was also tried previously with hash 8165575 from the NCAR fork of ufs-weather-model (in the dtc/develop branch), and that finished successfully. Not clear what changed between these two versions of ufs-weather-model. ## OTHER CONTRIBUTORS: @JeffBeck-NOAA --- scripts/exregional_make_ics.sh | 12 +- scripts/exregional_make_lbcs.sh | 8 +- scripts/exregional_make_orog.sh | 10 +- scripts/exregional_run_fcst.sh | 29 +- .../config.FV3_RRFS_v1beta.sh | 7 +- tests/baseline_configs/config.GSD_RAP13km.sh | 5 - .../config.community_ensemble_008mems.sh | 5 - .../config.community_ensemble_2mems.sh | 5 - .../config.nco_GSD_HRRR3km_FV3GFS_FV3GFS.sh | 28 -- .../config.nco_GSD_HRRR3km_HRRRX_RAPX.sh | 30 -- tests/baseline_configs/config.nco_conus.sh | 15 - .../baseline_configs/config.nco_conus_c96.sh | 15 - tests/baseline_configs/config.nco_ensemble.sh | 15 - tests/baseline_configs/config.new_ESGgrid.sh | 34 +-- tests/baseline_configs/config.regional_001.sh | 5 - tests/baseline_configs/config.regional_002.sh | 5 - tests/baseline_configs/config.regional_003.sh | 5 - tests/baseline_configs/config.regional_004.sh | 5 - tests/baseline_configs/config.regional_005.sh | 5 - tests/baseline_configs/config.regional_006.sh | 14 - tests/baseline_configs/config.regional_007.sh | 5 - tests/baseline_configs/config.regional_008.sh | 5 - tests/baseline_configs/config.regional_009.sh | 14 - tests/baseline_configs/config.regional_010.sh | 5 - tests/baseline_configs/config.regional_011.sh | 5 - tests/baseline_configs/config.regional_012.sh | 5 - tests/baseline_configs/config.regional_013.sh | 47 --- tests/baseline_configs/config.regional_014.sh | 4 - tests/baseline_configs/config.regional_015.sh | 5 - tests/baseline_configs/config.regional_016.sh | 47 --- .../config.user_download_extrn_files.sh | 5 - .../config.user_staged_extrn_files.sh | 11 - tests/baselines_list.txt | 4 +- tests/run_experiments.sh | 288 +++++++++++++++++- ush/config_defaults.sh | 6 +- ush/create_model_config_files.sh | 182 ----------- ...file.sh => create_model_configure_file.sh} | 15 +- ush/generate_FV3LAM_wflow.sh | 2 - ush/launch_FV3LAM_wflow.sh | 6 +- ush/link_fix.sh | 27 +- ush/set_extrn_mdl_params.sh | 148 ++++----- ush/setup.sh | 28 +- ush/templates/FV3.input.yml | 12 - ush/valid_param_vals.sh | 8 +- 44 files changed, 419 insertions(+), 722 deletions(-) delete mode 100644 tests/baseline_configs/config.regional_013.sh delete mode 100644 tests/baseline_configs/config.regional_016.sh mode change 100755 => 100644 tests/baseline_configs/config.user_download_extrn_files.sh delete mode 100644 ush/create_model_config_files.sh rename ush/{create_model_config_file.sh => create_model_configure_file.sh} (94%) diff --git a/scripts/exregional_make_ics.sh b/scripts/exregional_make_ics.sh index 78ea18949..661918690 100755 --- a/scripts/exregional_make_ics.sh +++ b/scripts/exregional_make_ics.sh @@ -107,7 +107,7 @@ case "${CCPP_PHYS_SUITE}" in "FV3_GFS_2017_gfdlmp" | "FV3_GFS_2017_gfdlmp_regional" ) phys_suite="GFS" ;; -"FV3_GSD_v0" | "FV3_GSD_SAR" | "FV3_GSD_SAR_v1" |"FV3_RRFS_v0" |"FV3_RRFS_v1beta") +"FV3_GSD_v0" | "FV3_GSD_SAR" | "FV3_RRFS_v1beta") phys_suite="GSD" ;; "FV3_CPT_v0") @@ -305,8 +305,6 @@ case "${EXTRN_MDL_NAME_ICS}" in [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then tracers="[\"sphum\",\"liq_wat\",\"o3mr\",\"ice_wat\",\"rainwat\",\"snowwat\",\"graupel\"]" elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then # For GSD physics, add three additional tracers (the ice, rain and water @@ -371,8 +369,6 @@ HRRRX grib2 files created after about \"${cdate_min_HRRRX}\"..." if [ "${USE_CCPP}" = "TRUE" ]; then if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ @@ -396,6 +392,8 @@ of external model (EXTRN_MDL_NAME_ICS) and physics suite (CCPP_PHYS_SUITE): geogrid_file_input_grid="/scratch2/BMC/det/beck/FV3-LAM/geo_em.d01.nc_HRRRX" elif [ "${MACHINE}" = "JET" ]; then geogrid_file_input_grid="/misc/whome/rtrr/HRRR/static/WPS/geo_em.d01.nc" + elif [ "${MACHINE}" = "CHEYENNE" ]; then + geogrid_file_input_grid="/glade/p/ral/jntp/UFS_CAM/fix/geo_em.d01.nc_HRRRX" fi replace_vgtyp=False @@ -419,8 +417,6 @@ of external model (EXTRN_MDL_NAME_ICS) and physics suite (CCPP_PHYS_SUITE): if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then @@ -443,6 +439,8 @@ of external model (EXTRN_MDL_NAME_ICS) and physics suite (CCPP_PHYS_SUITE): geogrid_file_input_grid="/scratch2/BMC/det/beck/FV3-LAM/geo_em.d01.nc_RAPX" elif [ "${MACHINE}" = "JET" ]; then geogrid_file_input_grid="/misc/whome/rtrr/HRRR/static/WPS/geo_em.d01.nc" + elif [ "${MACHINE}" = "CHEYENNE" ]; then + geogrid_file_input_grid="/glade/p/ral/jntp/UFS_CAM/fix/geo_em.d01.nc_RAPX" fi replace_vgtyp=False diff --git a/scripts/exregional_make_lbcs.sh b/scripts/exregional_make_lbcs.sh index 31b37a623..a284aa18b 100755 --- a/scripts/exregional_make_lbcs.sh +++ b/scripts/exregional_make_lbcs.sh @@ -107,7 +107,7 @@ case "${CCPP_PHYS_SUITE}" in "FV3_GFS_2017_gfdlmp" | "FV3_GFS_2017_gfdlmp_regional") phys_suite="GFS" ;; -"FV3_GSD_v0" | "FV3_GSD_SAR" | "FV3_GSD_SAR_v1" | "FV3_RRFS_v0" | "FV3_RRFS_v1beta" ) +"FV3_GSD_v0" | "FV3_GSD_SAR" | "FV3_RRFS_v1beta" ) phys_suite="GSD" ;; "FV3_CPT_v0" ) @@ -236,7 +236,7 @@ input_type="" tracers_input="\"\"" tracers="\"\"" numsoil_out="" -geogrid_file_input_grid="\"\"" +#geogrid_file_input_grid="\"\"" replace_vgtyp="" replace_sotyp="" replace_vgfrc="" @@ -288,8 +288,6 @@ case "${EXTRN_MDL_NAME_LBCS}" in [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then tracers="[\"sphum\",\"liq_wat\",\"o3mr\",\"ice_wat\",\"rainwat\",\"snowwat\",\"graupel\"]" elif [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then # For GSD physics, add three additional tracers (the ice, rain and water @@ -340,8 +338,6 @@ and FV3GFS file type (FV3GFS_FILE_FMT_LBCS): if [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_2017_gfdlmp_regional" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_CPT_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v15p2" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GFS_v16beta" ]; then diff --git a/scripts/exregional_make_orog.sh b/scripts/exregional_make_orog.sh index 9b7684ad0..1d1f5586e 100755 --- a/scripts/exregional_make_orog.sh +++ b/scripts/exregional_make_orog.sh @@ -355,14 +355,8 @@ mv_vrfy "${raw_orog_fp_orig}" "${raw_orog_fp}" #----------------------------------------------------------------------- # if [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ]; then - cp_vrfy ${GWD_RRFS_v1beta_DIR}/* ${OROG_DIR} -else - print_err_msg_exit "\ -The location from which to copy the files needed by the gravity wave drag -parameterization in the current physics suite (CCPP_PHYS_SUITE) has not -been specified for this machine (MACHINE): - CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\" - MACHINE = \"${MACHINE}\"" + cp_vrfy ${GWD_RRFS_v1beta_DIR}/*_ls*.nc ${OROG_DIR} + cp_vrfy ${GWD_RRFS_v1beta_DIR}/*_ss*.nc ${OROG_DIR} fi print_info_msg "$VERBOSE" " diff --git a/scripts/exregional_run_fcst.sh b/scripts/exregional_run_fcst.sh index 54f9fad0c..75bf3588a 100755 --- a/scripts/exregional_run_fcst.sh +++ b/scripts/exregional_run_fcst.sh @@ -16,7 +16,7 @@ # #----------------------------------------------------------------------- # -. $USHDIR/create_model_config_file.sh +. $USHDIR/create_model_configure_file.sh # #----------------------------------------------------------------------- # @@ -252,11 +252,16 @@ Cannot create symlink because target does not exist: target = \"$target\"" fi # -# two files for drag_suite scheme -# this is only for the drag parameterization in the FV3_RRFS_v1beta physics suite +# If using the FV3_RRFS_v1beta physics suite, there are two files (that +# contain statistics of the orography) that are needed by the drag +# parameterization in that suite. Below, symlinks to these are created +# in the run directory. Note that the symlinks must have specific names +# that the FV3 model is hardcoded to recognize ("${CRES}_" and "halo0" +# must be stripped from the file names). We use those below. # if [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ]; then - # Symlink to orographic statistics fields file with "${CRES}_" and "halo0" stripped from name. +# Symlink to orographic statistics fields file with "${CRES}_" and "halo0" +# stripped from name. target="${FIXLAM}/${CRES}${DOT_OR_USCORE}oro_data_ls.tile${TILE_RGNL}.halo${NH0}.nc" symlink="oro_data_ls.nc" if [ -f "${target}" ]; then @@ -437,22 +442,12 @@ if [ "${USE_CCPP}" = "TRUE" ]; then ln_vrfy -sf ${relative_or_null} ${CCPP_PHYS_SUITE_FP} ${run_dir} if [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then ln_vrfy -sf ${relative_or_null} $EXPTDIR/CCN_ACTIVATE.BIN ${run_dir} fi fi -#----------------------------------------------------------------------- -# -# If running enemble forecasts, create links to the cycle-specific -# diagnostic tables file and model configuration file in the cycle -# directory. Note that these links should not be made if not running -# ensemble forecasts because in that case, the cycle directory is the -# run directory (and we would be creating a symlink with the name of a -# file that already exists). # #----------------------------------------------------------------------- # @@ -461,7 +456,7 @@ fi # #----------------------------------------------------------------------- # -create_model_config_file \ +create_model_configure_file \ cdate="$cdate" \ nthreads=${OMP_NUM_THREADS:-1} \ run_dir="${run_dir}" || print_err_msg_exit "\ @@ -472,7 +467,7 @@ cycle's (cdate) run directory (run_dir) failed: # #----------------------------------------------------------------------- # -# If running enemble forecasts, create a link to the cycle-specific +# If running ensemble forecasts, create a link to the cycle-specific # diagnostic tables file in the cycle directory. Note that this link # should not be made if not running ensemble forecasts because in that # case, the cycle directory is the run directory (and we would be creating @@ -484,8 +479,6 @@ if [ "${DO_ENSEMBLE}" = "TRUE" ]; then relative_or_null="--relative" diag_table_fp="${cycle_dir}/${DIAG_TABLE_FN}" ln_vrfy -sf ${relative_or_null} ${diag_table_fp} ${run_dir} - model_config_fp="${cycle_dir}/${MODEL_CONFIG_FN}" - ln_vrfy -sf ${relative_or_null} ${model_config_fp} ${run_dir} fi # #----------------------------------------------------------------------- diff --git a/tests/baseline_configs/config.FV3_RRFS_v1beta.sh b/tests/baseline_configs/config.FV3_RRFS_v1beta.sh index 270c5a37a..ecba54ce1 100644 --- a/tests/baseline_configs/config.FV3_RRFS_v1beta.sh +++ b/tests/baseline_configs/config.FV3_RRFS_v1beta.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="community" @@ -44,4 +39,4 @@ EXTRN_MDL_NAME_LBCS="RAPX" RUN_TASK_MAKE_GRID="TRUE" RUN_TASK_MAKE_OROG="TRUE" RUN_TASK_MAKE_SFC_CLIMO="TRUE" -GWD_RRFS_v1beta_BASEDIR="/scratch2/BMC/gsd-fv3-test/she/orog" + diff --git a/tests/baseline_configs/config.GSD_RAP13km.sh b/tests/baseline_configs/config.GSD_RAP13km.sh index 18185f0c2..52deb86fe 100644 --- a/tests/baseline_configs/config.GSD_RAP13km.sh +++ b/tests/baseline_configs/config.GSD_RAP13km.sh @@ -26,11 +26,6 @@ USE_CRON_TO_RELAUNCH="TRUE" # CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="community" diff --git a/tests/baseline_configs/config.community_ensemble_008mems.sh b/tests/baseline_configs/config.community_ensemble_008mems.sh index 71063ebda..fbf012049 100644 --- a/tests/baseline_configs/config.community_ensemble_008mems.sh +++ b/tests/baseline_configs/config.community_ensemble_008mems.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="community" diff --git a/tests/baseline_configs/config.community_ensemble_2mems.sh b/tests/baseline_configs/config.community_ensemble_2mems.sh index 09e1453ac..b8045d9dc 100644 --- a/tests/baseline_configs/config.community_ensemble_2mems.sh +++ b/tests/baseline_configs/config.community_ensemble_2mems.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="community" diff --git a/tests/baseline_configs/config.nco_GSD_HRRR3km_FV3GFS_FV3GFS.sh b/tests/baseline_configs/config.nco_GSD_HRRR3km_FV3GFS_FV3GFS.sh index 9260d08a9..4b6d80a5a 100644 --- a/tests/baseline_configs/config.nco_GSD_HRRR3km_FV3GFS_FV3GFS.sh +++ b/tests/baseline_configs/config.nco_GSD_HRRR3km_FV3GFS_FV3GFS.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="nco" @@ -99,16 +94,6 @@ EXTRN_MDL_NAME_LBCS="FV3GFS" RUN="${EXPT_SUBDIR}" envir="${EXPT_SUBDIR}" -#On Hera: -COMINgfs="/scratch1/NCEPDEV/hwrf/noscrub/hafs-input/COMGFS" -STMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/stmp" -PTMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/ptmp" - -#On Jet: -#COMINgfs="/lfs1/HFIP/hwrf-data/hafs-input/COMGFS" -#STMP="/mnt/lfs1/BMC/fim/Gerard.Ketefian/UFS_CAM/NCO_dirs/stmp" -#PTMP="/mnt/lfs1/BMC/fim/Gerard.Ketefian/UFS_CAM/NCO_dirs/ptmp" - # # In NCO mode, the user must manually (e.g. after doing the build step) # create the symlink "${FIXrrfs}/fix_sar" that points to EMC's FIXsar @@ -124,16 +109,3 @@ PTMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/ptmp" # where EMC_GRID_NAME has the value set above. # -# If want to use user-staged external model files: - -#On Hera: -#EXTRN_MDL_SOURCE_DIR_ICS="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/staged_extrn_mdl_files/FV3GFS" -#EXTRN_MDL_FILES_ICS=( "gfs.atmanl.nemsio" "gfs.sfcanl.nemsio" ) -#EXTRN_MDL_SOURCE_DIR_LBCS="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/staged_extrn_mdl_files/FV3GFS" -#EXTRN_MDL_FILES_LBCS=( "gfs.atmf003.nemsio" "gfs.atmf006.nemsio" ) - -#On Jet: -#EXTRN_MDL_SOURCE_DIR_ICS="/mnt/lfs1/BMC/fim/Gerard.Ketefian/UFS_CAM/staged_extrn_mdl_files/FV3GFS" -#EXTRN_MDL_FILES_ICS=( "gfs.atmanl.nemsio" "gfs.sfcanl.nemsio" ) -#EXTRN_MDL_SOURCE_DIR_LBCS="/mnt/lfs1/BMC/fim/Gerard.Ketefian/UFS_CAM/staged_extrn_mdl_files/FV3GFS" -#EXTRN_MDL_FILES_LBCS=( "gfs.atmf003.nemsio" "gfs.atmf006.nemsio" ) diff --git a/tests/baseline_configs/config.nco_GSD_HRRR3km_HRRRX_RAPX.sh b/tests/baseline_configs/config.nco_GSD_HRRR3km_HRRRX_RAPX.sh index 51cd82e7b..689d4e211 100644 --- a/tests/baseline_configs/config.nco_GSD_HRRR3km_HRRRX_RAPX.sh +++ b/tests/baseline_configs/config.nco_GSD_HRRR3km_HRRRX_RAPX.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="nco" @@ -99,17 +94,6 @@ EXTRN_MDL_NAME_LBCS="RAPX" RUN="${EXPT_SUBDIR}" envir="${EXPT_SUBDIR}" -#On Hera: -COMINgfs="/scratch1/NCEPDEV/hwrf/noscrub/hafs-input/COMGFS" -STMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/stmp" -PTMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/ptmp" - -#On Jet: -#COMINgfs="/lfs1/HFIP/hwrf-data/hafs-input/COMGFS" -#STMP="/mnt/lfs1/BMC/fim/Gerard.Ketefian/UFS_CAM/NCO_dirs/stmp" -#PTMP="/mnt/lfs1/BMC/fim/Gerard.Ketefian/UFS_CAM/NCO_dirs/ptmp" - - # # In NCO mode, the user must manually (e.g. after doing the build step) # create the symlink "${FIXrrfs}/fix_sar" that points to EMC's FIXsar @@ -125,17 +109,3 @@ PTMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/ptmp" # where EMC_GRID_NAME has the value set above. # -# If want to use user-staged external model files: - -#On Hera: -#EXTRN_MDL_SOURCE_DIR_ICS="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/staged_extrn_mdl_files/HRRRX" -#EXTRN_MDL_FILES_ICS=( "hrrrx.out.for_f000" ) -#EXTRN_MDL_SOURCE_DIR_LBCS="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/staged_extrn_mdl_files/RAPX" -#EXTRN_MDL_FILES_LBCS=( "rapx.out.for_f003" "rapx.out.for_f006" ) - -#On Jet: -#EXTRN_MDL_SOURCE_DIR_ICS="/mnt/lfs1/BMC/fim/Gerard.Ketefian/UFS_CAM/staged_extrn_mdl_files/HRRRX" -#EXTRN_MDL_FILES_ICS=( "hrrrx.out.for_f000" ) -#EXTRN_MDL_SOURCE_DIR_LBCS="/mnt/lfs1/BMC/fim/Gerard.Ketefian/UFS_CAM/staged_extrn_mdl_files/RAPX" -#EXTRN_MDL_FILES_LBCS=( "rapx.out.for_f003" "rapx.out.for_f006" ) - diff --git a/tests/baseline_configs/config.nco_conus.sh b/tests/baseline_configs/config.nco_conus.sh index 4237a14f0..25ceb2e67 100644 --- a/tests/baseline_configs/config.nco_conus.sh +++ b/tests/baseline_configs/config.nco_conus.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="nco" @@ -99,16 +94,6 @@ EXTRN_MDL_NAME_LBCS="FV3GFS" RUN="${EXPT_SUBDIR}" envir="${EXPT_SUBDIR}" -#On Hera: -COMINgfs="/scratch1/NCEPDEV/hwrf/noscrub/hafs-input/COMGFS" -STMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/stmp" -PTMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/ptmp" - -#On Jet: -#COMINgfs="/lfs1/HFIP/hwrf-data/hafs-input/COMGFS" -#STMP="" -#PTMP="" - # # In NCO mode, the user must manually (e.g. after doing the build step) # create the symlink "${FIXrrfs}/fix_lam" that points to EMC's FIXLAM diff --git a/tests/baseline_configs/config.nco_conus_c96.sh b/tests/baseline_configs/config.nco_conus_c96.sh index 1840c3b16..01f4cb74a 100644 --- a/tests/baseline_configs/config.nco_conus_c96.sh +++ b/tests/baseline_configs/config.nco_conus_c96.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="nco" @@ -99,16 +94,6 @@ EXTRN_MDL_NAME_LBCS="FV3GFS" RUN="${EXPT_SUBDIR}" envir="${EXPT_SUBDIR}" -#On Hera: -COMINgfs="/scratch1/NCEPDEV/hwrf/noscrub/hafs-input/COMGFS" -STMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/stmp" -PTMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/ptmp" - -#On Jet: -#COMINgfs="/lfs1/HFIP/hwrf-data/hafs-input/COMGFS" -#STMP="" -#PTMP="" - # # In NCO mode, the user must manually (e.g. after doing the build step) # create the symlink "${FIXrrfs}/fix_lam" that points to EMC's FIXLAM diff --git a/tests/baseline_configs/config.nco_ensemble.sh b/tests/baseline_configs/config.nco_ensemble.sh index a6f65c7db..8b35ee2d1 100644 --- a/tests/baseline_configs/config.nco_ensemble.sh +++ b/tests/baseline_configs/config.nco_ensemble.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="nco" @@ -99,16 +94,6 @@ EXTRN_MDL_NAME_LBCS="FV3GFS" RUN="${EXPT_SUBDIR}" envir="${EXPT_SUBDIR}" -#On Hera: -COMINgfs="/scratch1/NCEPDEV/hwrf/noscrub/hafs-input/COMGFS" -STMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/stmp" -PTMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/ptmp" - -#On Jet: -#COMINgfs="/lfs1/HFIP/hwrf-data/hafs-input/COMGFS" -#STMP="" -#PTMP="" - DO_ENSEMBLE="TRUE" NUM_ENS_MEMBERS="2" diff --git a/tests/baseline_configs/config.new_ESGgrid.sh b/tests/baseline_configs/config.new_ESGgrid.sh index 1aa5db8a2..2ab938c71 100644 --- a/tests/baseline_configs/config.new_ESGgrid.sh +++ b/tests/baseline_configs/config.new_ESGgrid.sh @@ -26,11 +26,6 @@ USE_CRON_TO_RELAUNCH="TRUE" # CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="community" @@ -55,21 +50,20 @@ LAYOUT_X="8" LAYOUT_Y="12" BLOCKSIZE="13" -if [ "$QUILTING" = "TRUE" ]; then - WRTCMP_write_groups="1" - WRTCMP_write_tasks_per_group=$(( 1*LAYOUT_Y )) - WRTCMP_output_grid="lambert_conformal" - WRTCMP_cen_lon="${ESGgrid_LON_CTR}" - WRTCMP_cen_lat="${ESGgrid_LAT_CTR}" - WRTCMP_stdlat1="${ESGgrid_LAT_CTR}" - WRTCMP_stdlat2="${ESGgrid_LAT_CTR}" - WRTCMP_nx="200" - WRTCMP_ny="150" - WRTCMP_lon_lwr_left="-122.21414225" - WRTCMP_lat_lwr_left="22.41403305" - WRTCMP_dx="${ESGgrid_DELX}" - WRTCMP_dy="${ESGgrid_DELY}" -fi +QUILTING="TRUE" +WRTCMP_write_groups="1" +WRTCMP_write_tasks_per_group=$(( 1*LAYOUT_Y )) +WRTCMP_output_grid="lambert_conformal" +WRTCMP_cen_lon="${ESGgrid_LON_CTR}" +WRTCMP_cen_lat="${ESGgrid_LAT_CTR}" +WRTCMP_stdlat1="${ESGgrid_LAT_CTR}" +WRTCMP_stdlat2="${ESGgrid_LAT_CTR}" +WRTCMP_nx="200" +WRTCMP_ny="150" +WRTCMP_lon_lwr_left="-122.21414225" +WRTCMP_lat_lwr_left="22.41403305" +WRTCMP_dx="${ESGgrid_DELX}" +WRTCMP_dy="${ESGgrid_DELY}" USE_CCPP="TRUE" CCPP_PHYS_SUITE="FV3_GFS_2017_gfdlmp_regional" diff --git a/tests/baseline_configs/config.regional_001.sh b/tests/baseline_configs/config.regional_001.sh index 6a8f6655a..7193756ab 100644 --- a/tests/baseline_configs/config.regional_001.sh +++ b/tests/baseline_configs/config.regional_001.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="community" diff --git a/tests/baseline_configs/config.regional_002.sh b/tests/baseline_configs/config.regional_002.sh index 80f7f895a..78fa3f7d1 100644 --- a/tests/baseline_configs/config.regional_002.sh +++ b/tests/baseline_configs/config.regional_002.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="community" diff --git a/tests/baseline_configs/config.regional_003.sh b/tests/baseline_configs/config.regional_003.sh index d0fb807d0..f99b12e02 100644 --- a/tests/baseline_configs/config.regional_003.sh +++ b/tests/baseline_configs/config.regional_003.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="community" diff --git a/tests/baseline_configs/config.regional_004.sh b/tests/baseline_configs/config.regional_004.sh index 7f19f0d17..414796226 100644 --- a/tests/baseline_configs/config.regional_004.sh +++ b/tests/baseline_configs/config.regional_004.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="community" diff --git a/tests/baseline_configs/config.regional_005.sh b/tests/baseline_configs/config.regional_005.sh index bfd925885..0fe4f7bce 100644 --- a/tests/baseline_configs/config.regional_005.sh +++ b/tests/baseline_configs/config.regional_005.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="community" diff --git a/tests/baseline_configs/config.regional_006.sh b/tests/baseline_configs/config.regional_006.sh index f5a0aa25b..c43b2de5f 100644 --- a/tests/baseline_configs/config.regional_006.sh +++ b/tests/baseline_configs/config.regional_006.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="community" @@ -42,15 +37,6 @@ EXTRN_MDL_NAME_ICS="FV3GFS" EXTRN_MDL_NAME_LBCS="FV3GFS" RUN_TASK_MAKE_GRID="FALSE" -GRID_DIR="/scratch2/BMC/det/FV3LAM_pregen/grid/GSD_HRRR25km" - RUN_TASK_MAKE_OROG="FALSE" -OROG_DIR="/scratch2/BMC/det/FV3LAM_pregen/orog/GSD_HRRR25km" - RUN_TASK_MAKE_SFC_CLIMO="FALSE" -SFC_CLIMO_DIR="/scratch2/BMC/det/FV3LAM_pregen/sfc_climo/GSD_HRRR25km" -#On Jet -#GRID_DIR="" -#OROG_DIR="" -#SFC_CLIMO_DIR="" diff --git a/tests/baseline_configs/config.regional_007.sh b/tests/baseline_configs/config.regional_007.sh index 09e843d0e..fa268c86b 100644 --- a/tests/baseline_configs/config.regional_007.sh +++ b/tests/baseline_configs/config.regional_007.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="community" diff --git a/tests/baseline_configs/config.regional_008.sh b/tests/baseline_configs/config.regional_008.sh index dc7d8b39e..305acdcf9 100644 --- a/tests/baseline_configs/config.regional_008.sh +++ b/tests/baseline_configs/config.regional_008.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="community" diff --git a/tests/baseline_configs/config.regional_009.sh b/tests/baseline_configs/config.regional_009.sh index 2fc79bfa2..66a32d23f 100644 --- a/tests/baseline_configs/config.regional_009.sh +++ b/tests/baseline_configs/config.regional_009.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="nco" @@ -98,15 +93,6 @@ EXTRN_MDL_NAME_LBCS="FV3GFS" RUN="${EXPT_SUBDIR}" envir="${EXPT_SUBDIR}" -#On Hera: -COMINgfs="/scratch1/NCEPDEV/hwrf/noscrub/hafs-input/COMGFS" -STMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/stmp" -PTMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/ptmp" - -#On Jet: -#COMINgfs="/lfs1/projects/hwrf-data/hafs-input/COMGFS" -#STMP="" -#PTMP="" # # In NCO mode, the user must manually (e.g. after doing the build step) diff --git a/tests/baseline_configs/config.regional_010.sh b/tests/baseline_configs/config.regional_010.sh index d8898cb04..74db51ab0 100644 --- a/tests/baseline_configs/config.regional_010.sh +++ b/tests/baseline_configs/config.regional_010.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="community" diff --git a/tests/baseline_configs/config.regional_011.sh b/tests/baseline_configs/config.regional_011.sh index 9f0393f26..b0aca082b 100644 --- a/tests/baseline_configs/config.regional_011.sh +++ b/tests/baseline_configs/config.regional_011.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="community" diff --git a/tests/baseline_configs/config.regional_012.sh b/tests/baseline_configs/config.regional_012.sh index f2286353e..c6eb03c61 100644 --- a/tests/baseline_configs/config.regional_012.sh +++ b/tests/baseline_configs/config.regional_012.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="community" diff --git a/tests/baseline_configs/config.regional_013.sh b/tests/baseline_configs/config.regional_013.sh deleted file mode 100644 index 30cdca248..000000000 --- a/tests/baseline_configs/config.regional_013.sh +++ /dev/null @@ -1,47 +0,0 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - -VERBOSE="TRUE" - -RUN_ENVIR="community" -PREEXISTING_DIR_METHOD="rename" - -PREDEF_GRID_NAME="GSD_HRRR25km" -GRID_GEN_METHOD="ESGgrid" -QUILTING="TRUE" -USE_CCPP="TRUE" -CCPP_PHYS_SUITE="FV3_GSD_SAR_v1" -FCST_LEN_HRS="06" -LBC_SPEC_INTVL_HRS="6" - -DATE_FIRST_CYCL="20190520" -DATE_LAST_CYCL="20190520" -CYCL_HRS=( "00" ) - -EXTRN_MDL_NAME_ICS="GSMGFS" -EXTRN_MDL_NAME_LBCS="GSMGFS" - -RUN_TASK_MAKE_GRID="TRUE" -RUN_TASK_MAKE_OROG="TRUE" -RUN_TASK_MAKE_SFC_CLIMO="TRUE" - diff --git a/tests/baseline_configs/config.regional_014.sh b/tests/baseline_configs/config.regional_014.sh index c65e62bd4..e8b72d7bb 100644 --- a/tests/baseline_configs/config.regional_014.sh +++ b/tests/baseline_configs/config.regional_014.sh @@ -18,10 +18,6 @@ CRON_RELAUNCH_INTVL_MNTS="02" DOT_OR_USCORE="." -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="community" diff --git a/tests/baseline_configs/config.regional_015.sh b/tests/baseline_configs/config.regional_015.sh index b5d809dc1..727a543e1 100644 --- a/tests/baseline_configs/config.regional_015.sh +++ b/tests/baseline_configs/config.regional_015.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="community" diff --git a/tests/baseline_configs/config.regional_016.sh b/tests/baseline_configs/config.regional_016.sh deleted file mode 100644 index df69233a8..000000000 --- a/tests/baseline_configs/config.regional_016.sh +++ /dev/null @@ -1,47 +0,0 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - -VERBOSE="TRUE" - -RUN_ENVIR="community" -PREEXISTING_DIR_METHOD="rename" - -PREDEF_GRID_NAME="GSD_HRRR25km" -GRID_GEN_METHOD="ESGgrid" -QUILTING="TRUE" -USE_CCPP="TRUE" -CCPP_PHYS_SUITE="FV3_RRFS_v0" -FCST_LEN_HRS="06" -LBC_SPEC_INTVL_HRS="6" - -DATE_FIRST_CYCL="20190520" -DATE_LAST_CYCL="20190520" -CYCL_HRS=( "00" ) - -EXTRN_MDL_NAME_ICS="GSMGFS" -EXTRN_MDL_NAME_LBCS="GSMGFS" - -RUN_TASK_MAKE_GRID="TRUE" -RUN_TASK_MAKE_OROG="TRUE" -RUN_TASK_MAKE_SFC_CLIMO="TRUE" - diff --git a/tests/baseline_configs/config.user_download_extrn_files.sh b/tests/baseline_configs/config.user_download_extrn_files.sh old mode 100755 new mode 100644 index 86376e96b..b78d8eb2a --- a/tests/baseline_configs/config.user_download_extrn_files.sh +++ b/tests/baseline_configs/config.user_download_extrn_files.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="community" diff --git a/tests/baseline_configs/config.user_staged_extrn_files.sh b/tests/baseline_configs/config.user_staged_extrn_files.sh index 692041ea3..78fa3f7d1 100644 --- a/tests/baseline_configs/config.user_staged_extrn_files.sh +++ b/tests/baseline_configs/config.user_staged_extrn_files.sh @@ -16,11 +16,6 @@ EXPT_SUBDIR="" USE_CRON_TO_RELAUNCH="TRUE" CRON_RELAUNCH_INTVL_MNTS="02" - -QUEUE_DEFAULT="batch" -QUEUE_HPSS="service" -QUEUE_FCST="batch" - VERBOSE="TRUE" RUN_ENVIR="community" @@ -45,9 +40,3 @@ RUN_TASK_MAKE_GRID="TRUE" RUN_TASK_MAKE_OROG="TRUE" RUN_TASK_MAKE_SFC_CLIMO="TRUE" -EXTRN_MDL_SOURCE_DIR_ICS="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/staged_extrn_mdl_files/FV3GFS" -EXTRN_MDL_FILES_ICS=( "gfs.atmanl.nemsio" "gfs.sfcanl.nemsio" ) - -EXTRN_MDL_SOURCE_DIR_LBCS="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/staged_extrn_mdl_files/FV3GFS" -EXTRN_MDL_FILES_LBCS=( "gfs.atmf003.nemsio" "gfs.atmf006.nemsio" ) - diff --git a/tests/baselines_list.txt b/tests/baselines_list.txt index 002818dbe..cb23d6132 100644 --- a/tests/baselines_list.txt +++ b/tests/baselines_list.txt @@ -1,3 +1,4 @@ +FV3_RRFS_v1beta GSD_RAP13km community_ensemble_008mems community_ensemble_2mems @@ -19,9 +20,6 @@ regional_009 regional_010 regional_011 regional_012 -regional_013 regional_014 regional_015 -regional_016 user_staged_extrn_files -user_download_extrn_files diff --git a/tests/run_experiments.sh b/tests/run_experiments.sh index c3d22e237..075e3d88f 100755 --- a/tests/run_experiments.sh +++ b/tests/run_experiments.sh @@ -395,6 +395,14 @@ fi # #----------------------------------------------------------------------- # +# +# +#----------------------------------------------------------------------- +# + MACHINE="${machine^^}" +# +#----------------------------------------------------------------------- +# # Set any parameters in the experiment configuration file that have been # assigned a value in the arguments list to this script (and thus are # not empty). Any parameters that have not been assigned a value in the @@ -406,7 +414,7 @@ fi #----------------------------------------------------------------------- # if [ ! -z "$machine" ]; then - set_bash_param "${expt_config_fp}" "MACHINE" "$machine" + set_bash_param "${expt_config_fp}" "MACHINE" "${MACHINE}" fi if [ ! -z "$account" ]; then @@ -423,6 +431,284 @@ fi # #----------------------------------------------------------------------- # +# +# +#----------------------------------------------------------------------- +# +# Might be better to source both config_defaults.sh and the configuration +# file for the test. That way, variables will have default values and +# we don't have to check whether or not they're set. Also, do the sourcing +# just once if possible instead of many times as below. +# + + PREDEF_GRID_NAME=$( + . ${expt_config_fp} + if [ -z "${PREDEF_GRID_NAME+x}" ]; then + echo "" + else + echo "${PREDEF_GRID_NAME}" + fi + ) +#echo "PREDEF_GRID_NAME = \"${PREDEF_GRID_NAME}\"" +#exit + + RUN_TASK_MAKE_GRID=$( . ${expt_config_fp} ; echo "${RUN_TASK_MAKE_GRID}" ) + + if [ ${RUN_TASK_MAKE_GRID} = "FALSE" ]; then + + if [ "$MACHINE" = "HERA" ]; then + GRID_DIR="/scratch2/BMC/det/FV3LAM_pregen/grid/${PREDEF_GRID_NAME}" + elif [ "$MACHINE" = "CHEYENNE" ]; then + GRID_DIR="/glade/p/ral/jntp/UFS_CAM/FV3LAM_pregen/grid/${PREDEF_GRID_NAME}" + else + print_err_msg_exit "\ +The directory (GRID_DIR) in which the pregenerated grid files are located +has not been specified for this machine (MACHINE): + MACHINE= \"${MACHINE}\"" + fi + + { cat << EOM >> ${expt_config_fp} +# +# Directory containing the pregenerated grid files. +# +GRID_DIR="${GRID_DIR}" +EOM + } || print_err_msg_exit "\ +Heredoc (cat) command to append the variable GRID_DIR containing the +pregenerated grid files to the workflow configuration file returned +with a nonzero status." + + fi +# +#----------------------------------------------------------------------- +# +# +# +#----------------------------------------------------------------------- +# + RUN_TASK_MAKE_OROG=$( . ${expt_config_fp} ; echo "${RUN_TASK_MAKE_OROG}" ) + + if [ ${RUN_TASK_MAKE_OROG} = "FALSE" ]; then + + if [ "$MACHINE" = "HERA" ]; then + OROG_DIR="/scratch2/BMC/det/FV3LAM_pregen/orog/${PREDEF_GRID_NAME}" + elif [ "$MACHINE" = "CHEYENNE" ]; then + OROG_DIR="/glade/p/ral/jntp/UFS_CAM/FV3LAM_pregen/orog/${PREDEF_GRID_NAME}" + else + print_err_msg_exit "\ +The directory (OROG_DIR) in which the pregenerated grid files are located +has not been specified for this machine (MACHINE): + MACHINE= \"${MACHINE}\"" + fi + + { cat << EOM >> ${expt_config_fp} +# +# Directory containing the pregenerated grid files. +# +OROG_DIR="${OROG_DIR}" +EOM + } || print_err_msg_exit "\ +Heredoc (cat) command to append the variable OROG_DIR containing the +pregenerated orography files to the workflow configuration file returned +with a nonzero status." + + fi +# +#----------------------------------------------------------------------- +# +# +# +#----------------------------------------------------------------------- +# + RUN_TASK_MAKE_SFC_CLIMO=$( . ${expt_config_fp} ; echo "${RUN_TASK_MAKE_SFC_CLIMO}" ) + + if [ ${RUN_TASK_MAKE_SFC_CLIMO} = "FALSE" ]; then + + if [ "$MACHINE" = "HERA" ]; then + SFC_CLIMO_DIR="/scratch2/BMC/det/FV3LAM_pregen/sfc_climo/${PREDEF_GRID_NAME}" + elif [ "$MACHINE" = "CHEYENNE" ]; then + SFC_CLIMO_DIR="/glade/p/ral/jntp/UFS_CAM/FV3LAM_pregen/sfc_climo/${PREDEF_GRID_NAME}" + else + print_err_msg_exit "\ +The directory (SFC_CLIMO_DIR) in which the pregenerated grid files are +located has not been specified for this machine (MACHINE): + MACHINE= \"${MACHINE}\"" + fi + + { cat << EOM >> ${expt_config_fp} +# +# Directory containing the pregenerated grid files. +# +SFC_CLIMO_DIR="${SFC_CLIMO_DIR}" +EOM + } || print_err_msg_exit "\ +Heredoc (cat) command to append the variable SFC_CLIMO_DIR containing +the pregenerated grid files to the workflow configuration file returned +with a nonzero status." + + fi + +#On hera: + +# +#----------------------------------------------------------------------- +# +# +# +#----------------------------------------------------------------------- +# + CCPP_PHYS_SUITE=$( . ${expt_config_fp} ; echo "${CCPP_PHYS_SUITE}" ) + + if [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ]; then + + if [ "$MACHINE" = "HERA" ]; then + GWD_RRFS_v1beta_BASEDIR="/scratch2/BMC/det/FV3LAM_pregen/orog" + elif [ "$MACHINE" = "JET" ]; then + GWD_RRFS_v1beta_BASEDIR="/lfs4/BMC/wrfruc/FV3LAM_pregen/orog" + elif [ "$MACHINE" = "CHEYENNE" ]; then + GWD_RRFS_v1beta_BASEDIR="/glade/p/ral/jntp/UFS_CAM/FV3LAM_pregen/orog" + else + print_err_msg_exit "\ +The base directory (GWD_RRFS_v1beta_BASEDIR) in which the orography +statistics files needed by the gravity wave drag parameterization in +the current physics suite (CCPP_PHYS_SUITE) should be located has not +been specified for this machine (MACHINE): + CCPP_PHYS_SUITE= \"${CCPP_PHYS_SUIT}\" + MACHINE= \"${MACHINE}\"" + fi + + { cat << EOM >> ${expt_config_fp} +# +# Directory containing the orography statistics files needed by the +# gravity wave drag parameterization. +# +GWD_RRFS_v1beta_BASEDIR="${GWD_RRFS_v1beta_BASEDIR}" +EOM + } || print_err_msg_exit "\ +Heredoc (cat) command to append the variable GWD_RRFS_v1beta_BASEDIR +containing the orography statistics files needed by the gravity wave +drag parameterization to the workflow configuration file returned with +a nonzero status." + + fi +# +#----------------------------------------------------------------------- +# +# +# +#----------------------------------------------------------------------- +# + RUN_ENVIR=$( . ${expt_config_fp} ; echo "${RUN_ENVIR}" ) + + if [ "${RUN_ENVIR}" = "nco" ]; then + +# Note: Need COMINgfs only if using FV3GFS or GSMGFS as the external +# model for ICs or LBCs. Modify the logic below later. + + if [ "$MACHINE" = "HERA" ]; then + COMINgfs="/scratch1/NCEPDEV/hwrf/noscrub/hafs-input/COMGFS" + STMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/stmp" + PTMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/ptmp" + elif [ "$MACHINE" = "JET" ]; then + COMINgfs="/lfs1/HFIP/hwrf-data/hafs-input/COMGFS" + STMP="/mnt/lfs1/BMC/fim/Gerard.Ketefian/UFS_CAM/NCO_dirs/stmp" + PTMP="/mnt/lfs1/BMC/fim/Gerard.Ketefian/UFS_CAM/NCO_dirs/ptmp" + elif [ "$MACHINE" = "CHEYENNE" ]; then + COMINgfs="/glade/scratch/ketefian/NCO_dirs/COMGFS" + STMP="/glade/scratch/ketefian/NCO_dirs/stmp" + PTMP="/glade/scratch/ketefian/NCO_dirs/ptmp" + else + print_err_msg_exit "\ +The directories COMINgfs, STMP, and PTMP that need to be specified when +running the workflow in NCO-mode (i.e. RUN_ENVIR set to \"nco\") have +not been specified for this machine (MACHINE): + MACHINE= \"${MACHINE}\"" + fi + + { cat << EOM >> ${expt_config_fp} +# +# Directories COMINgfs, STMP, and PTMP that need to be specified when +# running the workflow in NCO-mode (i.e. RUN_ENVIR set to "nco"). +# +COMINgfs="${COMINgfs}" +STMP="${STMP}" +PTMP="${PTMP}" +EOM + } || print_err_msg_exit "\ +Heredoc (cat) command to append variables specifying user-staged external +model files and locations to the workflow configuration file returned with +a nonzero status." + + fi +# +#----------------------------------------------------------------------- +# +# +# +#----------------------------------------------------------------------- +# + do_user_staged_extrn="TRUE" # Change this to an input argument at some point. + + if [ ${do_user_staged_extrn} = "TRUE" ]; then + + EXTRN_MDL_NAME_ICS=$( . ${expt_config_fp} ; echo "${EXTRN_MDL_NAME_ICS}" ) + EXTRN_MDL_NAME_LBCS=$( . ${expt_config_fp} ; echo "${EXTRN_MDL_NAME_LBCS}" ) + FCST_LEN_HRS=$( . ${expt_config_fp} ; echo "${FCST_LEN_HRS}" ) + LBC_SPEC_INTVL_HRS=$( . ${expt_config_fp} ; echo "${LBC_SPEC_INTVL_HRS}" ) + + if [ "$MACHINE" = "HERA" ]; then + extrn_mdl_source_baseir="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/staged_extrn_mdl_files" + elif [ "$MACHINE" = "JET" ]; then + extrn_mdl_source_baseir="/mnt/lfs1/BMC/fim/Gerard.Ketefian/UFS_CAM/staged_extrn_mdl_files" + elif [ "$MACHINE" = "CHEYENNE" ]; then + extrn_mdl_source_baseir="/glade/p/ral/jntp/UFS_CAM/staged_extrn_mdl_files" + else + print_err_msg_exit "\ +The base directory (extrn_mdl_source_baseir) in which the user-staged +external model files should be located has not been specified for this +machine (MACHINE): + MACHINE= \"${MACHINE}\"" + fi + + EXTRN_MDL_SOURCE_DIR_ICS="${extrn_mdl_source_baseir}/${EXTRN_MDL_NAME_ICS}" + if [ "${EXTRN_MDL_NAME_ICS}" = "FV3GFS" ] || \ + [ "${EXTRN_MDL_NAME_ICS}" = "GSMGFS" ]; then + EXTRN_MDL_FILES_ICS=( "gfs.atmanl.nemsio" "gfs.sfcanl.nemsio" ) + elif [ "${EXTRN_MDL_NAME_ICS}" = "HRRRX" ] || \ + [ "${EXTRN_MDL_NAME_ICS}" = "RAPX" ]; then + EXTRN_MDL_FILES_ICS=( "${EXTRN_MDL_NAME_ICS,,}.out.for_f000" ) + fi + + EXTRN_MDL_SOURCE_DIR_LBCS="${extrn_mdl_source_baseir}/${EXTRN_MDL_NAME_LBCS}" + EXTRN_MDL_FILES_LBCS=( $( seq ${LBC_SPEC_INTVL_HRS} ${LBC_SPEC_INTVL_HRS} ${FCST_LEN_HRS} ) ) + if [ "${EXTRN_MDL_NAME_LBCS}" = "FV3GFS" ] || \ + [ "${EXTRN_MDL_NAME_LBCS}" = "GSMGFS" ]; then + EXTRN_MDL_FILES_LBCS=( "${EXTRN_MDL_FILES_LBCS[@]/#/gfs.atmf00}" ) + EXTRN_MDL_FILES_LBCS=( "${EXTRN_MDL_FILES_LBCS[@]/%/.nemsio}" ) + elif [ "${EXTRN_MDL_NAME_LBCS}" = "HRRRX" ] || \ + [ "${EXTRN_MDL_NAME_LBCS}" = "RAPX" ]; then + EXTRN_MDL_FILES_LBCS=( "${EXTRN_MDL_FILES_LBCS[@]/#/${EXTRN_MDL_NAME_LBCS,,}.out.for_f00}" ) + fi + + { cat << EOM >> ${expt_config_fp} +# +# Locations and names of user-staged external model files for generating +# ICs and LBCs. +# +EXTRN_MDL_SOURCE_DIR_ICS="${EXTRN_MDL_SOURCE_DIR_ICS}" +EXTRN_MDL_FILES_ICS=( $( printf "\"%s\" " "${EXTRN_MDL_FILES_ICS[@]}" )) +EXTRN_MDL_SOURCE_DIR_LBCS="${EXTRN_MDL_SOURCE_DIR_LBCS}" +EXTRN_MDL_FILES_LBCS=( $( printf "\"%s\" " "${EXTRN_MDL_FILES_LBCS[@]}" )) +EOM + } || print_err_msg_exit "\ +Heredoc (cat) command to append variables specifying user-staged external +model files and locations to the workflow configuration file returned with +a nonzero status." + + fi +# +#----------------------------------------------------------------------- +# # Set the values of those parameters in the experiment configuration file # that need to be adjusted from their baseline values (as specified in # the current line of the experiments list file) to obtain the configuration diff --git a/ush/config_defaults.sh b/ush/config_defaults.sh index 23254e7da..f99acdd60 100644 --- a/ush/config_defaults.sh +++ b/ush/config_defaults.sh @@ -89,11 +89,11 @@ RUN_ENVIR="nco" MACHINE="BIG_COMPUTER" ACCOUNT="project_name" SCHED="" -QUEUE_DEFAULT="batch_queue" +QUEUE_DEFAULT="" QUEUE_DEFAULT_TAG="queue" -QUEUE_HPSS="hpss_queue" +QUEUE_HPSS="" QUEUE_HPSS_TAG="partition" -QUEUE_FCST="production_queue" +QUEUE_FCST="" QUEUE_FCST_TAG="queue" # #----------------------------------------------------------------------- diff --git a/ush/create_model_config_files.sh b/ush/create_model_config_files.sh deleted file mode 100644 index d2f9fd357..000000000 --- a/ush/create_model_config_files.sh +++ /dev/null @@ -1,182 +0,0 @@ -# -#----------------------------------------------------------------------- -# -# This file defines a function that creates a model configuration file -# for each cycle to be run. -# -#----------------------------------------------------------------------- -# -function create_model_config_files() { -# -#----------------------------------------------------------------------- -# -# Save current shell options (in a global array). Then set new options -# for this script/function. -# -#----------------------------------------------------------------------- -# - { save_shell_opts; set -u -x; } > /dev/null 2>&1 -# -#----------------------------------------------------------------------- -# -# Get the full path to the file in which this script/function is located -# (scrfunc_fp), the name of that file (scrfunc_fn), and the directory in -# which the file is located (scrfunc_dir). -# -#----------------------------------------------------------------------- -# - local scrfunc_fp=$( readlink -f "${BASH_SOURCE[0]}" ) - local scrfunc_fn=$( basename "${scrfunc_fp}" ) - local scrfunc_dir=$( dirname "${scrfunc_fp}" ) -# -#----------------------------------------------------------------------- -# -# Get the name of this function. -# -#----------------------------------------------------------------------- -# - local func_name="${FUNCNAME[0]}" -# -#----------------------------------------------------------------------- -# -# Specify the set of valid argument names for this script/function. Then -# process the arguments provided to this script/function (which should -# consist of a set of name-value pairs of the form arg1="value1", etc). -# -#----------------------------------------------------------------------- -# - local valid_args=() - process_args valid_args "$@" -# -#----------------------------------------------------------------------- -# -# For debugging purposes, print out values of arguments passed to this -# script. Note that these will be printed out only if VERBOSE is set to -# TRUE. -# -#----------------------------------------------------------------------- -# - print_input_args valid_args -# -#----------------------------------------------------------------------- -# -# Declare local variables. -# -#----------------------------------------------------------------------- -# - local i \ - cdate \ - cycle_dir \ - model_config_fp \ - yyyy \ - mm \ - dd \ - hh \ - mm \ - dot_quilting_dot \ - dot_print_esmf_dot -# -#----------------------------------------------------------------------- -# -# Create a model configuration file within each cycle directory. -# -#----------------------------------------------------------------------- -# - print_info_msg "$VERBOSE" " -Creating a model configuration file (\"${MODEL_CONFIG_FN}\") within each -cycle directory..." - - for (( i=0; i<${NUM_CYCLES}; i++ )); do - - cdate="${ALL_CDATES[$i]}" - cycle_dir="${CYCLE_BASEDIR}/$cdate" -# -# Copy template of cycle-dependent model configure files from the templates -# directory to the current cycle directory. -# - model_config_fp="${cycle_dir}/${MODEL_CONFIG_FN}" - cp_vrfy "${MODEL_CONFIG_TMPL_FP}" "${model_config_fp}" -# -# Extract from cdate the starting year, month, day, and hour of the forecast. -# - yyyy=${cdate:0:4} - mm=${cdate:4:2} - dd=${cdate:6:2} - hh=${cdate:8:2} -# -# Set parameters in the model configure file. -# - dot_quilting_dot="."${QUILTING,,}"." - dot_print_esmf_dot="."${PRINT_ESMF,,}"." - - set_file_param "${model_config_fp}" "PE_MEMBER01" "${PE_MEMBER01}" - set_file_param "${model_config_fp}" "dt_atmos" "${DT_ATMOS}" - set_file_param "${model_config_fp}" "start_year" "$yyyy" - set_file_param "${model_config_fp}" "start_month" "$mm" - set_file_param "${model_config_fp}" "start_day" "$dd" - set_file_param "${model_config_fp}" "start_hour" "$hh" - set_file_param "${model_config_fp}" "nhours_fcst" "${FCST_LEN_HRS}" - set_file_param "${model_config_fp}" "ncores_per_node" "${NCORES_PER_NODE}" - set_file_param "${model_config_fp}" "quilting" "${dot_quilting_dot}" - set_file_param "${model_config_fp}" "print_esmf" "${dot_print_esmf_dot}" -# -#----------------------------------------------------------------------- -# -# If the write component is to be used, then a set of parameters, in- -# cluding those that define the write component's output grid, need to -# be specified in the model configuration file (model_config_fp). This -# is done by appending a template file (in which some write-component -# parameters are set to actual values while others are set to placehol- -# ders) to model_config_fp and then replacing the placeholder values in -# the (new) model_config_fp file with actual values. The full path of -# this template file is specified in the variable WRTCMP_PA RAMS_TEMP- -# LATE_FP. -# -#----------------------------------------------------------------------- -# - if [ "$QUILTING" = "TRUE" ]; then - - cat ${WRTCMP_PARAMS_TMPL_FP} >> ${model_config_fp} - - set_file_param "${model_config_fp}" "write_groups" "$WRTCMP_write_groups" - set_file_param "${model_config_fp}" "write_tasks_per_group" "$WRTCMP_write_tasks_per_group" - - set_file_param "${model_config_fp}" "output_grid" "\'$WRTCMP_output_grid\'" - set_file_param "${model_config_fp}" "cen_lon" "$WRTCMP_cen_lon" - set_file_param "${model_config_fp}" "cen_lat" "$WRTCMP_cen_lat" - set_file_param "${model_config_fp}" "lon1" "$WRTCMP_lon_lwr_left" - set_file_param "${model_config_fp}" "lat1" "$WRTCMP_lat_lwr_left" - - if [ "${WRTCMP_output_grid}" = "rotated_latlon" ]; then - set_file_param "${model_config_fp}" "lon2" "$WRTCMP_lon_upr_rght" - set_file_param "${model_config_fp}" "lat2" "$WRTCMP_lat_upr_rght" - set_file_param "${model_config_fp}" "dlon" "$WRTCMP_dlon" - set_file_param "${model_config_fp}" "dlat" "$WRTCMP_dlat" - elif [ "${WRTCMP_output_grid}" = "lambert_conformal" ]; then - set_file_param "${model_config_fp}" "stdlat1" "$WRTCMP_stdlat1" - set_file_param "${model_config_fp}" "stdlat2" "$WRTCMP_stdlat2" - set_file_param "${model_config_fp}" "nx" "$WRTCMP_nx" - set_file_param "${model_config_fp}" "ny" "$WRTCMP_ny" - set_file_param "${model_config_fp}" "dx" "$WRTCMP_dx" - set_file_param "${model_config_fp}" "dy" "$WRTCMP_dy" - elif [ "${WRTCMP_output_grid}" = "regional_latlon" ]; then - set_file_param "${model_config_fp}" "lon2" "$WRTCMP_lon_upr_rght" - set_file_param "${model_config_fp}" "lat2" "$WRTCMP_lat_upr_rght" - set_file_param "${model_config_fp}" "dlon" "$WRTCMP_dlon" - set_file_param "${model_config_fp}" "dlat" "$WRTCMP_dlat" - fi - - fi - - done -# -#----------------------------------------------------------------------- -# -# Restore the shell options saved at the beginning of this script/function. -# -#----------------------------------------------------------------------- -# - { restore_shell_opts; } > /dev/null 2>&1 - -} - diff --git a/ush/create_model_config_file.sh b/ush/create_model_configure_file.sh similarity index 94% rename from ush/create_model_config_file.sh rename to ush/create_model_configure_file.sh index 84505566d..0707ddc4a 100644 --- a/ush/create_model_config_file.sh +++ b/ush/create_model_configure_file.sh @@ -2,11 +2,11 @@ #----------------------------------------------------------------------- # # This file defines a function that creates a model configuration file -# for the specified cycle. +# in the specified run directory. # #----------------------------------------------------------------------- # -function create_model_config_file() { +function create_model_configure_file() { # #----------------------------------------------------------------------- # @@ -80,16 +80,17 @@ nthreads \ # #----------------------------------------------------------------------- # -# Create a model configuration file within each cycle directory. +# Create a model configuration file in the specified run directory. # #----------------------------------------------------------------------- # print_info_msg "$VERBOSE" " -Creating a model configuration file (\"${MODEL_CONFIG_FN}\") within each -cycle directory..." +Creating a model configuration file (\"${MODEL_CONFIG_FN}\") in the specified +run directory (run_dir): + run_dir = \"${run_dir}\"" # -# Copy template of cycle-dependent model configure files from the templates -# directory to the current cycle directory. +# Copy template model configure files from the templates directory to the +# run directory. # model_config_fp="${run_dir}/${MODEL_CONFIG_FN}" cp_vrfy "${MODEL_CONFIG_TMPL_FP}" "${model_config_fp}" diff --git a/ush/generate_FV3LAM_wflow.sh b/ush/generate_FV3LAM_wflow.sh index 6d9ce5798..d2fb6861e 100755 --- a/ush/generate_FV3LAM_wflow.sh +++ b/ush/generate_FV3LAM_wflow.sh @@ -515,8 +515,6 @@ the forecast model directory sturcture to the experiment directory..." # Thompson microphysics parameterization to the experiment directory. # if [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_v0" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR_v1" ] || \ - [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v0" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ] || \ [ "${CCPP_PHYS_SUITE}" = "FV3_GSD_SAR" ]; then print_info_msg "$VERBOSE" " diff --git a/ush/launch_FV3LAM_wflow.sh b/ush/launch_FV3LAM_wflow.sh index 0b5aba00b..8004e32e4 100755 --- a/ush/launch_FV3LAM_wflow.sh +++ b/ush/launch_FV3LAM_wflow.sh @@ -91,8 +91,10 @@ expt_name="${EXPT_SUBDIR}" # #----------------------------------------------------------------------- # -module purge -module load rocoto +if [ "$MACHINE" != "CHEYENNE" ]; then + module purge + module load rocoto +fi # #----------------------------------------------------------------------- # diff --git a/ush/link_fix.sh b/ush/link_fix.sh index 26b3f4a5f..e4bccdd83 100755 --- a/ush/link_fix.sh +++ b/ush/link_fix.sh @@ -229,31 +229,28 @@ Creating links in the FIXLAM directory to the grid files..." # "grid") fns=( \ -"C*${DOT_OR_USCORE}mosaic.halo${NHW}.nc" \ -"C*${DOT_OR_USCORE}mosaic.halo${NH4}.nc" \ -"C*${DOT_OR_USCORE}mosaic.halo${NH3}.nc" \ -"C*${DOT_OR_USCORE}grid.tile${TILE_RGNL}.halo${NHW}.nc" \ -"C*${DOT_OR_USCORE}grid.tile${TILE_RGNL}.halo${NH3}.nc" \ -"C*${DOT_OR_USCORE}grid.tile${TILE_RGNL}.halo${NH4}.nc" \ + "C*${DOT_OR_USCORE}mosaic.halo${NHW}.nc" \ + "C*${DOT_OR_USCORE}mosaic.halo${NH4}.nc" \ + "C*${DOT_OR_USCORE}mosaic.halo${NH3}.nc" \ + "C*${DOT_OR_USCORE}grid.tile${TILE_RGNL}.halo${NHW}.nc" \ + "C*${DOT_OR_USCORE}grid.tile${TILE_RGNL}.halo${NH3}.nc" \ + "C*${DOT_OR_USCORE}grid.tile${TILE_RGNL}.halo${NH4}.nc" \ ) fps=( "${fns[@]/#/${GRID_DIR}/}" ) run_task="${RUN_TASK_MAKE_GRID}" ;; # "orog") - if [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ]; then fns=( \ "C*${DOT_OR_USCORE}oro_data.tile${TILE_RGNL}.halo${NH0}.nc" \ "C*${DOT_OR_USCORE}oro_data.tile${TILE_RGNL}.halo${NH4}.nc" \ - "C*${DOT_OR_USCORE}oro_data_ss.tile${TILE_RGNL}.halo${NH0}.nc" \ - "C*${DOT_OR_USCORE}oro_data_ls.tile${TILE_RGNL}.halo${NH0}.nc" \ ) - else - fns=( \ - "C*${DOT_OR_USCORE}oro_data.tile${TILE_RGNL}.halo${NH0}.nc" \ - "C*${DOT_OR_USCORE}oro_data.tile${TILE_RGNL}.halo${NH4}.nc" \ - ) - fi + if [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ]; then + fns+=( \ + "C*${DOT_OR_USCORE}oro_data_ss.tile${TILE_RGNL}.halo${NH0}.nc" \ + "C*${DOT_OR_USCORE}oro_data_ls.tile${TILE_RGNL}.halo${NH0}.nc" \ + ) + fi fps=( "${fns[@]/#/${OROG_DIR}/}" ) run_task="${RUN_TASK_MAKE_OROG}" diff --git a/ush/set_extrn_mdl_params.sh b/ush/set_extrn_mdl_params.sh index fac2e50bc..02fbbbf00 100644 --- a/ush/set_extrn_mdl_params.sh +++ b/ush/set_extrn_mdl_params.sh @@ -51,8 +51,7 @@ if [ "${RUN_ENVIR}" = "nco" ]; then else case ${EXTRN_MDL_NAME_ICS} in - - + "GSMGFS") case $MACHINE in "WCOSS_CRAY") @@ -76,18 +75,9 @@ else "STAMPEDE") EXTRN_MDL_SYSBASEDIR_ICS="/scratch/00315/tg455890/GDAS/20190530/2019053000_mem001" ;; - *) - print_err_msg_exit "\ -The system directory in which to look for the files generated by the ex- -ternal model specified by EXTRN_MDL_NAME_ICS has not been specified for -this machine and external model combination: - MACHINE = \"$MACHINE\" - EXTRN_MDL_NAME_ICS = \"${EXTRN_MDL_NAME_ICS}\"" - ;; esac ;; - - + "FV3GFS") case $MACHINE in "WCOSS_CRAY") @@ -108,18 +98,9 @@ this machine and external model combination: "CHEYENNE") EXTRN_MDL_SYSBASEDIR_ICS="/glade/p/ral/jntp/UFS_CAM/COMGFS" ;; - *) - print_err_msg_exit "\ -The system directory in which to look for the files generated by the ex- -ternal model specified by EXTRN_MDL_NAME_ICS has not been specified for -this machine and external model combination: - MACHINE = \"$MACHINE\" - EXTRN_MDL_NAME_ICS = \"${EXTRN_MDL_NAME_ICS}\"" - ;; esac ;; - - + "RAPX") case $MACHINE in "HERA") @@ -128,18 +109,14 @@ this machine and external model combination: "JET") EXTRN_MDL_SYSBASEDIR_ICS="/misc/whome/rtrr/rap" ;; - *) - print_err_msg_exit "\ -The system directory in which to look for the files generated by the ex- -ternal model specified by EXTRN_MDL_NAME_ICS has not been specified for -this machine and external model combination: - MACHINE = \"$MACHINE\" - EXTRN_MDL_NAME_ICS = \"${EXTRN_MDL_NAME_ICS}\"" +# This goes with the comment below for the if-statement (-z EXTRN_MDL_SYSBASEDIR_ICS). +# Should not need this case. + "CHEYENNE") + EXTRN_MDL_SYSBASEDIR_ICS="dummy_value" ;; esac ;; - "HRRRX") case $MACHINE in "HERA") @@ -148,22 +125,29 @@ this machine and external model combination: "JET") EXTRN_MDL_SYSBASEDIR_ICS="/misc/whome/rtrr/hrrr" ;; - *) - print_err_msg_exit "\ -The system directory in which to look for the files generated by the ex- -ternal model specified by EXTRN_MDL_NAME_ICS has not been specified -for this machine and external model combination: - MACHINE = \"$MACHINE\" - EXTRN_MDL_NAME_ICS = \"${EXTRN_MDL_NAME_ICS}\"" + "CHEYENNE") + EXTRN_MDL_SYSBASEDIR_ICS="dummy_value" ;; esac ;; - esac fi # +# If EXTRN_MDL_SYSBASEDIR_ICS has not been set (not even to a null string), +# print out an error message and exit. +# +if [ -z "${EXTRN_MDL_SYSBASEDIR_ICS+x}" ]; then + print_err_msg_exit "\ +The variable EXTRN_MDL_SYSBASEDIR_ICS specifying the system directory +in which to look for the files generated by the external model for ICs +has not been set for the current combination of machine (MACHINE) and +external model (EXTRN_MDL_NAME_ICS): + MACHINE = \"$MACHINE\" + EXTRN_MDL_NAME_ICS = \"${EXTRN_MDL_NAME_ICS}\"" +fi +# #----------------------------------------------------------------------- # # Set EXTRN_MDL_LBCS_OFFSET_HRS, which is the number of hours to @@ -173,18 +157,18 @@ fi #----------------------------------------------------------------------- # case ${EXTRN_MDL_NAME_LBCS} in -"GSMGFS") - EXTRN_MDL_LBCS_OFFSET_HRS="0" - ;; -"FV3GFS") - EXTRN_MDL_LBCS_OFFSET_HRS="0" - ;; -"RAPX") - EXTRN_MDL_LBCS_OFFSET_HRS="3" - ;; -"HRRRX") - EXTRN_MDL_LBCS_OFFSET_HRS="0" - ;; + "GSMGFS") + EXTRN_MDL_LBCS_OFFSET_HRS="0" + ;; + "FV3GFS") + EXTRN_MDL_LBCS_OFFSET_HRS="0" + ;; + "RAPX") + EXTRN_MDL_LBCS_OFFSET_HRS="3" + ;; + "HRRRX") + EXTRN_MDL_LBCS_OFFSET_HRS="0" + ;; esac # #----------------------------------------------------------------------- @@ -209,8 +193,7 @@ if [ "${RUN_ENVIR}" = "nco" ]; then else case ${EXTRN_MDL_NAME_LBCS} in - - + "GSMGFS") case $MACHINE in "WCOSS_CRAY") @@ -234,20 +217,10 @@ else "STAMPEDE") EXTRN_MDL_SYSBASEDIR_LBCS="/scratch/00315/tg455890/GDAS/20190530/2019053000_mem001" ;; - *) - print_err_msg_exit "\ -The system directory in which to look for the files generated by the ex- -ternal model specified by EXTRN_MDL_NAME_LBCS has not been specified for -this machine and external model combination: - MACHINE = \"$MACHINE\" - EXTRN_MDL_NAME_LBCS = \"${EXTRN_MDL_NAME_LBCS}\"" - ;; esac ;; - "FV3GFS") - case $MACHINE in "WCOSS_CRAY") EXTRN_MDL_SYSBASEDIR_LBCS="/gpfs/dell1/nco/ops/com/gfs/prod" @@ -267,20 +240,10 @@ this machine and external model combination: "CHEYENNE") EXTRN_MDL_SYSBASEDIR_LBCS="/glade/p/ral/jntp/UFS_CAM/COMGFS" ;; - *) - print_err_msg_exit "\ -The system directory in which to look for the files generated by the ex- -ternal model specified by EXTRN_MDL_NAME_LBCS has not been specified for -this machine and external model combination: - MACHINE = \"$MACHINE\" - EXTRN_MDL_NAME_LBCS = \"${EXTRN_MDL_NAME_LBCS}\"" - ;; esac ;; - "RAPX") - case $MACHINE in "HERA") EXTRN_MDL_SYSBASEDIR_LBCS="/scratch2/BMC/public/data/gsd/rap/full/wrfnat" @@ -288,21 +251,13 @@ this machine and external model combination: "JET") EXTRN_MDL_SYSBASEDIR_LBCS="/misc/whome/rtrr/rap" ;; - *) - print_err_msg_exit "\ -The system directory in which to look for the files generated by the ex- -ternal model specified by EXTRN_MDL_NAME_LBCS has not been specified for -this machine and external model combination: - MACHINE = \"$MACHINE\" - EXTRN_MDL_NAME_LBCS = \"${EXTRN_MDL_NAME_LBCS}\"" + "CHEYENNE") + EXTRN_MDL_SYSBASEDIR_LBCS="dummy_value" ;; esac ;; - - - + "HRRRX") - case $MACHINE in "HERA") EXTRN_MDL_SYSBASEDIR_LBCS="/scratch2/BMC/public/data/gsd/hrrr/conus/wrfnat" @@ -310,24 +265,25 @@ this machine and external model combination: "JET") EXTRN_MDL_SYSBASEDIR_LBCS="/misc/whome/rtrr/hrrr" ;; - - *) - print_err_msg_exit "\ -The system directory in which to look for the files generated by the ex- -ternal model specified by EXTRN_MDL_NAME_LBCS has not been specified for -this machine and external model combination: - MACHINE = \"$MACHINE\" - EXTRN_MDL_NAME_LBCS = \"${EXTRN_MDL_NAME_LBCS}\"" - ;; esac ;; - - - + esac fi - +# +# If EXTRN_MDL_SYSBASEDIR_LBCS has not been set (not even to a null string), +# print out an error message and exit. +# +if [ -z "${EXTRN_MDL_SYSBASEDIR_LBCS+x}" ]; then + print_err_msg_exit "\ +The variable EXTRN_MDL_SYSBASEDIR_LBCS specifying the system directory +in which to look for the files generated by the external model for LBCs +has not been set for the current combination of machine (MACHINE) and +external model (EXTRN_MDL_NAME_LBCS): + MACHINE = \"$MACHINE\" + EXTRN_MDL_NAME_LBCS = \"${EXTRN_MDL_NAME_LBCS}\"" +fi } # #----------------------------------------------------------------------- diff --git a/ush/setup.sh b/ush/setup.sh index 00d1559e0..8eed18239 100755 --- a/ush/setup.sh +++ b/ush/setup.sh @@ -344,7 +344,7 @@ case $MACHINE in SCHED="${SCHED:-slurm}" QUEUE_DEFAULT=${QUEUE_DEFAULT:-"batch"} QUEUE_HPSS=${QUEUE_HPSS:-"service"} - QUEUE_FCST=${QUEUE_FCST:-""} + QUEUE_FCST=${QUEUE_FCST:-"batch"} ;; # "JET") @@ -942,25 +942,25 @@ fi # GWD_RRFS_v1beta_DIR="${GWD_RRFS_v1beta_BASEDIR}/${PREDEF_GRID_NAME}" if [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ]; then - if [ -z "${PREDEF_GRID_NAME}" ]; then - print_err_msg_exit "\ + if [ -z "${PREDEF_GRID_NAME}" ]; then + print_err_msg_exit "\ A predefined grid name (PREDEF_GRID_NAME) must be specified when using the FV3_RRFS_v1beta physic suite: - CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\" - PREDEF_GRID_NAME = \"${PREDEF_GRID_NAME}\"" - else - if [ ! -d "${GWD_RRFS_v1beta_DIR}" ]; then - print_err_msg_exit "\ + CCPP_PHYS_SUITE = \"${CCPP_PHYS_SUITE}\" + PREDEF_GRID_NAME = \"${PREDEF_GRID_NAME}\"" + else + if [ ! -d "${GWD_RRFS_v1beta_DIR}" ]; then + print_err_msg_exit "\ The directory (GWD_RRFS_v1beta_DIR) that should contain the gravity wave drag-related orography files for the FV3_RRFS_v1beta does not exist: -GWD_RRFS_v1beta_DIR = \"${GWD_RRFS_v1beta_DIR}\"" - elif [ ! "$( ls -A ${GWD_RRFS_v1beta_DIR} )" ]; then - print_err_msg_exit "\ + GWD_RRFS_v1beta_DIR = \"${GWD_RRFS_v1beta_DIR}\"" + elif [ ! "$( ls -A ${GWD_RRFS_v1beta_DIR} )" ]; then + print_err_msg_exit "\ The directory (GWD_RRFS_v1beta_DIR) that should contain the gravity wave drag related orography files for the FV3_RRFS_v1beta is empty: -GWD_RRFS_v1beta_DIR = \"${GWD_RRFS_v1beta_DIR}\"" - fi - fi + GWD_RRFS_v1beta_DIR = \"${GWD_RRFS_v1beta_DIR}\"" + fi + fi fi # #----------------------------------------------------------------------- diff --git a/ush/templates/FV3.input.yml b/ush/templates/FV3.input.yml index 81a441a51..93774d5b7 100644 --- a/ush/templates/FV3.input.yml +++ b/ush/templates/FV3.input.yml @@ -32,18 +32,6 @@ FV3_GSD_SAR: iopt_tbot: 2 shal_cnv: false -FV3_GSD_SAR_v1: - gfs_physics_nml: - <<: *gsd_sar_phys - lsm: 1 - lsoil_lsm: 4 - -FV3_RRFS_v0: - gfs_physics_nml: - <<: *gsd_sar_phys - lsm: 2 - lsoil_lsm: 4 - FV3_RRFS_v1beta: gfs_physics_nml: <<: *gsd_sar_phys diff --git a/ush/valid_param_vals.sh b/ush/valid_param_vals.sh index fbd0cbb6f..fc5196bef 100644 --- a/ush/valid_param_vals.sh +++ b/ush/valid_param_vals.sh @@ -21,16 +21,14 @@ valid_vals_PREDEF_GRID_NAME=( \ valid_vals_EMC_GRID_NAME=("ak" "conus" "conus_c96" "conus_orig" "guam" "hi" "pr" "GSD_HRRR3km") valid_vals_USE_CCPP=("TRUE" "true" "YES" "yes" "FALSE" "false" "NO" "no") valid_vals_CCPP_PHYS_SUITE=( \ +"FV3_CPT_v0" \ "FV3_GFS_2017_gfdlmp" \ "FV3_GFS_2017_gfdlmp_regional" \ -"FV3_GSD_v0" \ "FV3_GSD_SAR" \ -"FV3_CPT_v0" \ +"FV3_GSD_v0" \ "FV3_GFS_v15p2" \ "FV3_GFS_v16beta" \ -"FV3_GSD_SAR_v1" \ -"FV3_RRFS_v1beta" \ -"FV3_RRFS_v0" ) +"FV3_RRFS_v1beta" ) valid_vals_OZONE_PARAM_NO_CCPP=("ozphys_2015" "ozphys") valid_vals_GFDLgrid_RES=("48" "96" "192" "384" "768" "1152" "3072") valid_vals_EXTRN_MDL_NAME_ICS=("GSMGFS" "FV3GFS" "RAPX" "HRRRX") From 55480b7bf70f521898a212e1639ae748219c7a2b Mon Sep 17 00:00:00 2001 From: JeffBeck-NOAA <55201531+JeffBeck-NOAA@users.noreply.github.com> Date: Tue, 15 Sep 2020 10:19:45 -0600 Subject: [PATCH 16/19] Set ad-hoc stochastic physics scheme magnitudes to -999.0 when not used to avoid bug with do_sppt/skeb/shum namelist entries (#291) * Remove all references to /lfs3 on Jet * Add Ben and Ratko to the CODEOWNERS file * Replace hard-coded make_orog module file with build-level module file in UFS_UTILS * Remove hard-coded make_sfc_climo module file * Fixes after updating fork with authoritative repo * Set ad-hoc stochastic physics scheme magnitudes to -999.0 when not used to avoid bug with do_sppt/skeb/shum namelist entries * Change stanzas in setup.sh for setting the ad-hoc schemes to "TRUE" and "FALSE" from lowercase to uppercase, and move the "if false, then -999.0" block from the generate to the setup script --- ush/setup.sh | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/ush/setup.sh b/ush/setup.sh index 8eed18239..d76c45fa6 100755 --- a/ush/setup.sh +++ b/ush/setup.sh @@ -244,10 +244,10 @@ check_var_valid_value "DO_SHUM" "valid_vals_DO_SHUM" DO_SHUM=${DO_SHUM^^} if [ "${DO_SHUM}" = "TRUE" ] || \ [ "${DO_SHUM}" = "YES" ]; then - DO_SHUM="true" + DO_SHUM="TRUE" elif [ "${DO_SHUM}" = "FALSE" ] || \ [ "${DO_SHUM}" = "NO" ]; then - DO_SHUM="false" + DO_SHUM="FALSE" fi # #----------------------------------------------------------------------- @@ -264,10 +264,10 @@ check_var_valid_value "DO_SPPT" "valid_vals_DO_SPPT" DO_SPPT=${DO_SPPT^^} if [ "${DO_SPPT}" = "TRUE" ] || \ [ "${DO_SPPT}" = "YES" ]; then - DO_SPPT="true" + DO_SPPT="TRUE" elif [ "${DO_SPPT}" = "FALSE" ] || \ [ "${DO_SPPT}" = "NO" ]; then - DO_SPPT="false" + DO_SPPT="FALSE" fi # #----------------------------------------------------------------------- @@ -284,11 +284,32 @@ check_var_valid_value "DO_SKEB" "valid_vals_DO_SKEB" DO_SKEB=${DO_SKEB^^} if [ "${DO_SKEB}" = "TRUE" ] || \ [ "${DO_SKEB}" = "YES" ]; then - DO_SKEB="true" + DO_SKEB="TRUE" elif [ "${DO_SKEB}" = "FALSE" ] || \ [ "${DO_SKEB}" = "NO" ]; then - DO_SKEB="false" + DO_SKEB="FALSE" fi +# +#----------------------------------------------------------------------- +# +# Set magnitude of stochastic ad-hoc schemes to -999.0 if they are not +# being used. This is required at the moment, since "do_shum/sppt/skeb" +# does not override the use of the scheme unless the magnitude is also +# specifically set to -999.0. If all "do_shum/sppt/skeb" are set to +# "false," then none will run, regardless of the magnitude values. +# +#----------------------------------------------------------------------- +# +if [ "${DO_SHUM}" = "FALSE" ]; then + SHUM_MAG=-999.0 +fi +if [ "${DO_SKEB}" = "FALSE" ]; then + SKEB_MAG=-999.0 +fi +if [ "${DO_SPPT}" = "FALSE" ]; then + SPPT_MAG=-999.0 +fi + # #----------------------------------------------------------------------- # From 8b59dee9806f5e9aa2fc8cbee3897725d5f81cca Mon Sep 17 00:00:00 2001 From: JeffBeck-NOAA <55201531+JeffBeck-NOAA@users.noreply.github.com> Date: Tue, 15 Sep 2020 11:46:32 -0600 Subject: [PATCH 17/19] Add halo blending option. (#292) * Remove all references to /lfs3 on Jet * Add Ben and Ratko to the CODEOWNERS file * Replace hard-coded make_orog module file with build-level module file in UFS_UTILS * Remove hard-coded make_sfc_climo module file * Fixes after updating fork with authoritative repo * Set ad-hoc stochastic physics scheme magnitudes to -999.0 when not used to avoid bug with do_sppt/skeb/shum namelist entries * Add nrows to input.nml, HALO_BLEND to config_defaults.sh, and apply HALO_BLEND user-defined value during generate step. * Add nrows_blend to the template namelist file. * Add comment in config_defaults.sh to set HALO_BLEND to zero if the user wants to shut it off. --- ush/config_defaults.sh | 10 ++++++++++ ush/generate_FV3LAM_wflow.sh | 1 + ush/templates/input.nml.FV3 | 1 + 3 files changed, 12 insertions(+) diff --git a/ush/config_defaults.sh b/ush/config_defaults.sh index f99acdd60..8eb2897f1 100644 --- a/ush/config_defaults.sh +++ b/ush/config_defaults.sh @@ -1219,6 +1219,16 @@ SKEB_VDOF="10" USE_ZMTNBLCK="false" # #----------------------------------------------------------------------- +# +# HALO_BLEND: +# Number of rows into the computational domain that should be blended +# with the LBCs. To shut of halo blending, this can be set to zero. +# +#----------------------------------------------------------------------- +# +HALO_BLEND=10 +# +#----------------------------------------------------------------------- # # GWD_RRFS_v1beta_BASEDIR: # Temporary workflow variable specifies the base directory in which to diff --git a/ush/generate_FV3LAM_wflow.sh b/ush/generate_FV3LAM_wflow.sh index d2fb6861e..9a7cb20c4 100755 --- a/ush/generate_FV3LAM_wflow.sh +++ b/ush/generate_FV3LAM_wflow.sh @@ -669,6 +669,7 @@ settings="\ 'fv_core_nml': { 'target_lon': ${LON_CTR}, 'target_lat': ${LAT_CTR}, + 'nrows_blend': ${HALO_BLEND}, # # Question: # For a ESGgrid type grid, what should stretch_fac be set to? This depends diff --git a/ush/templates/input.nml.FV3 b/ush/templates/input.nml.FV3 index aa52e07dd..75cc97c8f 100644 --- a/ush/templates/input.nml.FV3 +++ b/ush/templates/input.nml.FV3 @@ -103,6 +103,7 @@ nord = 2 nord_zs_filter = 4 npz = 64 + nrows_blend = 10 ntiles = 1 nudge_qv = .false. nwat = 6 From fbd282611edbd62ce6f2a554aaf8b29bfddee4c3 Mon Sep 17 00:00:00 2001 From: gsketefian <31046882+gsketefian@users.noreply.github.com> Date: Thu, 17 Sep 2020 15:58:24 -0600 Subject: [PATCH 18/19] Add new subconus 3km predefined grid; add WE2E tests for this and the GSD_HRRR25km grid. (#295) ## DESCRIPTION OF CHANGES: * Add new subconus 3km grid of ESGgrid type named GSD_SUBCONUS3km. * Allow this as well as the GSD_HRRR25km, GSD_HRRR13km, and GSD_RAP13km grids to run in NCO mode. * Add new WE2E test for the GSD_SUBCONUS3km grid in NCO mode named nco_GSD_SUBCONUS3km_HRRRX_RAPX. * Add new WE2E test for the GSD_HRRR25km grid in NCO mode named nco_GSD_HRRR25km_HRRRX_RAPX. ## TESTS CONDUCTED: Ran the two new WE2E tests on hera -- nco_GSD_SUBCONUS3km_HRRRX_RAPX and nco_GSD_HRRR25km_HRRRX_RAPX. Both completed successfully. The changes do not affect any of the other WE2E tests, so those were not run. --- .../config.nco_GSD_HRRR25km_HRRRX_RAPX.sh | 111 ++++++++++++++++++ .../config.nco_GSD_SUBCONUS3km_HRRRX_RAPX.sh | 111 ++++++++++++++++++ tests/baselines_list.txt | 1 + ush/set_predef_grid_params.sh | 57 +++++++++ ush/setup.sh | 4 +- ush/valid_param_vals.sh | 24 +++- 6 files changed, 302 insertions(+), 6 deletions(-) create mode 100644 tests/baseline_configs/config.nco_GSD_HRRR25km_HRRRX_RAPX.sh create mode 100644 tests/baseline_configs/config.nco_GSD_SUBCONUS3km_HRRRX_RAPX.sh diff --git a/tests/baseline_configs/config.nco_GSD_HRRR25km_HRRRX_RAPX.sh b/tests/baseline_configs/config.nco_GSD_HRRR25km_HRRRX_RAPX.sh new file mode 100644 index 000000000..311be7ee6 --- /dev/null +++ b/tests/baseline_configs/config.nco_GSD_HRRR25km_HRRRX_RAPX.sh @@ -0,0 +1,111 @@ +# +# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required +# inputs to the script that launces the WE2E test experiments. That script +# will use those inputs to fill in the values of these variables below. +# +MACHINE="" +ACCOUNT="" +EXPT_SUBDIR="" +# +# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS +# are optional inputs to the script that launces the WE2E test experiments. +# If one or both of these values are specified, then that script will +# replace the default values of these variables below with those values. +# Otherwise, it will keep the default values. +# +USE_CRON_TO_RELAUNCH="TRUE" +CRON_RELAUNCH_INTVL_MNTS="02" + +VERBOSE="TRUE" + +RUN_ENVIR="nco" +PREEXISTING_DIR_METHOD="rename" + +EMC_GRID_NAME="GSD_HRRR25km" +GRID_GEN_METHOD="ESGgrid" + +QUILTING="TRUE" +USE_CCPP="TRUE" +CCPP_PHYS_SUITE="FV3_GSD_SAR" +FCST_LEN_HRS="06" +LBC_SPEC_INTVL_HRS="3" + +DATE_FIRST_CYCL="20200801" +DATE_LAST_CYCL="20200801" +CYCL_HRS=( "00" ) + +EXTRN_MDL_NAME_ICS="HRRRX" +EXTRN_MDL_NAME_LBCS="RAPX" + +# +# In NCO mode, the following don't need to be explicitly set to "FALSE" +# in this configuration file because the experiment generation script +# will do this (along with printing out an informational message). +# +#RUN_TASK_MAKE_GRID="FALSE" +#RUN_TASK_MAKE_OROG="FALSE" +#RUN_TASK_MAKE_SFC_CLIMO="FALSE" + +# +# In order to prevent simultaneous WE2E (Workflow End-to-End) tests that +# are running in NCO mode and which run the same cycles from interfering +# with each other, for each cycle, each such test must have a distinct +# path to the following two directories: +# +# 1) The directory in which the cycle-dependent model input files, symlinks +# to cycle-independent input files, and raw (i.e. before post-processing) +# forecast output files for a given cycle are stored. The path to this +# directory is +# +# $STMP/tmpnwprd/$RUN/$cdate +# +# where cdate is the starting year (yyyy), month (mm), day (dd) and +# hour of the cycle in the form yyyymmddhh. +# +# 2) The directory in which the output files from the post-processor (UPP) +# for a given cycle are stored. The path to this directory is +# +# $PTMP/com/$NET/$envir/$RUN.$yyyymmdd/$hh +# +# Here, we make the first directory listed above unique to a WE2E test +# by setting RUN to the name of the current test. This will also make +# the second directory unique because it also conains the variable RUN +# in its full path, but if this directory -- or set of directories since +# it involves a set of cycles and forecast hours -- already exists from +# a previous run of the same test, then it is much less confusing to the +# user to first move or delete this set of directories during the workflow +# generation step and then start the experiment (whether we move or delete +# depends on the setting of PREEXISTING_DIR_METHOD). For this purpose, +# it is most convenient to put this set of directories under an umbrella +# directory that has the same name as the experiment. This can be done +# by setting the variable envir to the name of the current test. Since +# as mentiond above we will store this name in RUN, below we simply set +# envir to RUN. Then, for this test, the UPP output will be located in +# the directory +# +# $PTMP/com/$NET/$RUN/$RUN.$yyyymmdd/$hh +# +# Note that by the time this file is sourced by the experiment generation +# script, the script that launces the WE2E test experiments will have +# filled in the value of the variable EXPT_SUBDIR above (which contains +# the name of the experiment). Thus, below, we can assume that EXPT_SUBDIR +# has a valid value and use it to set RUN and envir. +# +RUN="${EXPT_SUBDIR}" +envir="${EXPT_SUBDIR}" + +# +# In NCO mode, the user must manually (e.g. after doing the build step) +# create the symlink "${FIXrrfs}/fix_sar" that points to EMC's FIXsar +# directory on the machine. For example, on hera, the symlink's target +# needs to be +# +# /scratch2/NCEPDEV/fv3-cam/emc.campara/fix_fv3cam/fix_sar +# +# The experiment generation script will then set FIXsar to +# +# FIXsar="${FIXrrfs}/fix_sar/${EMC_GRID_NAME}" +# +# where EMC_GRID_NAME has the value set above. +# + diff --git a/tests/baseline_configs/config.nco_GSD_SUBCONUS3km_HRRRX_RAPX.sh b/tests/baseline_configs/config.nco_GSD_SUBCONUS3km_HRRRX_RAPX.sh new file mode 100644 index 000000000..346c41b64 --- /dev/null +++ b/tests/baseline_configs/config.nco_GSD_SUBCONUS3km_HRRRX_RAPX.sh @@ -0,0 +1,111 @@ +# +# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required +# inputs to the script that launces the WE2E test experiments. That script +# will use those inputs to fill in the values of these variables below. +# +MACHINE="" +ACCOUNT="" +EXPT_SUBDIR="" +# +# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS +# are optional inputs to the script that launces the WE2E test experiments. +# If one or both of these values are specified, then that script will +# replace the default values of these variables below with those values. +# Otherwise, it will keep the default values. +# +USE_CRON_TO_RELAUNCH="TRUE" +CRON_RELAUNCH_INTVL_MNTS="02" + +VERBOSE="TRUE" + +RUN_ENVIR="nco" +PREEXISTING_DIR_METHOD="rename" + +EMC_GRID_NAME="GSD_SUBCONUS3km" +GRID_GEN_METHOD="ESGgrid" + +QUILTING="TRUE" +USE_CCPP="TRUE" +CCPP_PHYS_SUITE="FV3_GSD_SAR" +FCST_LEN_HRS="06" +LBC_SPEC_INTVL_HRS="3" + +DATE_FIRST_CYCL="20200801" +DATE_LAST_CYCL="20200801" +CYCL_HRS=( "00" ) + +EXTRN_MDL_NAME_ICS="HRRRX" +EXTRN_MDL_NAME_LBCS="RAPX" + +# +# In NCO mode, the following don't need to be explicitly set to "FALSE" +# in this configuration file because the experiment generation script +# will do this (along with printing out an informational message). +# +#RUN_TASK_MAKE_GRID="FALSE" +#RUN_TASK_MAKE_OROG="FALSE" +#RUN_TASK_MAKE_SFC_CLIMO="FALSE" + +# +# In order to prevent simultaneous WE2E (Workflow End-to-End) tests that +# are running in NCO mode and which run the same cycles from interfering +# with each other, for each cycle, each such test must have a distinct +# path to the following two directories: +# +# 1) The directory in which the cycle-dependent model input files, symlinks +# to cycle-independent input files, and raw (i.e. before post-processing) +# forecast output files for a given cycle are stored. The path to this +# directory is +# +# $STMP/tmpnwprd/$RUN/$cdate +# +# where cdate is the starting year (yyyy), month (mm), day (dd) and +# hour of the cycle in the form yyyymmddhh. +# +# 2) The directory in which the output files from the post-processor (UPP) +# for a given cycle are stored. The path to this directory is +# +# $PTMP/com/$NET/$envir/$RUN.$yyyymmdd/$hh +# +# Here, we make the first directory listed above unique to a WE2E test +# by setting RUN to the name of the current test. This will also make +# the second directory unique because it also conains the variable RUN +# in its full path, but if this directory -- or set of directories since +# it involves a set of cycles and forecast hours -- already exists from +# a previous run of the same test, then it is much less confusing to the +# user to first move or delete this set of directories during the workflow +# generation step and then start the experiment (whether we move or delete +# depends on the setting of PREEXISTING_DIR_METHOD). For this purpose, +# it is most convenient to put this set of directories under an umbrella +# directory that has the same name as the experiment. This can be done +# by setting the variable envir to the name of the current test. Since +# as mentiond above we will store this name in RUN, below we simply set +# envir to RUN. Then, for this test, the UPP output will be located in +# the directory +# +# $PTMP/com/$NET/$RUN/$RUN.$yyyymmdd/$hh +# +# Note that by the time this file is sourced by the experiment generation +# script, the script that launces the WE2E test experiments will have +# filled in the value of the variable EXPT_SUBDIR above (which contains +# the name of the experiment). Thus, below, we can assume that EXPT_SUBDIR +# has a valid value and use it to set RUN and envir. +# +RUN="${EXPT_SUBDIR}" +envir="${EXPT_SUBDIR}" + +# +# In NCO mode, the user must manually (e.g. after doing the build step) +# create the symlink "${FIXrrfs}/fix_sar" that points to EMC's FIXsar +# directory on the machine. For example, on hera, the symlink's target +# needs to be +# +# /scratch2/NCEPDEV/fv3-cam/emc.campara/fix_fv3cam/fix_sar +# +# The experiment generation script will then set FIXsar to +# +# FIXsar="${FIXrrfs}/fix_sar/${EMC_GRID_NAME}" +# +# where EMC_GRID_NAME has the value set above. +# + diff --git a/tests/baselines_list.txt b/tests/baselines_list.txt index cb23d6132..f7968b3b9 100644 --- a/tests/baselines_list.txt +++ b/tests/baselines_list.txt @@ -2,6 +2,7 @@ FV3_RRFS_v1beta GSD_RAP13km community_ensemble_008mems community_ensemble_2mems +nco_GSD_SUBCONUS3km_HRRRX_RAPX nco_GSD_HRRR3km_FV3GFS_FV3GFS nco_GSD_HRRR3km_HRRRX_RAPX nco_conus diff --git a/ush/set_predef_grid_params.sh b/ush/set_predef_grid_params.sh index 1b1f6bd7c..5c038a93e 100644 --- a/ush/set_predef_grid_params.sh +++ b/ush/set_predef_grid_params.sh @@ -522,6 +522,63 @@ predefined domain: # #----------------------------------------------------------------------- # +# GSD's sub-CONUS domain with ~3km cells. +# +#----------------------------------------------------------------------- +# +"GSD_SUBCONUS3km") + + if [ "${GRID_GEN_METHOD}" = "GFDLgrid" ]; then + + print_err_msg_exit "\ +The parameters for a \"${GRID_GEN_METHOD}\" type grid have not yet been specified for this +predefined domain: + PREDEF_GRID_NAME = \"${PREDEF_GRID_NAME}\" + GRID_GEN_METHOD = \"${GRID_GEN_METHOD}\"" + + elif [ "${GRID_GEN_METHOD}" = "ESGgrid" ]; then + + ESGgrid_LON_CTR=-97.5 + ESGgrid_LAT_CTR=35.0 + + ESGgrid_DELX="3000.0" + ESGgrid_DELY="3000.0" + + ESGgrid_NX=840 + ESGgrid_NY=600 + + ESGgrid_WIDE_HALO_WIDTH=6 + + DT_ATMOS="40" + +# LAYOUT_X="12" +# LAYOUT_Y="10" +# BLOCKSIZE="30" + LAYOUT_X="30" + LAYOUT_Y="24" + BLOCKSIZE="35" + + if [ "$QUILTING" = "TRUE" ]; then + WRTCMP_write_groups="1" + WRTCMP_write_tasks_per_group=$(( 1*LAYOUT_Y )) + WRTCMP_output_grid="lambert_conformal" + WRTCMP_cen_lon="${ESGgrid_LON_CTR}" + WRTCMP_cen_lat="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat1="${ESGgrid_LAT_CTR}" + WRTCMP_stdlat2="${ESGgrid_LAT_CTR}" + WRTCMP_nx="825" + WRTCMP_ny="580" + WRTCMP_lon_lwr_left="-109.8" + WRTCMP_lat_lwr_left="26.5" + WRTCMP_dx="${ESGgrid_DELX}" + WRTCMP_dy="${ESGgrid_DELY}" + fi + + fi + ;; +# +#----------------------------------------------------------------------- +# # EMC's 3km CONUS grid. # #----------------------------------------------------------------------- diff --git a/ush/setup.sh b/ush/setup.sh index d76c45fa6..1ed17cffe 100755 --- a/ush/setup.sh +++ b/ush/setup.sh @@ -480,10 +480,10 @@ case "${EMC_GRID_NAME}" in "conus_c96") PREDEF_GRID_NAME="EMC_CONUS_coarse" ;; - "GSD_HRRR3km") + "GSD_HRRR25km" | "GSD_HRRR13km" | "GSD_HRRR3km" | "GSD_SUBCONUS3km") PREDEF_GRID_NAME="${EMC_GRID_NAME}" ;; - "conus_orig"|"guam"|"hi"|"pr") + "conus_orig" | "guam" | "hi" | "pr") print_err_msg_exit "\ A predefined grid (PREDEF_GRID_NAME) has not yet been defined for this EMC grid (EMC_GRID_NAME): diff --git a/ush/valid_param_vals.sh b/ush/valid_param_vals.sh index fc5196bef..f0c78df05 100644 --- a/ush/valid_param_vals.sh +++ b/ush/valid_param_vals.sh @@ -14,11 +14,26 @@ valid_vals_PREDEF_GRID_NAME=( \ "GSD_HAFSV0.A25km" \ "GSD_RRFSAK_3km" \ "GSD_HRRR_AK_50km" \ -"GSD_HRRR3km" \ +"GSD_HRRR25km" \ "GSD_HRRR13km" \ +"GSD_HRRR3km" \ +"GSD_SUBCONUS3km" \ +"GSD_RAP13km" \ +) +valid_vals_EMC_GRID_NAME=( \ +"ak" \ +"conus" \ +"conus_c96" \ +"conus_orig" \ +"guam" \ +"hi" \ +"pr" \ "GSD_HRRR25km" \ -"GSD_RAP13km" ) -valid_vals_EMC_GRID_NAME=("ak" "conus" "conus_c96" "conus_orig" "guam" "hi" "pr" "GSD_HRRR3km") +"GSD_HRRR13km" \ +"GSD_HRRR3km" \ +"GSD_SUBCONUS3km" \ +"GSD_RAP13km" \ +) valid_vals_USE_CCPP=("TRUE" "true" "YES" "yes" "FALSE" "false" "NO" "no") valid_vals_CCPP_PHYS_SUITE=( \ "FV3_CPT_v0" \ @@ -28,7 +43,8 @@ valid_vals_CCPP_PHYS_SUITE=( \ "FV3_GSD_v0" \ "FV3_GFS_v15p2" \ "FV3_GFS_v16beta" \ -"FV3_RRFS_v1beta" ) +"FV3_RRFS_v1beta" \ +) valid_vals_OZONE_PARAM_NO_CCPP=("ozphys_2015" "ozphys") valid_vals_GFDLgrid_RES=("48" "96" "192" "384" "768" "1152" "3072") valid_vals_EXTRN_MDL_NAME_ICS=("GSMGFS" "FV3GFS" "RAPX" "HRRRX") From 5acd35195cb5f39b0c358ac70eea60353a7d6afc Mon Sep 17 00:00:00 2001 From: gsketefian <31046882+gsketefian@users.noreply.github.com> Date: Fri, 18 Sep 2020 13:14:54 -0600 Subject: [PATCH 19/19] Improvements to WE2E testing system (#296) This PR modifies the script that runs the WE2E tests (run_experiments.sh) as well as the individual WE2E configuration files to allow tests to run on hera and cheyenne without the need to manually change settings (e.g. directories) in the individual test configuration files. This capability can be easily extended to other platforms by adding appropriate stanzas in run_experiments.sh. ## DESCRIPTION OF CHANGES: * Set the following workflow parameters in the run_experiments.sh script and write them to the workflow configuration file instead of having them defined in each WE2E configuration file (i.e. remove them from each WE2E configuration file): MACHINE, ACCOUNT, EXPT_SUBDIR, USE_CRON_TO_RELAUNCH, CRON_RELAUNCH_INTVL_MNTS, VERBOSE Note that all these parameters except EXPT_SUBDIR can now be set on the command line when calling run_experiments.sh. If they are not set on the command line, they get set to default values. Also, EXPT_SUBDIR always gets set to the name of the WE2E test. * Add new arguments stmp, ptmp, and verbose to run_experiments.sh so that users can specify them on the command line if they don't like the defaults. * In run_experiments.sh, source the default workflow configuration file (config_defaults.sh) to have all user-specifiable workflow variables defined in some way (even if some of those are set to nonsensical default values). * Put in a check to make sure the CCPP physics suite definition file exists in the ufs-weather-model repo. * Bug fix: Change default blending halo (HALO_BLEND) to 0 (no blending) to avoid bug in halo-blending PR. Bug is that the make_lbcs task does not create a blending zone (i.e. it assumes halo_blend is zero). ## TESTS CONDUCTED: Ran all WE2E tests except user_donwload_extrn_files on hera and cheyenne. All passed except regional_010, which has a preexisting bug related to FV3 namelist settings. Did not run user_donwload_extrn_files because it interrupts the progression of the test script (it needs improvements; but this PR does not affect downloading of external model files from NOMADS). Note that on cheyenne, the make_ics, make_lbcs, and run_post tasks often have to be run multiple times before they succeed (especially the latter two). --- .../config.FV3_RRFS_v1beta.sh | 20 -- tests/baseline_configs/config.GSD_RAP13km.sh | 30 --- .../config.community_ensemble_008mems.sh | 20 -- .../config.community_ensemble_2mems.sh | 20 -- .../config.nco_GSD_HRRR25km_HRRRX_RAPX.sh | 20 -- .../config.nco_GSD_HRRR3km_FV3GFS_FV3GFS.sh | 20 -- .../config.nco_GSD_HRRR3km_HRRRX_RAPX.sh | 20 -- .../config.nco_GSD_SUBCONUS3km_HRRRX_RAPX.sh | 20 -- tests/baseline_configs/config.nco_conus.sh | 20 -- .../baseline_configs/config.nco_conus_c96.sh | 20 -- tests/baseline_configs/config.nco_ensemble.sh | 20 -- tests/baseline_configs/config.new_ESGgrid.sh | 30 --- tests/baseline_configs/config.regional_001.sh | 20 -- tests/baseline_configs/config.regional_002.sh | 20 -- tests/baseline_configs/config.regional_003.sh | 20 -- tests/baseline_configs/config.regional_004.sh | 20 -- tests/baseline_configs/config.regional_005.sh | 20 -- tests/baseline_configs/config.regional_006.sh | 20 -- tests/baseline_configs/config.regional_007.sh | 20 -- tests/baseline_configs/config.regional_008.sh | 20 -- tests/baseline_configs/config.regional_009.sh | 20 -- tests/baseline_configs/config.regional_010.sh | 20 -- tests/baseline_configs/config.regional_011.sh | 20 -- tests/baseline_configs/config.regional_012.sh | 20 -- tests/baseline_configs/config.regional_014.sh | 24 +-- tests/baseline_configs/config.regional_015.sh | 20 -- .../config.user_download_extrn_files.sh | 20 -- .../config.user_staged_extrn_files.sh | 20 -- tests/baselines_list.txt | 3 +- tests/run_experiments.sh | 173 +++++++++++------- ush/config_defaults.sh | 2 +- ush/setup.sh | 8 +- 32 files changed, 114 insertions(+), 656 deletions(-) diff --git a/tests/baseline_configs/config.FV3_RRFS_v1beta.sh b/tests/baseline_configs/config.FV3_RRFS_v1beta.sh index ecba54ce1..af997735d 100644 --- a/tests/baseline_configs/config.FV3_RRFS_v1beta.sh +++ b/tests/baseline_configs/config.FV3_RRFS_v1beta.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.GSD_RAP13km.sh b/tests/baseline_configs/config.GSD_RAP13km.sh index 52deb86fe..d61318a11 100644 --- a/tests/baseline_configs/config.GSD_RAP13km.sh +++ b/tests/baseline_configs/config.GSD_RAP13km.sh @@ -1,33 +1,3 @@ -# -# MACHINE will be set by the workflow launch script (launch_FV3LAM_- -# wflow.sh) to value passed in as an argument to that script. -# -MACHINE="" -# -# ACCOUNT will be set by the workflow launch script (launch_FV3LAM_- -# wflow.sh) to value passed in as an argument to that script. -# -ACCOUNT="" -# -# EXPT_SUBDIR will be set by the workflow launch script (launch_FV3LAM_- -# wflow.sh) to a value obtained from the name of this file. -# -EXPT_SUBDIR="" -# -# USE_CRON_TO_RELAUNCH may be reset by the workflow launch script -# (launch_FV3LAM_wflow.sh) to value passed in as an argument to that -# script, but in case it is not, we give it a default value here. -# -USE_CRON_TO_RELAUNCH="TRUE" -# -# CRON_RELAUNCH_INTVL_MNTS may be reset by the workflow launch script -# (launch_FV3LAM_wflow.sh) to value passed in as an argument to that -# script, but in case it is not, we give it a default value here. -# -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.community_ensemble_008mems.sh b/tests/baseline_configs/config.community_ensemble_008mems.sh index fbf012049..8a88cbe19 100644 --- a/tests/baseline_configs/config.community_ensemble_008mems.sh +++ b/tests/baseline_configs/config.community_ensemble_008mems.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.community_ensemble_2mems.sh b/tests/baseline_configs/config.community_ensemble_2mems.sh index b8045d9dc..8cd6aee66 100644 --- a/tests/baseline_configs/config.community_ensemble_2mems.sh +++ b/tests/baseline_configs/config.community_ensemble_2mems.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.nco_GSD_HRRR25km_HRRRX_RAPX.sh b/tests/baseline_configs/config.nco_GSD_HRRR25km_HRRRX_RAPX.sh index 311be7ee6..50085a569 100644 --- a/tests/baseline_configs/config.nco_GSD_HRRR25km_HRRRX_RAPX.sh +++ b/tests/baseline_configs/config.nco_GSD_HRRR25km_HRRRX_RAPX.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="nco" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.nco_GSD_HRRR3km_FV3GFS_FV3GFS.sh b/tests/baseline_configs/config.nco_GSD_HRRR3km_FV3GFS_FV3GFS.sh index 4b6d80a5a..1d917253e 100644 --- a/tests/baseline_configs/config.nco_GSD_HRRR3km_FV3GFS_FV3GFS.sh +++ b/tests/baseline_configs/config.nco_GSD_HRRR3km_FV3GFS_FV3GFS.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="nco" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.nco_GSD_HRRR3km_HRRRX_RAPX.sh b/tests/baseline_configs/config.nco_GSD_HRRR3km_HRRRX_RAPX.sh index 689d4e211..24bc2c20a 100644 --- a/tests/baseline_configs/config.nco_GSD_HRRR3km_HRRRX_RAPX.sh +++ b/tests/baseline_configs/config.nco_GSD_HRRR3km_HRRRX_RAPX.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="nco" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.nco_GSD_SUBCONUS3km_HRRRX_RAPX.sh b/tests/baseline_configs/config.nco_GSD_SUBCONUS3km_HRRRX_RAPX.sh index 346c41b64..fbc8aa85c 100644 --- a/tests/baseline_configs/config.nco_GSD_SUBCONUS3km_HRRRX_RAPX.sh +++ b/tests/baseline_configs/config.nco_GSD_SUBCONUS3km_HRRRX_RAPX.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="nco" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.nco_conus.sh b/tests/baseline_configs/config.nco_conus.sh index 25ceb2e67..b22581718 100644 --- a/tests/baseline_configs/config.nco_conus.sh +++ b/tests/baseline_configs/config.nco_conus.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="nco" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.nco_conus_c96.sh b/tests/baseline_configs/config.nco_conus_c96.sh index 01f4cb74a..39d3a3c33 100644 --- a/tests/baseline_configs/config.nco_conus_c96.sh +++ b/tests/baseline_configs/config.nco_conus_c96.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="nco" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.nco_ensemble.sh b/tests/baseline_configs/config.nco_ensemble.sh index 8b35ee2d1..8bfbb540b 100644 --- a/tests/baseline_configs/config.nco_ensemble.sh +++ b/tests/baseline_configs/config.nco_ensemble.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="nco" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.new_ESGgrid.sh b/tests/baseline_configs/config.new_ESGgrid.sh index 2ab938c71..5f32253a3 100644 --- a/tests/baseline_configs/config.new_ESGgrid.sh +++ b/tests/baseline_configs/config.new_ESGgrid.sh @@ -1,33 +1,3 @@ -# -# MACHINE will be set by the workflow launch script (launch_FV3LAM_- -# wflow.sh) to value passed in as an argument to that script. -# -MACHINE="" -# -# ACCOUNT will be set by the workflow launch script (launch_FV3LAM_- -# wflow.sh) to value passed in as an argument to that script. -# -ACCOUNT="" -# -# EXPT_SUBDIR will be set by the workflow launch script (launch_FV3LAM_- -# wflow.sh) to a value obtained from the name of this file. -# -EXPT_SUBDIR="" -# -# USE_CRON_TO_RELAUNCH may be reset by the workflow launch script -# (launch_FV3LAM_wflow.sh) to value passed in as an argument to that -# script, but in case it is not, we give it a default value here. -# -USE_CRON_TO_RELAUNCH="TRUE" -# -# CRON_RELAUNCH_INTVL_MNTS may be reset by the workflow launch script -# (launch_FV3LAM_wflow.sh) to value passed in as an argument to that -# script, but in case it is not, we give it a default value here. -# -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.regional_001.sh b/tests/baseline_configs/config.regional_001.sh index 7193756ab..01d1d2265 100644 --- a/tests/baseline_configs/config.regional_001.sh +++ b/tests/baseline_configs/config.regional_001.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.regional_002.sh b/tests/baseline_configs/config.regional_002.sh index 78fa3f7d1..aa2c6b0f2 100644 --- a/tests/baseline_configs/config.regional_002.sh +++ b/tests/baseline_configs/config.regional_002.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.regional_003.sh b/tests/baseline_configs/config.regional_003.sh index f99b12e02..9748fd26a 100644 --- a/tests/baseline_configs/config.regional_003.sh +++ b/tests/baseline_configs/config.regional_003.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.regional_004.sh b/tests/baseline_configs/config.regional_004.sh index 414796226..d8845efe2 100644 --- a/tests/baseline_configs/config.regional_004.sh +++ b/tests/baseline_configs/config.regional_004.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.regional_005.sh b/tests/baseline_configs/config.regional_005.sh index 0fe4f7bce..69ece9734 100644 --- a/tests/baseline_configs/config.regional_005.sh +++ b/tests/baseline_configs/config.regional_005.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.regional_006.sh b/tests/baseline_configs/config.regional_006.sh index c43b2de5f..2a84a0fc9 100644 --- a/tests/baseline_configs/config.regional_006.sh +++ b/tests/baseline_configs/config.regional_006.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.regional_007.sh b/tests/baseline_configs/config.regional_007.sh index fa268c86b..2b6e811a8 100644 --- a/tests/baseline_configs/config.regional_007.sh +++ b/tests/baseline_configs/config.regional_007.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.regional_008.sh b/tests/baseline_configs/config.regional_008.sh index 305acdcf9..6c7f0eb2d 100644 --- a/tests/baseline_configs/config.regional_008.sh +++ b/tests/baseline_configs/config.regional_008.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.regional_009.sh b/tests/baseline_configs/config.regional_009.sh index 66a32d23f..4225ad3c0 100644 --- a/tests/baseline_configs/config.regional_009.sh +++ b/tests/baseline_configs/config.regional_009.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="nco" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.regional_010.sh b/tests/baseline_configs/config.regional_010.sh index 74db51ab0..261075426 100644 --- a/tests/baseline_configs/config.regional_010.sh +++ b/tests/baseline_configs/config.regional_010.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.regional_011.sh b/tests/baseline_configs/config.regional_011.sh index b0aca082b..27998adc5 100644 --- a/tests/baseline_configs/config.regional_011.sh +++ b/tests/baseline_configs/config.regional_011.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.regional_012.sh b/tests/baseline_configs/config.regional_012.sh index c6eb03c61..6d6a8e07a 100644 --- a/tests/baseline_configs/config.regional_012.sh +++ b/tests/baseline_configs/config.regional_012.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.regional_014.sh b/tests/baseline_configs/config.regional_014.sh index e8b72d7bb..37054d45d 100644 --- a/tests/baseline_configs/config.regional_014.sh +++ b/tests/baseline_configs/config.regional_014.sh @@ -1,28 +1,8 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -DOT_OR_USCORE="." - -VERBOSE="TRUE" - RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" +DOT_OR_USCORE="." + PREDEF_GRID_NAME="GSD_HRRR25km" GRID_GEN_METHOD="ESGgrid" QUILTING="TRUE" diff --git a/tests/baseline_configs/config.regional_015.sh b/tests/baseline_configs/config.regional_015.sh index 727a543e1..7744e8171 100644 --- a/tests/baseline_configs/config.regional_015.sh +++ b/tests/baseline_configs/config.regional_015.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.user_download_extrn_files.sh b/tests/baseline_configs/config.user_download_extrn_files.sh index b78d8eb2a..5bce3cf6a 100644 --- a/tests/baseline_configs/config.user_download_extrn_files.sh +++ b/tests/baseline_configs/config.user_download_extrn_files.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baseline_configs/config.user_staged_extrn_files.sh b/tests/baseline_configs/config.user_staged_extrn_files.sh index 78fa3f7d1..aa2c6b0f2 100644 --- a/tests/baseline_configs/config.user_staged_extrn_files.sh +++ b/tests/baseline_configs/config.user_staged_extrn_files.sh @@ -1,23 +1,3 @@ -# -# The values of the variables MACHINE, ACCOUNT, and EXPT_SUBDIR are required -# inputs to the script that launces the WE2E test experiments. That script -# will use those inputs to fill in the values of these variables below. -# -MACHINE="" -ACCOUNT="" -EXPT_SUBDIR="" -# -# The values of the variables USE_CRON_TO_RELAUNCH and CRON_RELAUNCH_INTVL_MNTS -# are optional inputs to the script that launces the WE2E test experiments. -# If one or both of these values are specified, then that script will -# replace the default values of these variables below with those values. -# Otherwise, it will keep the default values. -# -USE_CRON_TO_RELAUNCH="TRUE" -CRON_RELAUNCH_INTVL_MNTS="02" - -VERBOSE="TRUE" - RUN_ENVIR="community" PREEXISTING_DIR_METHOD="rename" diff --git a/tests/baselines_list.txt b/tests/baselines_list.txt index f7968b3b9..16f3c29b3 100644 --- a/tests/baselines_list.txt +++ b/tests/baselines_list.txt @@ -2,9 +2,10 @@ FV3_RRFS_v1beta GSD_RAP13km community_ensemble_008mems community_ensemble_2mems -nco_GSD_SUBCONUS3km_HRRRX_RAPX +nco_GSD_HRRR25km_HRRRX_RAPX nco_GSD_HRRR3km_FV3GFS_FV3GFS nco_GSD_HRRR3km_HRRRX_RAPX +nco_GSD_SUBCONUS3km_HRRRX_RAPX nco_conus nco_conus_c96 nco_ensemble diff --git a/tests/run_experiments.sh b/tests/run_experiments.sh index 075e3d88f..2c91dd120 100755 --- a/tests/run_experiments.sh +++ b/tests/run_experiments.sh @@ -15,10 +15,10 @@ scrfunc_dir=$( dirname "${scrfunc_fp}" ) # #----------------------------------------------------------------------- # -# The current script should be located in the "tests" subdirectory of -# the workflow directory, which we denote by homerrfs. Thus, the work- -# flow directory (homerrfs) is the one above the directory of the cur- -# rent script. Set HOMRErrfs accordingly. +# The current script should be located in the "tests" subdirectory of the +# workflow's top-level directory, which we denote by homerrfs. Thus, +# homerrfs is the directory one level above the directory in which the +# current script is located. Set homerrfs accordingly. # #----------------------------------------------------------------------- # @@ -65,6 +65,9 @@ valid_args=( \ "account" \ "use_cron_to_relaunch" \ "cron_relaunch_intvl_mnts" \ +"stmp" \ +"ptmp" \ +"verbose" \ ) process_args valid_args "$@" # @@ -141,6 +144,14 @@ fi # #----------------------------------------------------------------------- # +# Source the default workflow configuration file. +# +#----------------------------------------------------------------------- +# +. ${ushdir}/config_defaults.sh +# +#----------------------------------------------------------------------- +# # Get the full path to the experiments list file and verify that it exists. # #----------------------------------------------------------------------- @@ -382,7 +393,7 @@ fi # baseline and the experiment. # expt_config_fp="$ushdir/config.${expt_name}.sh" - cp_vrfy "${baseline_config_fp}" "${expt_config_fp}" +# cp_vrfy "${baseline_config_fp}" "${expt_config_fp}" # #----------------------------------------------------------------------- # @@ -391,15 +402,61 @@ fi # #----------------------------------------------------------------------- # - set_bash_param "${expt_config_fp}" "EXPT_SUBDIR" "${expt_subdir}" +# set_bash_param "${expt_config_fp}" "EXPT_SUBDIR" "${expt_subdir}" +# +#----------------------------------------------------------------------- +# +# Source the experiment configuration file. # #----------------------------------------------------------------------- # +# . ${expt_config_fp} +# +#----------------------------------------------------------------------- +# +# Source the experiment baseline configuration file. +# +#----------------------------------------------------------------------- # + . ${baseline_config_fp} +# +#----------------------------------------------------------------------- +# +# Set MACHINE, ACCOUNT, and EXPT_SUBDIR using the values provided on the +# command line or set above. These override any values set in the default +# workflow configuration file sourced above. Then write them to the actual +# workflow configuration file for the test. # #----------------------------------------------------------------------- # MACHINE="${machine^^}" + ACCOUNT="${account}" + EXPT_SUBDIR="${expt_subdir}" + USE_CRON_TO_RELAUNCH=${use_cron_to_relaunch:-"TRUE"} + CRON_RELAUNCH_INTVL_MNTS=${cron_relaunch_intvl_mnts:-"02"} + VERBOSE=${verbose:-"TRUE"} + + { cat << EOM >> ${expt_config_fp} +# +# The machine and account. +# +MACHINE="${MACHINE}" +ACCOUNT="${ACCOUNT}" +EXPT_SUBDIR="${EXPT_SUBDIR}" +# +# Whether or not to resubmit the worfklow to the job submission system +# using cron. +# +USE_CRON_TO_RELAUNCH="${USE_CRON_TO_RELAUNCH}" +CRON_RELAUNCH_INTVL_MNTS="${CRON_RELAUNCH_INTVL_MNTS}" +VERBOSE="${VERBOSE}" + +EOM + } || print_err_msg_exit "\ +Heredoc (cat) command failed." + +# Append test-specific values to the workflow configuration file. + cat "${baseline_config_fp}" >> "${expt_config_fp}" # #----------------------------------------------------------------------- # @@ -413,21 +470,23 @@ fi # #----------------------------------------------------------------------- # - if [ ! -z "$machine" ]; then - set_bash_param "${expt_config_fp}" "MACHINE" "${MACHINE}" - fi - - if [ ! -z "$account" ]; then - set_bash_param "${expt_config_fp}" "ACCOUNT" "$account" - fi - - if [ ! -z "${use_cron_to_relaunch}" ]; then - set_bash_param "${expt_config_fp}" "USE_CRON_TO_RELAUNCH" "${use_cron_to_relaunch}" - fi - - if [ ! -z "${cron_relaunch_intvl_mnts}" ]; then - set_bash_param "${expt_config_fp}" "CRON_RELAUNCH_INTVL_MNTS" "${cron_relaunch_intvl_mnts}" - fi +## if [ ! -z "$machine" ]; then +## set_bash_param "${expt_config_fp}" "MACHINE" "${MACHINE}" +## fi +# set_bash_param "${expt_config_fp}" "MACHINE" "${MACHINE}" +## +## if [ ! -z "$account" ]; then +## set_bash_param "${expt_config_fp}" "ACCOUNT" "$account" +## fi +# set_bash_param "${expt_config_fp}" "ACCOUNT" "$account" +# +# if [ ! -z "${use_cron_to_relaunch}" ]; then +# set_bash_param "${expt_config_fp}" "USE_CRON_TO_RELAUNCH" "${use_cron_to_relaunch}" +# fi +# +# if [ ! -z "${cron_relaunch_intvl_mnts}" ]; then +# set_bash_param "${expt_config_fp}" "CRON_RELAUNCH_INTVL_MNTS" "${cron_relaunch_intvl_mnts}" +# fi # #----------------------------------------------------------------------- # @@ -435,25 +494,6 @@ fi # #----------------------------------------------------------------------- # -# Might be better to source both config_defaults.sh and the configuration -# file for the test. That way, variables will have default values and -# we don't have to check whether or not they're set. Also, do the sourcing -# just once if possible instead of many times as below. -# - - PREDEF_GRID_NAME=$( - . ${expt_config_fp} - if [ -z "${PREDEF_GRID_NAME+x}" ]; then - echo "" - else - echo "${PREDEF_GRID_NAME}" - fi - ) -#echo "PREDEF_GRID_NAME = \"${PREDEF_GRID_NAME}\"" -#exit - - RUN_TASK_MAKE_GRID=$( . ${expt_config_fp} ; echo "${RUN_TASK_MAKE_GRID}" ) - if [ ${RUN_TASK_MAKE_GRID} = "FALSE" ]; then if [ "$MACHINE" = "HERA" ]; then @@ -486,8 +526,6 @@ with a nonzero status." # #----------------------------------------------------------------------- # - RUN_TASK_MAKE_OROG=$( . ${expt_config_fp} ; echo "${RUN_TASK_MAKE_OROG}" ) - if [ ${RUN_TASK_MAKE_OROG} = "FALSE" ]; then if [ "$MACHINE" = "HERA" ]; then @@ -520,8 +558,6 @@ with a nonzero status." # #----------------------------------------------------------------------- # - RUN_TASK_MAKE_SFC_CLIMO=$( . ${expt_config_fp} ; echo "${RUN_TASK_MAKE_SFC_CLIMO}" ) - if [ ${RUN_TASK_MAKE_SFC_CLIMO} = "FALSE" ]; then if [ "$MACHINE" = "HERA" ]; then @@ -547,9 +583,6 @@ the pregenerated grid files to the workflow configuration file returned with a nonzero status." fi - -#On hera: - # #----------------------------------------------------------------------- # @@ -557,8 +590,6 @@ with a nonzero status." # #----------------------------------------------------------------------- # - CCPP_PHYS_SUITE=$( . ${expt_config_fp} ; echo "${CCPP_PHYS_SUITE}" ) - if [ "${CCPP_PHYS_SUITE}" = "FV3_RRFS_v1beta" ]; then if [ "$MACHINE" = "HERA" ]; then @@ -598,31 +629,31 @@ a nonzero status." # #----------------------------------------------------------------------- # - RUN_ENVIR=$( . ${expt_config_fp} ; echo "${RUN_ENVIR}" ) - if [ "${RUN_ENVIR}" = "nco" ]; then -# Note: Need COMINgfs only if using FV3GFS or GSMGFS as the external -# model for ICs or LBCs. Modify the logic below later. + nco_dirs=$( readlink -f "$homerrfs/../../nco_dirs" ) + STMP=${stmp:-"${nco_dirs}/stmp"} + PTMP=${ptmp:-"${nco_dirs}/ptmp"} - if [ "$MACHINE" = "HERA" ]; then - COMINgfs="/scratch1/NCEPDEV/hwrf/noscrub/hafs-input/COMGFS" - STMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/stmp" - PTMP="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/NCO_dirs/ptmp" - elif [ "$MACHINE" = "JET" ]; then - COMINgfs="/lfs1/HFIP/hwrf-data/hafs-input/COMGFS" - STMP="/mnt/lfs1/BMC/fim/Gerard.Ketefian/UFS_CAM/NCO_dirs/stmp" - PTMP="/mnt/lfs1/BMC/fim/Gerard.Ketefian/UFS_CAM/NCO_dirs/ptmp" - elif [ "$MACHINE" = "CHEYENNE" ]; then - COMINgfs="/glade/scratch/ketefian/NCO_dirs/COMGFS" - STMP="/glade/scratch/ketefian/NCO_dirs/stmp" - PTMP="/glade/scratch/ketefian/NCO_dirs/ptmp" - else - print_err_msg_exit "\ + if [ "${EXTRN_MDL_NAME_ICS}" = "FV3GFS" ] || \ + [ "${EXTRN_MDL_NAME_ICS}" = "GSMGFS" ] || \ + [ "${EXTRN_MDL_NAME_LBCS}" = "FV3GFS" ] || \ + [ "${EXTRN_MDL_NAME_LBCS}" = "GSMGFS" ]; then + + if [ "$MACHINE" = "HERA" ]; then + COMINgfs="/scratch1/NCEPDEV/hwrf/noscrub/hafs-input/COMGFS" + elif [ "$MACHINE" = "JET" ]; then + COMINgfs="/lfs1/HFIP/hwrf-data/hafs-input/COMGFS" + elif [ "$MACHINE" = "CHEYENNE" ]; then + COMINgfs="/glade/scratch/ketefian/NCO_dirs/COMGFS" + else + print_err_msg_exit "\ The directories COMINgfs, STMP, and PTMP that need to be specified when running the workflow in NCO-mode (i.e. RUN_ENVIR set to \"nco\") have not been specified for this machine (MACHINE): MACHINE= \"${MACHINE}\"" + fi + fi { cat << EOM >> ${expt_config_fp} @@ -651,10 +682,10 @@ a nonzero status." if [ ${do_user_staged_extrn} = "TRUE" ]; then - EXTRN_MDL_NAME_ICS=$( . ${expt_config_fp} ; echo "${EXTRN_MDL_NAME_ICS}" ) - EXTRN_MDL_NAME_LBCS=$( . ${expt_config_fp} ; echo "${EXTRN_MDL_NAME_LBCS}" ) - FCST_LEN_HRS=$( . ${expt_config_fp} ; echo "${FCST_LEN_HRS}" ) - LBC_SPEC_INTVL_HRS=$( . ${expt_config_fp} ; echo "${LBC_SPEC_INTVL_HRS}" ) +# EXTRN_MDL_NAME_ICS=$( . ${expt_config_fp} ; echo "${EXTRN_MDL_NAME_ICS}" ) +# EXTRN_MDL_NAME_LBCS=$( . ${expt_config_fp} ; echo "${EXTRN_MDL_NAME_LBCS}" ) +# FCST_LEN_HRS=$( . ${expt_config_fp} ; echo "${FCST_LEN_HRS}" ) +# LBC_SPEC_INTVL_HRS=$( . ${expt_config_fp} ; echo "${LBC_SPEC_INTVL_HRS}" ) if [ "$MACHINE" = "HERA" ]; then extrn_mdl_source_baseir="/scratch2/BMC/det/Gerard.Ketefian/UFS_CAM/staged_extrn_mdl_files" diff --git a/ush/config_defaults.sh b/ush/config_defaults.sh index 8eb2897f1..90b18f0fc 100644 --- a/ush/config_defaults.sh +++ b/ush/config_defaults.sh @@ -1226,7 +1226,7 @@ USE_ZMTNBLCK="false" # #----------------------------------------------------------------------- # -HALO_BLEND=10 +HALO_BLEND=0 # #----------------------------------------------------------------------- # diff --git a/ush/setup.sh b/ush/setup.sh index 1ed17cffe..b3cb5274e 100755 --- a/ush/setup.sh +++ b/ush/setup.sh @@ -1124,7 +1124,7 @@ the experiment generation script." COMOUT_BASEDIR="$COMROOT/$NET/$envir" check_for_preexist_dir_file "${COMOUT_BASEDIR}" "${PREEXISTING_DIR_METHOD}" - + else FIXam="${EXPTDIR}/fix_am" @@ -1224,6 +1224,12 @@ if [ "${USE_CCPP}" = "TRUE" ]; then CCPP_PHYS_SUITE_FN="suite_${CCPP_PHYS_SUITE}.xml" CCPP_PHYS_SUITE_IN_CCPP_FP="${UFS_WTHR_MDL_DIR}/FV3/ccpp/suites/${CCPP_PHYS_SUITE_FN}" CCPP_PHYS_SUITE_FP="${EXPTDIR}/${CCPP_PHYS_SUITE_FN}" + if [ ! -f "${CCPP_PHYS_SUITE_IN_CCPP_FP}" ]; then + print_err_msg_exit "\ +The CCPP suite definition file (CCPP_PHYS_SUITE_IN_CCPP_FP) does not exist +in the local clone of the ufs-weather-model: + CCPP_PHYS_SUITE_IN_CCPP_FP = \"${CCPP_PHYS_SUITE_IN_CCPP_FP}\"" + fi fi # #-----------------------------------------------------------------------