SkyLab experiments: Parameters and description

This page describes which parameters are available in SkyLab experiments, and the implementation of the four flagship experiments ran by the JSCDA team. You can see results from these on the JCSDA SkyLab website.

Experiment configuration

All the parameters for these experiments are contained within one yaml file, and running the command sets up the generic workflow (EWOK: Experiments and Workflows Orchestration Kit) for this experiment.

More information about how to build and run SkyLab is available here: Building and running SkyLab.

The experiment yaml has to contain the following information:

workflow engine: # workflow manager, only `ecworkflow` is supported at the moment

workdir: # path to tmp work directory
flowdir: # path to tmp scripts directory

suite: # Choice between including path to ``, `` (full DA), ``, ``..
model: # Choice between `qg`, `mpas`, `gfs`, `gfs_aero`, `geos_cf`, `ufs`..
model_path: # Path to model repository
modeltasks:  # Path to model specific tasks (get backgrounds, ..)
init_cycle: # Date for the first cycle of the experiment
last_cycle: # Date for the last cycle of the experiment
step_cycle: # Step between cycles

cycling mode: # Optional, `non cycling` (default; will read backgrounds from an experiment set in `init_exp`) or `cycling`, (will use forecasts from the previous cycle of current experiment as backgrounds)
init_exp: # Reference for the first background to be read from DB, to initialize the experiment.
init_type: # Optional, `fc` (default;will initialize from forecasts) or `an` (will initialize from analysis and run forecast to get backgrounds for the first DA cycle)

cost_function: # Cost function, choice between `3D-Var`, `4D-Var`, `3D-FGAT`,
window_length: # Window length
window_offset: # Offset between analysis and end of the assimilation window

forecast_length: # Forecast length after the variational task. If set to `PT0H` the forecast task will not run.
forecast_output_frequency: # Forecast output frequency

obs_sampling: # Optional, `coarse` if the coarse observation file exists
- Observation 1 # yaml configuration for observation type 1
- Observation 2 # yaml configuration for observation type 2

init_exp_obsbias: # Reference for the first obs bias to be read from DB
init_model_obsbias: # Model obs bias has been created from, e.g. `gfs`
init_provider_obsbias: # Provider obs bias has been created from. e.g. `noaa`
obsbias cycling mode: # Optional, `non cycling` will read bias correction from file at each cycle instead of cycling

AN_VARIABLES: # yaml configuration, list of analysis variables
BG_VARIABLES: #  yaml configuration, list of background variables
MODEL_VARIABLES: # yaml configuration, list of model variables

GEOMETRY: # yaml configuration, geometry and resolution for the outer loop, typically model dependent
MODEL: # yaml configuration, model to run in the forecast (and var steps if needed)

static_data: # Path to static files directory, e.g. static B, model files, or other needed files not found in r2d2 or elsewhere.
background_error_type: # Type of background error matrix, options are `hybrid`, `ensemble`, `static`
# ensemble B component parameters
BACKGROUND_ERROR_LOCALIZATION: # Yaml file for localizations
members: # Number of members in the ensemble B matrix
ensb_weight: # Weight of ensemble B matrix
ensemble_exp: # Reference to read ensemble backgrounds from DB
# static B component parameters
BACKGROUND_ERROR: # Yaml file for static B
staticb_weight: # Weight of static B

MINIMIZER: {algorithm: DRPLanczos} # Options are all the minimizers available in OOPS
ninner: 10 # Maximum number of iterations in quadratic minimization
reduc: 0.05 # Target norm reduction in quadratic minimization
MIN_GEOMETRY: # yaml configuration, geometry and resolution inside the quadratic minimization
LINEAR_MODEL: # yaml configuration, linear model to run in 4D-Var applications
diag: ombg # diagnostics in obs space, can be `oman`, `ombg`..

plots: # yaml configuration, activates log based and model-space plots

evaluation:   # running evaluation or not
  evaluation_frequency: PT6H   # how frequently to evaluate the forecast within the forecast length
  evaluation_baseline: self_anl   # evaluation is against with 'self_anl' or analyses from other exps (expid).
  evaluation_cycles: ['00']       # a list that defines the valid cycle of evaluation.
  type: metplus        # 'metplus' or 'basic'
  verif_grid: G002     # if type is metplus, can select evaluation on which grid definition, GXXX
                       # (more info
  grid_stat_template: !ENV ${JEDI_SRC}/skylab/eval/metplus/GridStat.conf.IN  # the template to run GridStat in METplus

