-
Notifications
You must be signed in to change notification settings - Fork 3
Documentation letkf_tools.f90
Steve Penny edited this page Aug 9, 2016
·
8 revisions
This is the main processing subroutine of the letkf package. It calls the core letkf algorithm for each gridpoint.
das_letkf
gues3d(nij1,nlev,nbv,nv3d) ! background ensemble members.
gues2d(nij1,nbv,nv2d)
(Note: nij1 is an index over grid points that have been divided among processing elements via MPI)
(Note: nlev is the number of vertical levels, nbv is the number of ensemble members, nv3d is the number of 3d variables)
(Note: the output 'gues3d' and 'gues2d' is defined and 'INOUT' but the output is unused in the calling routine)
anal3d(nij1,nlev,nbv,nv3d) ! analysis ensemble members
anal2d(nij1,nbv,nv2d)
- "Variable Localization" is a technique designed to 'localize' in the variable space. In other words, the cross-covariance information between variables in the background error covariance function can essentially be zeroed-out. A non-zero weighted value is also permitted (though I am not aware of anyone trying this yet). This is not suggested on a first application of the software. It was needed to prevent spurious correlations between temperature and humidity with CO2 fluxes.
- Multiplicative inflation is available and easy to use. I do not recommend it for the ocean due to (a) the sparsity of the observations, and (b) the inability of the model to respond to unbalanced impulses. Adaptive inflation is available, but has been disabled manually in the letkf_core. It must be enabled there before being activated. Again, this is not recommended for the ocean DA. Finally, additive inflation is available, though it has never been tested with the ocean.
- Consider hybrid techniques (e.g. Penny 2014: google "Hybrid Local Ensemble Transform Kalman Filter" on MWR) as an alternative to additive inflation.
- The routine commences by removing the ensemble mean from the ensemble members to work directly with the ensemble member perturbations.
- If desired (though I do not recommend it), multiplicative inflation can be applied.
- The main assimilation loop cycles through each model level. If the option "DO_NO_VERT_LOC" is true (i.e. "do not do vertical localization"), then analysis weights are only computed for one level, using observations from all levels, and the weights are then projected to all levels.
- The interior loop cycles through all grid points for this processing element. If points are on land, they are immediately skipped. (note to self: This could perhaps be done when assigning the grid points to the different PEs to improve the load balancing a bit.)
- At each grid point, we loop through each prognostic variable. Usually, unless 'variable localization' is used, the analysis is only performed once and then the same weights are applied to all variables. However, if 'variable localization' is specified, then letkf_core may be called multiple times, one for each uncorrelated variable.
- A localization routine (obs_local) is called to identify the observations that are local to this grid point. The localization is somewhat unique to each new domain being studied, and should be updated upon a new implementation. (A simple distance-based metric is available as a default). LETKF applies localization in the observation space (by choosing nearby observations to analyze) rather than in the model space (by down-weighting entries in the background error covariance corresponding to distant points).
- letkf_core is the main algorithm, as described by Hunt et al. 2007.
- There is some leftover code for 'adaptive inflation', but it has been removed from the letkf_core to attain a minor speed improvement for the ocean.
- Additive inflation is available as an option via input file, though I have never used it with the ocean.