WPS/WRF Install

Overview

The directory (with respect to the top of the repository) nwp_install/install-wrf/ is set up to support installation of WRF distributions. Current work has focused specifically on the installation of the WRFv4.3 WPS/WRF packages in a CTBTO-like CentOS 7 environment. However, I have used this kind of approach for many years on many systems for many distributions, so I think it is “generally portable.”

The components of this directory consist of

  • provision.py - this is a script I used at NCAR a few years ago, and is in here just as a sample to copy ideas from

  • wrfv4.0-2022-03-25/, wrfv4.3_2021-08-12/, wrfv4.3_2022-04-25/ – these are the subdirectories with all of the installation code, one for each version [NEED TO EXPLAIN THE DIFFERENCES IN THESE VERSIONS]. My intent is to package other versions, or significant modifications to existing versions, in much the same way, with descriptive title and date of implementation. In this way, it is expected that users will be able to create their own custom distributions or have a choice of other distributions.

  • README-versions.md - brief description of the WPS/WRF versions that have been successfully implemented and tested.

  • test/ – this subdirectory contains met data, configuration files, and sample output for testing an installed distribution.

All of the above are explained in more detail below, focusing on one of the WPS/WRF distributions.


wrfv4.3_2021-08-12

This is the set of resources which will install and setup, in user space (if desired) a complete WPS/WRF distribution with a user setup script to facilitate creation of custom domains and simulations, each isolated from each other.

  • setup_install_env.sh - sets up the system-specific environment variables needed for successful installation. Most importantly, this includes paths to libraries and executables needed for WPS/WRF installation.

  • wrfinstall.py - evolving script for installing and testing WRF and WPS (and maybe later, GSI and UPP) in a CTBTO CentOS 7 environment

    • Fetches (from WRF’s github) source codes

    • Compiles in specified location

    • Copies in a wrfusersetup script that allows users to create unlimited custom modeling domains based on this distribution

    • Runs a sample WPS/WRF test case to verify things work.

  • wrfusersetup/ - directory with Python driver to create a user-executed script for installing custom WRF/WPS run directories based on links and copies of pertinent files from the main WRF/WPS distribution

Sample usage

To install in a new dir, the base dir will be created (not recursively) if the path to it is valid. So, for example, if the user specifies installation in directory /home/morton/simulations/WRF4.3, the directory /home/morton/simulations/ must already exist, and the subdirectory WRF4.3 will be created as part of the installation process.

Basic help:

$ ./wrfinstall.py --help
usage: wrfinstall.py [-h] --baseinstalldir BASEINSTALLDIR --geogdatadir
                     GEOGDATADIR [--forceinstall]

optional arguments:
  -h, --help            show this help message and exit
  --baseinstalldir BASEINSTALLDIR, -b BASEINSTALLDIR
                        (Required) Base directory for installed components
  --geogdatadir GEOGDATADIR, -g GEOGDATADIR
                        (Required) Directory of the WPS geog data
  --forceinstall        (Optional, defaults to False if not specified) Full
                        install over any existing installation

The required --geogdatadir argument specifies a full path to the WPS geog data, and the install program makes a link to it in the new distribution directory. The WPS geog data is discussed in more detail in the WRF Install Technical Notes section.

The --forceinstall flag is there to help the user bypass compilation if desired (for example, for development of the wrfinstallscript or for performing basic tests on the installation). By default, if --forceinstall is not specified on the command-line, and the executables already exist in the base installation directory, then reinstallation will be skipped. We can think of this as kind of a safety device that keeps us from accidentally removing a good installation and having to go through the full compilation process again.

On the other hand, there may be times when the user wants to re-install over an existing installation, with recompilation. In this case, using the --forceinstall flag will enable the recompilation.

So, to perform a basic first installation, the user would first edit setup_install_env.sh and ensure the paths to libraries, etc. are specified correctly, and would then:

$ . setup_install_env.sh

$ ./wrfinstall.py --baseinstalldir ~/WRFV4.3-Distribution --geogdatadir /home/ctbtuser/tempgeog
.
.
.
2021-08-13 19:43:26,626  - DEBUG - wrfinstall.py:nam_nodak_test:634 --> metrid files successfully produced
2021-08-13 19:43:26,626  - INFO - wrfinstall.py:nam_nodak_test:636 --> WPS test successfully completed!!!
2021-08-13 19:43:26,626  - DEBUG - wrfinstall.py:nam_nodak_test:645 --> cwd is: /tmp/nam_nodak_2021-08-13_19_43_19/WRF
2021-08-13 19:43:26,626  - DEBUG - wrfinstall.py:nam_nodak_test:654 --> Copied in namelist.input
2021-08-13 19:43:26,626  - DEBUG - wrfinstall.py:nam_nodak_test:659 --> Linking to met_em* : ['ln -sf ../WPS/met_em* .']
2021-08-13 19:43:26,629  - DEBUG - wrfinstall.py:nam_nodak_test:664 --> Running real.exe: ['/usr/lib64/openmpi/bin/mpirun', '-np', '1', './real.exe']
 starting wrf task            0  of            1
