Version 33 (modified by 13 years ago) (diff) | ,
---|
Initialization of PDAF and the ensemble by PDAF_init
Implementation Guide
Contents of this page
Overview
After the adaption of the parallelization, the initialization of PDAF has to be implemented. The PDAF-interval initialization is performed by the routine PDAF_init
. Typically, the initializations of all variables required for the call to PDAF_init
can be collected into a single subroutine. This implementation strategy is useful, as only a single addition subroutine call has to be added to the model source code. In the example in testsuite/src/dummymodel_1D
the routine in the file init_pdaf.F90
shows this strategy. The file init_pdaf.F90
in templates/
provides a commented template for this routine, which can be used as the basis of the implementation.
PDAF_init
itself calls a user-supplied routine to initialize the ensemble of model states through its interface. In the example there are separate routines for ensemble based and mode based filters. They are in the files init_seik_pdaf.F90
(for SEIK, LSEIK, ETKF, LETKF), init_enkf_pdaf.F90
(for EnKF), and init_seek_pdaf.F90
(for SEEK).
Inserting init_pdaf
The right place to insert a routine like init_pdaf
to the model code is in between the initialization part of the model and its time stepping loop. In the routine a number of variables have to be defined that are used in the call to PDAF_init
as described in 'Required arguments for `PDAF_init`'. (Please note: All names of subroutines that start with PDAF_
are core routines of PDAF, while subroutines whose name end with _pdaf
are generally user-supplied interface routines) There are also a few variables that are initialized in init_pdaf
but not used in the call to PDAF_init
. These are variables that are specific for the data assimilation system, but only shared in between the user-supplied routines. For the example case, these variables are described in 'Other variables for the assimilation'
The example implementation and the template version allow to parse all variables through a command line parser. This method provides a convenient way to define an experiment and could also be used for other models. The parser module is provided as templates/parser_mpi.F90
Required arguments for PDAF_init
The call to PDAF_init
has the following structure:
CALL PDAF_init(filtertype, subtype, step_null, & filter_param_i, length_filter_param_i, & filter_param_r, length_filter_param_r, & COMM_model, COMM_filter, COMM_couple, & task_id, n_modeltasks, filterpe, & U_init_ens, screen, status_pdaf)
The required variables are the following:
filtertype
: An integer defining the type of filter algorithm. Available are- 0: SEEK
- 1: SEIK
- 2: EnKF
- 3: LSEIK
- 4: ETKF
- 5: LETKF
subtype
: An integer defining the sub-type of the filter algorithm (see the example code intestsuite/src/dummymodel_1D
for choices). IfPDAF_init
is called withsubtype=-1
the available options are shown for the selected filter algorithm.step_null
: An integer defining the initial time step. For some cases it can use useful to setstep_null
larger to 0.filter_param_i
: Integer array collecting several variables for PDAF. The first two variables are mandatory and equal for all filters. Further variables are optional (see example code or usesubtype=-1
to display available options.). The mandatory variables are in the following order:- The size of the local state vector for the current process.
- The ensemble size for all ensemble-based filters (or the rank of the state covariance matrix for mode-based filters like SEEK)
length_filter_param_i
: An Integer defining the length of the arrayfilter_param_i
. The entries in the array are parsed up to this index.filter_param_r
: Array of reals collecting floating point variables for PDAF. The first variable is mandatory and equal for all filters. Further variables are optional (see example code intestsuite/src/dummymodel_1D
or usesubtype=-1
to display available options.). The mandatory variable is:- The value of the forgetting factor (required to be larger than zero)
length_filter_param_r
: An Integer defining the length of the arrayfilter_param_r
. The entries in the array are parsed up to this index.COMM_model
: The communicator variableCOMM_model
as initialized byinit_parallel_pdaf
. If the model-communicator is named differently in the actual program, the name has to be adaptedCOMM_filter
: The communicator variableCOMM_filter
as initialized byinit_parallel_pdaf
.COMM_couple
: The communicator variableCOMM_couple
as initialized byinit_parallel_pdaf
.task_id
: The index of the model tasks as initialized byinit_parallel_pdaf
.n_modeltasks
: The number of model tasks as defined before the call toinit_parallel_pdaf
.filterpe
: A logical flag showing if a process belongs toCOMM_filter
as initialized byinit_parallel_pdaf
.U_init_ens
: The name of the user-supplied routine that is called byPDAF_init
to initialize the ensemble of model states. (See 'User-supplied routine U_init_ens'screen
: An integer defining whether information output is written to the screen (i.e. standard output). The following choices are available:- 0: quiet mode - no information is displayed.
- 1: Display standard information (recommended)
- 2: as 1 plus display of timing information during the assimilation process
- 3: Display detailed information for debugging
status_pdaf
: An integer used as status flag of PDAF. Ifstatus_pdaf
is zero upon exit fromPDAF_init
the initialization was successful. An error occurred for non-zero values. (The error codes are documented in the routine PDAF_init.)
It is recommended that the value of status_pdaf
is checked in the program after PDAF_init is executed. Only if its value is 0 the initialization was successful.
PDAF also has a Simplified Interface providing the routine PDAF_init_si
. In the simplified interface, the names of the user-supplied routine U_init_ens
is predefined such that it does not appear in the call to PDAF_init_si
. More information on the pre-defined names is provided in the documentation of PDAF's simplified interface.
Other variables for the assimilation
The routine init_pdaf
in the example also initializes several variables that are not used to call PDAF_init
. These variables control some functionality of the user-supplied routines for the data assimilation system and are shared with these routines through mod_assimilation
. These variables are for example:
delt_obs
: An integer specifying the number of time steps between two analysis stepsrms_obs
: Assumed observation errorlocal_range
: Localization radius in grid points for the observation domain in LSEIK and LETKFsrange
: support radius, if a 5th order polynomial is used to weigh the observation errorslocweight
: Type of localizing weight
It is useful to define variables like these at this central position. Of course, this definition has to be adapted to the particular model used.
User-supplied routine U_init_ens
(init_ens_pdaf.F90)
The user-supplied routine the we named U_init_ens
here, is called by PDAF through the defined interface described below. The routine is called by all MPI processes that compute the filter analysis step (i.e. those for which 'filterpe' is set to true. In the standard configuration of init_parallel_pdaf
these are all processes of the first model task, i.e. task_id=1.) U_init_ens_pdaf
is only called by PDAF_init
if no error occurred before; thus the status flag is zero.
The interface is the following:
SUBROUTINE U_init_ens(filtertype, dim_p, dim_ens, & state_p, Uinv, ens_p, flag)
with
filtertype
: The integer defining the type of filter algorithm as given in the call toPDAF_init
dim_p
: An integer holding the size of the state dimension for the calling process as specified in the call toPDAF_init
dim_ens
: An integer holding the size of the ensemble (or the rank of the state covariance matrix for SEEK)state_p
: A real array of size (dim_p
) for the local model state of the calling process (Only relevant for mode-based filters)Uinv
: A real array of size (dim_ens-1
,dim_ens-1
) for the inverse of matrix U from the decomposition of the state error covariance matrix P = VUVT (Only relevant for mode-based filters like SEEK.)ens_p
: A real array of size (dim_p
,dim_ens
) the has to hold upon exit the ensemble of model states.flag
: Status flag for PDAF. It is 0 upon entry and can be set by in the user-supplied routine, depending on the success of the ensemble initialization. Preferably, values above 102 should be used for failures to avoid conflicts with the error codes defined within PDAF_init.
In the initialization routine U_init_ens_pdaf
one has to distinguish between ensemble-based and mode-based filters. The only mode based filter supplied with PDAF is SEEK, while all other methods are ensemble-based.
Initialization for ensemble-based filters
Generally, the filters SEIK, LSEIK, EnKF, ETKF, and LETKF are ensemble-based filters.For these filters only the array ens_p
needs to be initialized by the ensemble of model states. If a model with domain decomposition is used, the full ensemble for the local sub-domain of the MPI process has to be initialized.
The arrays state_p
and Uinv
are allocated to their correct sizes because they are used during the assimilation cycles. They are not yet initialized and it is allowed to use these arrays in the initialization. An exception from this is EnKF for which Uinv
is allocated only with size (1
,1
), because Uinv
is not using for EnKF.
Initialization for mode-based filters
The only mode-based filter supplied with PDAF is currenly the SEEK filter. For this filter the initialization bases on the decomposition of the state error covariance matrix in the form P = VUVT. According to this decomposition, the array ens_p
has to be initialized to hold the modes from matrix V and Uinv
holds the inverse of matrix U. In addition state_p
has to be initialized with the initial state estimate. If a model with domain decomposition is used, the part of all modes for the local sub-domain of the MPI process and the corresponding part of the state vector has to be initialized.
Testing the PDAF initialization
The PDAF initialization can be tested by compiling the program and executing it. The Makefile of the model has to be extended to include the additional files. The core part of PDAF can be compiled separately as a library and can then simply be linked to the model code. This is the strategy followed in the PDAF-package.
Remark: For the compilation with a real MPI library, one has to ensure that the header file (mpif.h
) of the MPI-library is used for both the model and PDAF. (Thus in the include file for make, one might have set MPI_INC =
.) The include directory dummympi
specified in some of the include files, will not be compatible with all MPI implementations.
At this stage it will not be meaningful to perform an actual integration. However, one can test if the initialization in PDAF_init is successful and if the ensemble array is correctly initialized.
Standard output from PDAF_init should look like the following: (Note that the initial output has changed between the versions 1.8 and 1.7 of PDAF. If you use V1.7, please see the summary of differences between PDAF 1.7 and 1.8.)
++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++ PDAF +++ +++ Parallel Data Assimilation Framework +++ +++ +++ +++ Version 1.8 +++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++ PDAF: Initialize filter +++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++ SEIK Filter +++ +++ +++ +++ Pham et al., C. R. Acad. Sci. II, 326(1998) 255 +++ +++ and Pham, Mon. Wea. Rev. 129 (2001) 1194 +++ +++ This implementation follows +++ +++ Nerger et al., Tellus 57A (2005) 715 +++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++ SEIK configuration filter sub-type = 0 --> Standard SEIK --> Transform ensemble with deterministic Omega --> Use fixed forgetting factor: 1.00 --> ensemble size: 280 PDAF: Initialize Parallelization Parallelization - Filter on model PEs: Total number of PEs: 1 Number of parallel model tasks: 1 PEs for Filter: 1 # PEs per ensemble task and local ensemble sizes: Task 1 #PEs 1 N 280
The correctness of the ensemble initialization in U_ensemble_init
should be checked by the user.