| 197 | |
| 198 | === prodRinvA_hyb_l_pdafomi === |
| 199 | |
| 200 | The interface for this routine is: |
| 201 | {{{ |
| 202 | SUBROUTINE prodRinvA_hyb_l_pdafomi(domain_p, step, dim_obs_l, dim_ens, obs_l, gamma, A_l, C_l) |
| 203 | |
| 204 | INTEGER, INTENT(in) :: domain_p ! Current local analysis domain |
| 205 | INTEGER, INTENT(in) :: step ! Current time step |
| 206 | INTEGER, INTENT(in) :: dim_obs_l ! Dimension of local observation vector |
| 207 | INTEGER, INTENT(in) :: dim_ens ! Ensemble size |
| 208 | REAL, INTENT(in) :: obs_l(dim_obs_l) ! Local vector of observations |
| 209 | REAL, INTENT(in) :: gamma ! Hybrid weight |
| 210 | REAL, INTENT(inout) :: A_l(dim_obs_l, dim_ens) ! Input matrix from analysis routine |
| 211 | REAL, INTENT(out) :: C_l(dim_obs_l, dim_ens) ! Output matrix |
| 212 | }}} |
| 213 | |
| 214 | The routine is called during the loop over the local analysis domains. In the algorithm, the product of the inverse of the observation error covariance matrix with some matrix has to be computed. This matrix holds the observed part of the ensemble perturbations for the local analysis domain of index `domain_p`. The matrix is provided as `A_l`. The product has to be given as `C_l`. |
| 215 | |
| 216 | This routine is also the place to perform observation localization. To initialize a vector of weights, the routine `PDAF_local_weight` can be called. The procedure is used in the example implementation and also demonstrated in the template routine. |
| 217 | |
| 218 | The routine is analogous to `prodRinvA_l_pdafomi, but also has to apply the hybrid weight `gamma` of the hybrid filter LKNETF. This is a simple multiplication with the input value in the loop where `C_l` is initialized. |
| 219 | |
| 220 | Hints: |
| 221 | * This routine is a simple extension of `prodRinvA_l_pdafomi`. One can implement the hybrid variant by copying this routine and adapting it. `gamma` is computed inside PDAF and provided to the routine. |
| 222 | * Please see the further implementation hints for `prodRinvA_l_pdafomi`. |
| 223 | * For diagonal **R** PDAF-OMI uses the routine `PDAFomi_prodRinvA_hyb_l` in `/src/PDAFomi_obs_l.F90` as the routine that is called within the observation module. This routine can serve as a template for an implementation by the user. |
| 224 | |
| 225 | === likelihood_hyb_l_pdafomi === |
| 226 | |
| 227 | The interface for this routine is: |
| 228 | {{{ |
| 229 | SUBROUTINE likelihood_hyb_l_pdafomi(domain_p, step, dim_obs_l, obs_l, resid_l, gamma, likely_l) |
| 230 | |
| 231 | INTEGER, INTENT(in) :: domain_p ! Current local analysis domain |
| 232 | INTEGER, INTENT(in) :: step ! Current time step |
| 233 | INTEGER, INTENT(in) :: dim_obs_l ! Dimension of local observation vector |
| 234 | REAL, INTENT(in) :: obs_l(dim_obs_l) ! Local vector of observations |
| 235 | REAL, INTENT(inout) :: resid_l(dim_obs_l) ! Input vector holding the local residual y-Hx |
| 236 | REAL, INTENT(in) :: gamma ! Hybrid weight |
| 237 | REAL, INTENT(out) :: likely_l(dim_obs_l) ! Output value of the likelihood |
| 238 | }}} |
| 239 | |
| 240 | This routine is a variant for `U_likelihood_l_pdafomi`. See the description of this routine for its functionality. The routine is called during the loop over the local analysis domains. The likelihood of the local observations has to be computed for each ensemble member. The likelihood is computed from the observation-state residual according to the assumed observation error distribution. Commonly, the observation errors are assumed to be Gaussian distributed. In this case, the likelihood is '''exp(-0.5*(y-Hx)^T^*R^-1^*(y-Hx))'''. |
| 241 | |
| 242 | This routine is also the place to perform observation localization. To initialize a vector of weights, the routine `PDAF_local_weight` can be called. The procedure is used in the example implementation and also demonstrated in the template routine. |
| 243 | |
| 244 | The routine also has to apply the hybrid weight `gamma`. This is a simple multiplication with `1-gamma` in the loop where `Rinvresid_l` is initialized. |
| 245 | |
| 246 | Hints: |
| 247 | * This routine is a simple extension of `U_likelihood_l. One can implement the hybrid variant by copying this routine and adapting it. `gamma` is computed inside PDAF and provided to the routine. |
| 248 | * Please see the further implementation hints for `prodRinvA_l_pdafomi`. |
| 249 | * For diagonal **R** PDAF-OMI uses the routine `PDAFomi_likelihood_hyb_l` in `/src/PDAFomi_obs_l.F90` as the routine that is called within the observation module. This routine can serve as a template for an implementation by the user. |