Retrieving experiment configuration

A new feature in Skylab v8 and later is the ability to retrieve the experiment configuration used for Skylab experiments via Research Repository for Data and Diagnostics (R2D2). An example on how to do this in python is given below. Update <my_exp_name> to the experiment id (expid).

from r2d2 import R2D2Index
experiment_index_object = R2D2Index.get(item='experiment', name=<my_exp_name>)
yaml_name = experiment_index_object.get_property('yaml_name')
yaml_text = experiment_index_object.get_property('yaml_text')

Then adding the line print(yaml_text) to the above script would return the yaml name, such as:


And adding the line print(yaml_text) to the script would return the configuration file used, such as:

# (C) Copyright 2020-2022 UCAR
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at

workflow engine: ecworkflow

workdir: !ENV ${EWOK_WORKDIR}
flowdir: !ENV ${EWOK_FLOWDIR}

suite: !ENV ${JEDI_SRC}/ewok/src/ewok/suites/
model: l95
model_path: !ENV ${JEDI_SRC}/skylab/models/l95
init_cycle: 2020-01-01T00:00:00Z
last_cycle: 2020-01-01T18:00:00Z
step_cycle: PT6H

cycling mode: cycling
init_type: an
init_exp: test

window_length: PT6H
window_offset: PT3H

forecast_length: P2D
forecast_output_frequency: PT3H

GEOMETRY: !INCLUDE ${JEDI_SRC}/skylab/models/l95/defaults/resol.yaml
MODEL: !INCLUDE ${JEDI_SRC}/skylab/models/l95/defaults/model.yaml

cost_function: 4D-Var
AN_VARIABLES: !INCLUDE ${JEDI_SRC}/skylab/models/l95/defaults/an_variables.yaml

BACKGROUND_ERROR: !INCLUDE ${JEDI_SRC}/skylab/models/l95/defaults/bstatic.yaml

- !INCLUDE ${JEDI_SRC}/skylab/models/l95/defaults/obs.yaml

JC: !INCLUDE ${JEDI_SRC}/skylab/models/l95/defaults/jc.yaml
MINIMIZER: !INCLUDE ${JEDI_SRC}/skylab/algorithms/drplanczos.yaml

ninner: 10
reduc: 1.0e-5
MIN_GEOMETRY: !INCLUDE ${JEDI_SRC}/skylab/models/l95/defaults/resol.yaml
LINEAR_MODEL: !INCLUDE ${JEDI_SRC}/skylab/models/l95/defaults/tlm.yaml

More information on R2D2 can be found in the R2D2 README.

Plots configuration

Yaml configuration for the plots (included in plots section of the experiment configuration yaml) allows the user to configure plots of variational diagnostics, and plots of model fields on lat-lon grid. The following options are available:

# For model plots
  plot_geom: 1                            # lat-lon grid resolution in degrees
  plot_variables: [air_temperature]       # list of variables to output
  plot_pressure_levels: [850, 500, 250]   # list of pressure levels in hPa to plot (optional)
  plot_model_levels: [1]                  # list of model levels to plot (optional). Typically either
                                          # pressure or model levels are specified. For plotting 2D
                                          # variables both plot_pressure_levels and plot_model_levels
                                          # can be omitted
  plot_4d: true                           # flag to output 4D increments for 4DEnVar (false by default)
  plot_region: conus                      # key for limiting plot region to CONtinental US (CONUS)
                                          # omiting key will produce global plot

# Plots of variational diagnostics
- CostFunction # line plot of minimization-related diagnostics
- JoJb         # time-series of Jo & Jb
- trHKbyp      # time-series of the trace of HK scaled by the number of observations
- ObCnt        # barplot of the mean observation count per cycle
- TotImp       # barplot of the mean total impact per cycle (Jo reduction)
- ImpPerOb     # barplot of the mean impact per observation per cycle (Jo reduction)
- FracImp      # barplot of the mean fractional impact per cycle (Jo reduction)

Plot region

Currently, the only two available plot regions are global and conus. However, with a few modifications in the SIMOBS repository, a user can change the domain to another limited area. In script for the located in simobs/src/simobs/plotting, find the if block that defines the CONUS region:

