Changes between Version 1 and Version 2 of ImplementAnalysisGlobal


Ignore:
Timestamp:
Nov 16, 2020, 1:06:20 PM (3 years ago)
Author:
lnerger
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • ImplementAnalysisGlobal

    v1 v2  
    1 = Implementation of the Analysis step for the global filters =
     1= Implementation of the analysis step for the global filters =
    22
    33{{{
     
    3737== Overview ==
    3838
    39 With Version 1.8 of PDAF, the ESTKF [Error Subspace Transform Kalman Filter] algorithm has been introduced. The user-supplied routines required for the ESTKF are identical to those required for the SEIK filter and amost identical to those required for the ETKF method.
     39With Version 1.16 of PDAF we introduced generic routines for the analysis step, which only distinguish global and local filters. These routines are used with OMI (observation module infrastrucutre, which has been introduced by version 1.16). This page describes the implementation of the analysis step for global filters.
    4040
    41 For the analysis step of the ESTKF different operations related to the observations are needed. These operations are requested by PDAF by call-back routines supplied by the user. Intentionally, the operations are split into separate routines in order to keep the operations rather elementary and efficient. This procedure should simplify the implementation. The names of the required routines are specified in the call to the routine `PDAF_assimilate_estkf` in the fully-parallel implementation (or `PDAF_put_state_estkf` for the 'flexible' implementation) that was discussed before. With regard to the parallelization, all these routines are executed by the filter processes (`filterpe=.true.`) only.
     41For the analysis step of the global filters different operations related to the observations are needed. These operations are requested by PDAF by call-back routines supplied by the user and provided in the OMI structure. The names of the routines that are provided by the user are specified in the call to the routine `PDAF_assimilate_global` in the fully-parallel implementation (or `PDAF_put_state_global` for the 'flexible' implementation) that was discussed before. With regard to the parallelization, all these routines are executed by the filter processes (`filterpe=.true.`) only.
    4242
    43 For completeness we discuss here all user-supplied routines that are specified in the interface to PDAF_assimilate_estkf. Thus, some of the user-supplied routines that are explained on the page describing the modification of the model code for the ensemble integration are repeated here.
     43For completeness we discuss here all user-supplied routines that are specified in the interface to PDAF_assimilate_global. Thus, some of the user-supplied routines that are explained on the page describing the modification of the model code for the ensemble integration are repeated here.
    4444
    45 The ESTKF and the ETKF (Ensemble Transform Kalman Filter) are very similar. For this reason, the interface to the user-supplied routines is almost identical. Depending on the implementation it can be possible to use identical routines for the ESTKF and the ETKF. Differences are marked in the text below.
    4645
    47 == `PDAF_assimilate_estkf` ==
     46== `PDAF_assimilate_global` ==
    4847
    49 The general aspects of the filter specific routines `PDAF_assimilate_*` have been described on the page [ModifyModelforEnsembleIntegration Modification of the model code for the ensemble integration] and its sub-page on [InsertAnalysisStep inserting the analysis step]. The routine is used in the fully-parallel implementation variant of the data assimilation system. When the 'flexible' implementation variant is used, the routines `PDAF_put_state_*' is used as described further below. Here, we list once more the full interface of the routine. Subsequently, the full set of user-supplied routines specified in the call to `PDAF_assimilate_estkf` is explained.
     48The general aspects of the filter specific routines `PDAF_assimilate_*` have been described on the page [ModifyModelforEnsembleIntegration Modification of the model code for the ensemble integration] and its sub-page on [InsertAnalysisStep inserting the analysis step]. The routine is used in the fully-parallel implementation variant of the data assimilation system. When the 'flexible' implementation variant is used, the routines `PDAF_put_state_*' is used as described further below. Here, we list once more the full interface of the routine. Subsequently, the full set of user-supplied routines specified in the call to `PDAF_assimilate_global` is explained.
    5049
    51 The interface when using the ESTKF is the following:
     50The interface when using one of the global filters is the following:
    5251{{{
    53   SUBROUTINE PDAF_assimilate_estkf(U_collect_state, U_distribute_state, U_init_dim_obs, &
    54                                  U_obs_op, U_init_obs, U_prepoststep, U_prodRinvA, &
    55                                  U_init_obsvar, U_next_observation, status)
     52  SUBROUTINE PDAF_assimilate_global(U_collect_state, U_distribute_state, U_init_dim_obs, &
     53                                 U_obs_op, U_init_obs, U_prepoststep, U_next_observation, status)
    5654}}}
    5755with the following arguments:
     
    6058 * [#U_init_dim_obsinit_dim_obs_pdaf.F90 U_init_dim_obs]: The name of the user-supplied routine that provides the size of observation vector
    6159 * [#U_obs_opobs_op_pdaf.F90 U_obs_op]: The name of the user-supplied routine that acts as the observation operator on some state vector
    62  * [#U_init_obsinit_obs_pdaf.F90 U_init_obs]: The name of the user-supplied routine that initializes the vector of observations
    6360 * [#U_prepoststepprepoststep_ens_pdaf.F90 U_prepoststep]: The name of the pre/poststep routine as in `PDAF_get_state`
    64  * [#U_prodRinvAprodrinva_pdaf.F90 U_prodRinvA]: The name of the user-supplied routine that computes the product of the inverse of the observation error covariance matrix with some matrix provided to the routine by PDAF. This operation occurs during the analysis step of the SEIK, ETKF, and ESTKF algorithms.
    65  * [#U_init_obsvarinit_obsvar_pdaf.F90 U_init_obsvar]: The name of the user-supplied routine that provides a mean observation error variance to PDAF (This routine will only be executed, if an adaptive forgetting factor is used)
    6661 * [#U_next_observationnext_observation.F90 U_next_observation]: The name of a user supplied routine that initializes the variables `nsteps`, `timenow`, and `doexit`. The same routine is also used in `PDAF_get_state`.
    6762 * `status`: The integer status flag. It is zero, if `PDAF_assimilate_estkf` is exited without errors.
    6863
    6964
    70 == `PDAF_put_state_estkf` ==
     65== `PDAF_put_state_global` ==
    7166
    72 When the 'flexible' implementation variant is chosen for the assimilation system, the routine `PDAF_put_state_estkf` has to be used instead of `PDAF_assimilate_estkf`. The general aspects of the filter specific routines `PDAF_put_state_*` have been described on the page [ModifyModelforEnsembleIntegration Modification of the model code for the ensemble integration]. The interface of the routine is identical with that of `PDAF_assimilate_estkf` with the exception the specification of the user-supplied routines `U_distribute_state` and `U_next_observation` are missing.
     67When the 'flexible' implementation variant is chosen for the assimilation system, the routine `PDAF_put_state_global` has to be used instead of `PDAF_assimilate_global`. The general aspects of the filter specific routines `PDAF_put_state_*` have been described on the page [ModifyModelforEnsembleIntegration Modification of the model code for the ensemble integration]. The interface of the routine is identical with that of `PDAF_assimilate_global` with the exception the specification of the user-supplied routines `U_distribute_state` and `U_next_observation` are missing.
    7368
    74 The interface when using the ESTKF is the following:
     69The interface when using one of the global filters is the following:
    7570{{{
    76   SUBROUTINE PDAF_put_state_estkf(U_collect_state, U_init_dim_obs, U_obs_op, &
    77                                  U_init_obs, U_prepoststep, U_prodRinvA, U_init_obsvar, status)
     71  SUBROUTINE PDAF_put_state_global(U_collect_state, U_init_dim_obs, &
     72                                 U_obs_op, U_init_obs, U_prepoststep, status)
    7873}}}
    7974
    8075== User-supplied routines ==
    8176
    82 Here all user-supplied routines are described that are required in the call to `PDAF_assimilate_estkf`. For some of the generic routines, we link to the page on [ModifyModelforEnsembleIntegration modifying the model code for the ensemble integration].
     77Here all user-supplied routines are described that are required in the call to `PDAF_assimilate_global`. For some of the generic routines, we link to the page on [ModifyModelforEnsembleIntegration modifying the model code for the ensemble integration].
    8378
    8479To indicate user-supplied routines we use the prefix `U_`. In the template directory `templates/` as well as in the example implementation in `testsuite/src/dummymodel_1D` these routines exist without the prefix, but with the extension `_pdaf.F90`. In the section titles below we provide the name of the template file in parentheses.
     
    140135
    141136
    142 === `U_init_obs` (init_obs_pdaf.F90) ===
    143 
    144 This routine is used by all global filter algorithms (SEEK, SEIK, EnKF, ETKF, ESTKF).
    145 
    146 The interface for this routine is:
    147 {{{
    148 SUBROUTINE init_obs(step, dim_obs_p, observation_p)
    149 
    150   INTEGER, INTENT(in) :: step             ! Current time step
    151   INTEGER, INTENT(in) :: dim_obs_p        ! PE-local dimension of obs. vector
    152   REAL, INTENT(out)   :: observation_p(dim_obs_p) ! PE-local observation vector
    153 }}}
    154 
    155 The routine is called during the analysis step.
    156 It has to provide the vector of observations in `observation_p` for the current time step.
    157 
    158 For a model using domain decomposition, the vector of observations that exist on the model sub-domain for the calling process has to be initialized.
    159 
    160 
    161137=== `U_prepoststep` (prepoststep_ens_pdaf.F90) ===
    162138
     
    195171
    196172
    197 === `U_prodRinvA` (prodrinva_pdaf.F90) ===
    198 
    199 This routine is used by all filter algorithms that use the inverse of the observation error covariance matrix (SEEK, SEIK, ETKF, ESTKF).
    200 
    201 The interface for this routine is:
    202 {{{
    203 SUBROUTINE prodRinvA(step, dim_obs_p, rank, obs_p, A_p, C_p)
    204 
    205   INTEGER, INTENT(in) :: step                ! Current time step
    206   INTEGER, INTENT(in) :: dim_obs_p           ! PE-local dimension of obs. vector
    207   INTEGER, INTENT(in) :: rank                ! Rank of initial covariance matrix
    208   REAL, INTENT(in)    :: obs_p(dim_obs_p)    ! PE-local vector of observations
    209   REAL, INTENT(in)    :: A_p(dim_obs_p,rank) ! Input matrix from analysis routine
    210   REAL, INTENT(out)   :: C_p(dim_obs_p,rank) ! Output matrix
    211 }}}
    212 
    213 The routine is called during the analysis step. In the algorithms the product of the inverse of the observation error covariance matrix with some matrix has to be computed. For the ESTKF this matrix holds the observed part of the ensemble perturbations. The matrix is provided as `A_p`. The product has to be given as `C_p`.
    214 
    215 For a model with domain decomposition, `A_p` contains the part of the matrix that resides on the model sub-domain of the calling process. The product has to be computed for this sub-domain, too.
    216 
    217 Hints:
    218  * The routine does not require that the product is implemented as a real matrix-matrix product. Rather, the product can be implemented in its most efficient form. For example, if the observation error covariance matrix is diagonal, only the multiplication of the diagonal with matrix `A_p` has to be implemented.
    219  * The observation vector `obs_p` is provided through the interface for cases where the observation error variance is relative to the actual value of the observations.
    220  * The interface has a difference for ESTKF and ETKF: For ETKF the third argument is the ensemble size (`dim_ens`), while for the ESTKF it is the rank (`rank`) of the covariance matrix (usually ensemble size minus one). In addition, the second dimension of `A_p` and `C_p` has size `dim_ens` for ETKF, while it is `rank` for the ESTKF.  (Practically, one can usually ignore this difference as the fourth argument of the interface can be named arbitrarily in the routine.)
    221 
    222 === `U_init_obsvar` (init_obsvar_pdaf.F90) ===
    223 
    224 This routine is used by the global filter algorithms SEIK, ETKF, and ESTKF as well as the local filters LSEIK, LETKF, ad LESTKF. The routine is only called if the adaptive forgetting factor is used (`type_forget=1` in the example impementation).
    225 
    226 The interface for this routine is:
    227 {{{
    228 SUBROUTINE init_obsvar(step, dim_obs_p, obs_p, meanvar)
    229 
    230   INTEGER, INTENT(in) :: step          ! Current time step
    231   INTEGER, INTENT(in) :: dim_obs_p     ! PE-local dimension of observation vector
    232   REAL, INTENT(in) :: obs_p(dim_obs_p) ! PE-local observation vector
    233   REAL, INTENT(out)   :: meanvar       ! Mean observation error variance
    234 }}}
    235 
    236 The routine is called in the global filters during the analysis or
    237 by the routine that computes an adaptive forgetting factor (PDAF_set_forget).
    238 The routine has to initialize the mean observation error variance. 
    239 For the global filters this should be the global mean.
    240 
    241 Hints:
    242  * For a model with domain-decomposition one might use the mean variance for the model sub-domain of the calling process. Alternatively one can compute a mean variance for the full model domain using MPI communication (e.g. the function `MPI_allreduce`).
    243  * The observation vector `obs_p` is provided to the routine for the case that the observation error variance is relative to the value of the observations.
    244 
    245 
    246173=== `U_next_observation` (next_observation_pdaf.F90) ===
    247174
     
    252179== Execution order of user-supplied routines ==
    253180
    254 For the ESTKF, the user-supplied routines are essentially executed in the order they are listed in the interface to `PDAF_assimilate_estkf`. The order can be important as some routines can perform preparatory work for later routines. For example, `U_init_dim_obs` can prepare an index array that provides the information for executing the observation operator in `U_obs_op`.
     181The user-supplied routines are essentially executed in the order they are listed in the interface to `PDAF_assimilate_global`. The order can be important as some routines can perform preparatory work for later routines. For example, `U_init_dim_obs` prepares an index array that provides the information for executing the observation operator in `U_obs_op`. How this information is initialized is described in the documentation of OMI.
    255182
    256183Before the analysis step is called the following routine is executed:
     
    260187 1. [#U_prepoststepprepoststep_ens_pdaf.F90 U_prepoststep] (Call to act on the forecast ensemble, called with negative value of the time step)
    261188 1. [#U_init_dim_obsinit_dim_obs_pdaf.F90 U_init_dim_obs]
    262  1. [#U_obs_opobs_op_pdaf.F90 U_obs_op] (A single call to operate on the ensemble mean state)
    263  1. [#U_init_obsinit_obs_pdaf.F90 U_init_obs]
    264  1. [#U_obs_opobs_op_pdaf.F90 U_obs_op] (`dim_ens` calls: one call for each ensemble member)
    265  1. [#U_init_obsvarinit_obsvar_pdaf.F90 U_init_obsvar] (Only executed, if the adaptive forgetting factor is used (`type_forget=1` in the example implemention))
     189 1. [#U_obs_opobs_op_pdaf.F90 U_obs_op] (multiple calls for each ensemble members)
    266190 1. [#U_prodRinvAprodrinva_pdaf.F90 U_prodRinvA]
    267191 1. [#U_prepoststepprepoststep_ens_pdaf.F90 U_prepoststep] (Call to act on the analysis ensemble, called with (positive) value of the time step)
    268192
    269 In case of the routine `PDAF_assimilate_estkf`, the following routines are executed after the analysis step:
     193In case of the routine `PDAF_assimilate_global`, the following routines are executed after the analysis step:
    270194 1. [#U_distribute_statedistribute_state_pdaf.F90 U_distribute_state]
    271195 1. [#U_next_observationnext_observation_pdaf.F90 U_next_observation]