Skip to content

ai2cm/fv3gfs-fortran

Repository files navigation

CircleCI

Repository Structure

This repository structure corresponds loosely to the top-level structure of the UFS, but with many submodules replaced by subtrees for convenience. See this description of the submodule hierarchy of the UFS. This table shows the canonical upstream repositories associated with different subtrees of this repository:

.                          # ~ https://github.com/ufs-community/ufs-weather-model
├── FMS                    # https://github.com/NOAA-GFDL/FMS
├── FV3                    # https://github.com/NOAA-EMC/fv3atm
│   ├── atmos_cubed_sphere # https://github.com/NOAA-GFDL/GFDL_atmos_cubed_sphere
│   └── ccpp
│       ├── framework      # https://github.com/NCAR/ccpp-framework
│       └── physics        # https://github.com/NCAR/ccpp-physics
├── serialbox              # https://github.com/GridTools/serialbox
└── stochastic_physics     # https://github.com/noaa-psd/stochastic_physics

In some cases these are actual submodules, and in other cases they are subtrees.

Deprecation of serialize build support

As September, 2023 we have deprecated the infrastructure for building and testing the model in a Docker container. All development and testing now occurs in the nix environment, described below. This means that the latest version of the repository no longer includes code to facilitate building the model to output serialized data through serialbox, which previously was done using a Docker image; if you would still like to use this functionality, be sure to check out commit b3793303df9800de341a3f8e8b234c6f4dc2b7a1 or earlier.

Developing the model and running tests

Nix

The primary mode of development in this repository now runs through the nix package manager. This package manager is available on Mac and Linux, and provides a light weight means to distribute isolated software environments.

To begin, install nix following these instructions.

(optional) We host binaries using a tool called cachix, and this will greatly speed up any builds. To use our binaries, install cachix and then run

cachix use vulcanclimatemodeling

Without using the cachix cache, FV3 and all its dependencies will need to build from source (~20 minutes). This only happens once per machine, but it is slow.

Developing

To develop the model, you can use the environment specified in shell.nix by running

nix-shell

Then configure the build to use nix

cd FV3 && ./configure nix

And build the model (from the root directory)

make build_repro

And the wrapper

make build_wrapper

At this point you can run the tests.

Testing the fortran model

Tests of the pure fortran model are included in the tests subdirectory. You can see which ones run in continuous integration by inspecting .circleci/config.yml.

Regression tests which check the bit-reproducibility of results are performed for a set of reference configurations included in tests/pytest/config. Please read the README in tests/pytest for more information about these regression tests and how to update the reference checksums.

Testing the model in different compile modes

The fortran model can be built with different sets of compiler flags, defined in the FV3/conf/*.configure.fv3 files. These sets of compiler flags facilitate running the model in different modes. For production workflows, we run the model with the repro set of compiler flags; for debugging it can be useful to compile and run the model with the debug set of compiler flags, which can facilitate catching array out of bounds errors and the like.

To build the model in repro mode use:

make build_repro

To build the model in debug mode use:

make build_debug

To build executables in both repro and debug mode use:

make build

The test infrastructure is written to detect and run tests only for which the appropriate executable exists, since regression tests produce different results when running in repro versus debug mode.

To run the full suite of fortran model tests for the compiled executables, use:

make test_fortran

Since the tests are time-consuming, during development it can often be helpful to select specific tests that pertain to the code you are developing, e.g. with the -k option of pytest:

pytest -v -k test_use_prescribed_sea_surface_properties tests/pytest/test_regression.py

There are also make rules which select tests to run based on pytest marks, e.g.:

make test_fortran_basic

Testing the Python wrapper

The FV3/wrapper subdirectory contains a python wrappper that can be used to call the fortran model for interactive ML. It's usage docs can be seen here.

To build the wrapper some additional python requirements must be available in the environment:

  • fv3config
  • pace-util
  • numpy
  • pyyaml
  • xarray
  • cython
  • mpi4py

The [nix environment][#developing] is setup automatically with these dependencies, and is the recommend development environment for iterative development (edit/build/test) of the wrapper. In other environments, e.g. HPC/DOCKER these builds dependencies will need to be manually installed.

Once the dependencies are installed, including the repro-mode version of the fortran executable, the wrapper can be built like this

make build_wrapper

To install the wrapper in some python environment, you can use the wheel built above

pip install FV3/wrapper/dist/fv3gfs_wrapper*.whl

To test the wrapper

# if you want to test FV3/wrapper in-place uncomment the line below
# otherwise it will use the version installed in the python environment
# export PYTHONPATH=$(pwd)/FV3/wrapper:$PYTHONPATH

make test_wrapper

Authentication

The input data files required by our tests are stored in a GCS bucket, stored in the us-central1 region. This data is free to use, but we have enabled requestor-pays to avoid paying for network transfer costs incurred by external users. You will need to authenticate with your own google cloud project credentials to access this data. Detailed instructions are out of scope, but usually involves the setting the following environmental variables

export FSSPEC_GS_REQUESTER_PAYS="on"
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/key.json

For more information see this documentation.