2021-08-13 19:43:27,249  - DEBUG - wrfinstall.py:nam_nodak_test:671 --> real.exe files successfully produced
2021-08-13 19:43:27,249  - DEBUG - wrfinstall.py:nam_nodak_test:676 --> Running wrf.exe: ['/usr/lib64/openmpi/bin/mpirun', '-np', '1', './wrf.exe']
 starting wrf task            0  of            1
2021-08-13 19:44:08,068  - DEBUG - wrfinstall.py:nam_nodak_test:683 --> wrfout files successfully produced
2021-08-13 19:44:08,068  - INFO - wrfinstall.py:nam_nodak_test:685 --> Apparent successful completion of test...

and it may take up to 10-30 minutes for compilation depending on environment.

If I try it again, it will bypass the existing installation of WPS and WRF (which is where all the compile time is spent), since, by default, the --forceinstall option is set to False).

$ ./wrfinstall.py --baseinstalldir ~/WRFV4.3-Distribution --geogdatadir /home/ctbtuser/tempgeog
2021-08-13 19:45:11,389  - INFO - wrfinstall.py:main:56 --> Starting install...
2021-08-13 19:45:11,389  - DEBUG - wrfinstall.py:main:57 --> cli_args: Namespace(baseinstalldir='/home/ctbtuser/WRFV4.3-Distribution', forceinstall=False)
2021-08-13 19:45:11,389  - DEBUG - wrfinstall.py:main:67 --> MPIF90: /usr/lib64/openmpi/bin/mpif90
2021-08-13 19:45:11,389  - DEBUG - wrfinstall.py:main:74 --> MPICC: /usr/lib64/openmpi/bin/mpicc
2021-08-13 19:45:11,389  - DEBUG - wrfinstall.py:main:82 --> MPIRUN: /usr/lib64/openmpi/bin/mpirun
2021-08-13 19:45:11,389  - DEBUG - wrfinstall.py:main:92 --> NETCDF_MOD_INC: /usr/lib64/gfortran/modules
2021-08-13 19:45:11,389  - INFO - wrfinstall.py:main:134 --> /home/ctbtuser/WRFV4.3-Distribution exists... moving ahead...
2021-08-13 19:45:11,389  - INFO - wrfinstall.py:main:138 --> Starting WRF install in: /home/ctbtuser/WRFV4.3-Distribution
2021-08-13 19:45:11,389  - DEBUG - wrfinstall.py:wrf_install:195 --> wrf_install_dir: /home/ctbtuser/WRFV4.3-Distribution/WRF
2021-08-13 19:45:11,389  - INFO - wrfinstall.py:wrf_install:209 --> WRF executables exist and force_install is set to False.  Skipping ...
2021-08-13 19:45:11,389  - INFO - wrfinstall.py:main:149 --> Starting WPS install in: /home/ctbtuser/WRFV4.3-Distribution
2021-08-13 19:45:11,389  - DEBUG - wrfinstall.py:wps_install:339 --> wps_install_dir: /home/ctbtuser/WRFV4.3-Distribution/WPS
2021-08-13 19:45:11,389  - INFO - wrfinstall.py:wps_install:355 --> WPS executables exist and force_install is set to False.  Skipping ...
2021-08-13 19:45:11,389  - INFO - wrfinstall.py:run_tests:516 --> Running NAM NODAK test
2021-08-13 19:45:11,389  - DEBUG - wrfinstall.py:nam_nodak_test:545 --> Beginning of NAM NODAK test
.
.
.

and move on to the copying of wrfusersetup and then the running of a test case.

But, if I include the --forceinstall flag, then it will recompile WRF and WPS as part of the installation and test process.


wrfusersetup program

The wrfusersetup.py program is copied into the new distribution directory, and allows the user to create isolated, custom run directories based on this new distribution. The new run directories contain links to the large files and executables of the distribution directory, and copies of other files.

It is invoked as in the following example. Assuming that the WRF distribution was installed into /home/ctbtuser/WRFV4.3-Distribution, I can use this program to create a run dir as follows

$ /home/ctbtuser/WRFV4.3-Distribution/wrfusersetup.py MyNewCase
WRF src distribution directory: /home/ctbtuser/WRFV4.3-Distribution
geog data dir: /home/ctbtuser/WRFV4.3-Distribution/GEOG_DATA
Creating domain: MyNewCase in directory: /home/ctbtuser
Setting up WPS run dir: /home/ctbtuser/MyNewCase/WPS
Done creating geogrid items
Done creating metgrid items
Done creating ungrib items
Done creating util items
Setting up WRF run dir: /home/ctbtuser/MyNewCase/WRF
WRF run dir set up completed

and I can verify a full run directory as follows

$ tree -L 1 -F MyNewCase
MyNewCase
├── GEOG_DATA -> /home/ctbtuser/WRFV4.3-Distribution/GEOG_DATA/
├── WPS/
└── WRF/

3 directories, 0 files

Summary

This set of installation programs has been created to make it somewhat easy to deploy a wide range of versions of WRF/WPS, allowing for great flexibility in modeling environments. The wrfusersetup.py script allows the user to create a number of custom run directories based on the distribution of their choice.

In the past, I’ve added other WRF components (e.g. GSI, UPP) to this kind of system, and that could be done in the future.

Please refer to the WRF Install Technical Notes section if more detail is needed.