Version 13 (modified by lnerger, 3 months ago) (diff)


PDAF-OMI, the Observation Module Infrastructure

PDAF-OMI (Observation Module Infrastructure) is an extension to PDAF for a structured modular implementation of the call-back routines handling observations for PDAF. It was introduced with PDAF V1.16.

Compared to the classical variant to implement observations with PDAF, OMI is designed to reduce the coding effort for implementing the support for an observation type, its corresponding observation operator, and localization. In particular, only four routines need to be implemented for an observation type:

  • init_dim_obs
  • obs_op
  • init_dim_obs_l (only for domain-localized filters like LETKF and LESTKF)
  • localize_covar (only needed for the localized EnKF)

Here, the first routine reads the observation from file and initializes the information describing the observations. The latter three routines merely call a generi routine provided by PDAF-OMI. Other functionality needed during the analyis step bases on variables that are initialized by these routines and is provided by PDAF-OMI.

With OMI one implements one module for each observation type (like sea surface temperature data from some satellite sensor, or altimetry data). This guarantees that each observation type is handled indenpendently from the others. Thus different developers can implement observation types without interfering with the implementations by others.

Main Components of OMI

The main components of OMI are

  • observation modules: One observation-specific Fortran module for each observation type
  • callback_obs_pdafomi.F90: The observation-specific call-back routines are merely pass-through routines without own functionality. They are collected into this single file for compactness.
  • PDAF-OMI core routines: These routines are part of the PDAF library and provide functionality for observation handling, localization, and observation operators

Figure 1 shows the call structure for the analysis step with PDAF. For the analysis step, the core routines of PDAF (green; in particular PDAF_assimilate_X, with X being the chosen routine) calls different user-provided call-back functions. There are several routines, like those doing state localization, that are not related to observations (blue). OMI is concerned with those routines related to observations (red and purple).

Figure 1: Call-structure of PDAF with OMI: (green) PDAF library with core and omi; (blue) call-back routines; (red) OMI call-back routines; (purple) observation-specific modules.

With OMI, the functionality to handle observations is shifted to generic routines and observation-specific modules (obs_*_pdafomi in the third column in Fig. 1, denoted obs-module below). Most routines for the observation handling are generic with OMI and included in PDAF so that only three routines with observation specific operations need to be implemented. There is one obs-module per observation type with collects the three routines. For example, one can have one obs-module for the satellite sea surface temperature from one data provider and another one for sea level anomaly data. Important is that each of these obs-modules, which are further described below, is independent from the others. This allows us to switch between different combinations of observations ensuring that their implementations don’t interfere.

Since the actual opernations are done in the obs-modules obs_*_pdafomi, the remaining three call-back routines (init_dim_obs, obs_op, init_dim_obs_l) are reduced to pass-through routines. Thus, each of these routines contains only calls to one observation-specific routine from each obs-module. There is, in addition, one routine for deallocating the observation-related arrays which calls a generic PDAF-OMI routine for each observation type. As the call-back routines become very compact by this change, they are collected into the file callback_obs_pdafomi.F90. This is mainly for convenience, because all these routines are now ‘in one place’. This simplifies the addition of a new data type by adding a subroutine call to each of the routines in this file. (Note, that callback_obs_pdafomi.F90 does not define a Fortran module. This is because the call-back routines of PDAF are not contained in a module as this would require to compile the module together with the PDAF core so that the PDAF core would no longer be generic.) When adding a new observation type only a new subroutine call has to be added to each of the routines in callback_obs_pdafomi.F90.

Each obs-module contains four routines:

  1. init_dim_obs initializes all variables holding the information about one observation type. The information about the observation type is stored in a data structure (Fortran type).
  2. obs_op applies the observation operator to a state vector. For the latter routine one can select an observation operator from the list of operators provided by OMI, or one can to implement a new operator.
  3. init_dim_obs_l calls a PDAF-OMI routine to initialize the observation information corresponding to a local analysis domain. Here for can set a different localization radius for each observation type.
  4. localize_covar calls a PDAF-OMI routine to apply covariance localization.

For each observation type, PDAF-OMI uses a data structure that was initialized in the obs-module. The set of routines in callback_obs_pdafomi.F90 provide the observation handling for all filters and smoothers provided by PDAF. Thus once, the routines are implemented for a particular observation and the subroutine calls in callback_obs_pdafomi.F90 for this observation type are inserted, one can use each of the provided assimilation methods. Here init_dim_obs_l is only required if one plans to use domain-localized filters like LESTKF, LETKF or LNETF. Likewise, localize_covar is only required if on likes to use the loalized EnKF (LEnKF).

Further documentation of PDAF-OMI

The documentation for implementing is provided on the following pages:

Implementation examples

From PDAF V1.16, the PDAF package provides several implementation examples:

  • /tutorial/online_2D_serialmodel_omi
    This implementation includes three obs-modules. The two modules obs_A_pdafomi.F90 and obs_B_pdafomi.F90 are for observation at grid points, while obs_C_pdafomi.F90 uses an observation operator with bi-linear interpolation. In this case we have only implemented support for the global and the domain-localized filters (see `/models/lorenz96_omiz for the example supporting all filters)
  • /tutorial/online_2D_parallelmodel_omi
    This implementation includes two obs-modules (obs_A_pdafomi.F90, obs_B_pdafomi.F90) for observations at grid points. One can compare these modules with those in online_2D_serialmodel_omi to see differences in the case of a serial model to those in a parallel model
  • /models/lorenz96_omi
    This implementation uses one obs-module for observations at grid points. The implementation supports all filters that are available in PDAF. This variant uses the flexible parallelization variant (PDAF_put_state_X).