source: CONFIG_DEVT/LMDZOR_V6.2_work_ENSEMBLES/modeles/ORCHIDEE/src_parallel/mod_orchidee_ensemble.F90 @ 5493

Last change on this file since 5493 was 5493, checked in by ymipsl, 4 years ago

Ensemble management for orchidee.

YM

File size: 2.5 KB
Line 
1MODULE mod_orchidee_ensemble
2 
3  LOGICAL,SAVE :: ensemble_management         ! true if ensemble is managed
4                                              ! that's mean one additionnal dimension is added to output
5  INTEGER,SAVE :: COMM_ORCHIDEE_ENSEMBLE      ! MPI communicator for the ensemble pool
6  INTEGER,SAVE :: whole_ensemble_size         ! number of members in whole ensemble
7  INTEGER,SAVE :: whole_ensemble_rank         ! local member number in whole ensemble
8 
9 
10CONTAINS
11
12  SUBROUTINE init_orchidee_ensemble(ensemble_communicator, member_communicator)
13  USE ioipsl
14  USE mod_orchidee_para_var
15  IMPLICIT NONE
16    INTEGER, INTENT(IN)  :: ensemble_communicator          ! communicator of pool ensemble
17    INTEGER, INTENT(OUT) :: member_communicator            ! returned communicator for local member
18    INTEGER              :: ensemble_comm_size
19    INTEGER              :: ensemble_comm_rank
20    INTEGER              :: ensemble_pool_rank
21    INTEGER              :: ensemble_pool_size
22    INTEGER              :: member_size
23    INTEGER              :: ensemble_rank
24    INTEGER              :: ierr
25 
26  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
27  !! SPLIT COMMUNICATOR FOR ENSEMBLE         !!!
28  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
29     PRINT*,"initialize ensemble"
30     COMM_ORCHIDEE_ENSEMBLE = ensemble_communicator
31     ensemble_pool_size = 1
32     CALL getin("ensemble_pool_size", ensemble_pool_size)
33     whole_ensemble_size=ensemble_pool_size
34     CALL getin("whole_ensemble_size", whole_ensemble_size)
35     ensemble_management=.FALSE.
36     IF (whole_ensemble_size==1) ensemble_management=.TRUE. 
37     ensemble_pool_rank=0
38     CALL getin("ensemble_pool_rank", ensemble_pool_rank)
39     
40     CALL MPI_COMM_SIZE(COMM_ORCHIDEE_ENSEMBLE,ensemble_comm_size,ierr)
41     CALL MPI_COMM_RANK(COMM_ORCHIDEE_ENSEMBLE,ensemble_comm_rank,ierr)
42     PRINT*,ensemble_comm_size,ensemble_comm_rank
43     IF (MOD(ensemble_comm_size,ensemble_pool_size)/=0) THEN
44      WRITE(numout,*) 'init_orchidee_ensemble : Nb of MPI processes in whole ensemble is not divisible by the size of ensemble'
45      STOP 'init_orchidee_ensemble'
46     ENDIF 
47     member_size = ensemble_comm_size/ensemble_pool_size
48     ensemble_rank = ensemble_comm_rank/member_size
49     CALL MPI_COMM_SPLIT(COMM_ORCHIDEE_ENSEMBLE, ensemble_rank, ensemble_comm_rank, member_communicator,ierr)
50     whole_ensemble_rank = ensemble_pool_rank*ensemble_pool_size + ensemble_rank       
51   
52   END SUBROUTINE  init_orchidee_ensemble
53
54
55END MODULE mod_orchidee_ensemble
Note: See TracBrowser for help on using the repository browser.