map_projection =
map_transform =
image_extent = (-120, -70, 25, 50)
lon_gridlines = [-110, -100, -90, -80]
lat_gridlines = [25, 35, 45]
data_range = (230, 295, 25, 50)  # (-130, -65, 25, 50)
# slice out data within plot region
pdata, plon, plat, lats = plot_limiter(data, lat, lon, data_range)
data = pdata

The image_extent tuple roughly defines the cartopy plot window. Respectively, the entries are the west-longitude, east-longitude, southern-latitude, and northern-latitude boundaries. The lon_gridlines and lat_gridlines lists manually set the gridlines that will appear in the plot. data_range is similar to image_extent, except this is (1) what will be used to slice out the data for your region out of the global data set (so that the histogram & colorbar only include data from your chosen region) and (2) expects longitudes in the range [0, 360). The entries in image_extent and data_range should nearly correspond to eachother; the longitude bounds in data_range will likely need extend a little beyond the ones in image_extent so that the plotted data fills your entire plot window. When running an experiment, leave the plot_region: conus line in the plot configuration yaml.


Producing a limited plot region that extends around full lines of latitude (i.e., includes all longitudes), like a plot of the tropics, is not fully supported with this method. More work will be needed to produce such a plot.

Existing experiments and adding new experiments

To add a new experiment we recommend starting from an existing experiment yaml file and modify it for your case to reduce the chance of introducing syntax errors.

Light versions of these experiments are also available. Using the same dates, algorithm, model, observations and observation operators, and background. Users can run them on a local machine (look for experiment-name-small.yaml).

1. skylab-aero.yaml

The skylab-aero experiment runs an EDA with 3 members at a c96 resolution, for 17 days in August 2021. At the moment it is non cycling and running the ID model (as a placeholder for future gfs-aero model integration). It is using a static B and a 3D-Var cost function. The four instruments being assimilated are:

  • viirs_npp

  • viirs_n20

  • modis_aqua

  • modis_terra

2. skylab-atm-land.yaml

The skylab-atm-land experiment runs a full DA system (deterministic and EDA) with 25 members at a c384 resolution for outer loops and c192 for inner loops, for 30 days in February-March 2022. It is non cycling and currently running the FV3-LM model (as a placeholder for future UFS model integration).

It is using a hybrid B matrix and 3D-Var cost functions for both the deterministic and the EDA. The observations currently assimilated are:

  • radiosonde_prepbufr

  • windborne

  • aircraft_prepbufr

  • satwinds_ssec_amv

  • buoy_ldm

  • synop_ldm

  • metar_ldm

  • ship_ldm

  • scatwind

  • snowdepth_ghcn

  • gnssro_planetiq

  • gnssro_noaa_comm

  • gnssro

  • gnssro_spire

  • amsua_n19

  • amsua_n18

  • amsua_n15

  • amsua_metop-c

  • amsua_metop-b

  • cris-fsr_npp

  • cris-fsr_n20

  • iasi_metop-b

  • iasi_metop-c

  • atms_npp

  • atms_n20

  • mhs_n19

  • mhs_metop-c

  • mhs_metop-b

  • amsr2_gcom-w1

  • gmi_gpm

  • ssmis_f17

  • ssmis_f18

  • tms_tropics-01 (currently monitored only)

  • abi_g16_bt_64km

  • abi_g17_bt_64km

  • cowvr_iss

  • tempest_iss

3. skylab-marine.yaml

The skylab-marine experiment runs a single DA system at 0.25 degrees resolution for outer loops and inner loops, for 30 days in August 2021. It is non cycling (waiting for future MOM6 model integration).

It is using a static B matrix and 3D-Var cost function. The observations currently assimilated are:

  • adt_3a

  • adt_3b

  • adt_c2

  • adt_j3

  • adt_sa

  • sst_avhrr_metop-b

  • sst_avhrr_metop-c

  • ocean_profile

  • icec_ssmis_f17

  • icec_ssmis_f18

4. skylab-trace-gas.yaml

The skylab-trace-gas experiment runs a single DA system at c90 resolution for outer loops and inner loops, for 10 days in August 2021. It is non cycling and running the Pseudo model (as a placeholder for the geos-cf model integration).

It is using a static B matrix and 3D-FGAT cost function. The observations currently assimilated are:

  • tropomi_s5p_no2_tropo or tropomi_s5p_no2_total

  • mopitt_terra_co_total

  • tropomi_s5p_co_total

  • tempo_no2_tropo