Utilities
Nudging
Nudging functionality is provided by fv3gfs.util.apply_nudging()
and
fv3gfs.util.get_nudging_tendencies()
. The nudging tendencies can be stored to disk
by the user, for example using a fv3gfs.util.ZarrMonitor
. A runfile using this
functionality can be found in the examples directory.
Diagnostic IO
State can be persisted to disk using either fv3gfs.util.write_state()
(described below)
or fv3gfs.util.ZarrMonitor
. The latter will coordinate between ranks to
write state to a unified Zarr store. Initializing it requires passing grid information.
This can be done directly from the namelist in a configuration dictionary like so:
import fv3gfs.util
from mpi4py import MPI
import yaml
with open('fv3config.yml', 'r') as f:
config = yaml.safe_load(f)
partitioner = fv3gfs.util.TilePartitioner.from_namelist(config['namelist'])
Alternatively, the grid information can be specified manually:
partitioner = fv3gfs.util.TilePartitioner(
layout=(1, 1)
)
Once you have a fv3gfs.util.TilePartitioner
, the monitor can be created using any
Zarr store:
import zarr
store = zarr.storage.DirectoryStore('output_dir') # relative or absolute path
ZarrMonitor(partitioner, store, mode='w', mpi_comm=MPI.COMM_WORLD)
Note this can be used with any directory store available in zarr
.
Saving state to disk
Sometimes you may want to write out model state to disk so that you can restart the model
from this state later. We provide a python-centric method for saving out and loading model state.
fv3gfs.util.read_state()
saves the state on the current rank to a file on disk,
while fv3gfs.util.write_state()
writes the rank’s state to disk. Make sure you use
different filenames for each rank!
Loading Fortran Restarts
A function fv3gfs.util.open_restart()
is available to load restart files that have
been output by the Fortran FV3GFS model. This routine will handle
loading the data on a single processor per tile and then distribute the data to other
processes on the same tile. This may cause out-of-memory errors, which can be mitigated
in a couple different ways through changes to the code base (e.g. loading a subset of
the variables or levels at a time before distributing across ranks).