source: CONFIG_DEVT/LMDZOR_V6.2_work_ENSEMBLES/modeles/LMDZ/libf/phy_common/mod_phys_lmdz_ensemble.F90 @ 6122

Last change on this file since 6122 was 5851, checked in by ymipsl, 3 years ago

better ensemble management in LMDZ

YM

File size: 2.4 KB
Line 
1MODULE mod_phys_lmdz_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_LMDZ_PHY_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_phys_lmdz_ensemble(ensemble_communicator, member_communicator)
13  USE ioipsl_getin_p_mod
14  IMPLICIT NONE
15    INTEGER, INTENT(IN)  :: ensemble_communicator          ! communicator of pool ensemble
16    INTEGER, INTENT(OUT) :: member_communicator            ! returned communicator for local member
17    INTEGER              :: ensemble_comm_size
18    INTEGER              :: ensemble_comm_rank
19    INTEGER              :: ensemble_pool_rank
20    INTEGER              :: ensemble_pool_size
21    INTEGER              :: member_size
22    INTEGER              :: ensemble_rank
23    INTEGER              :: ierr
24 
25  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
26  !! SPLIT COMMUNICATOR FOR ENSEMBLE         !!!
27  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
28     COMM_LMDZ_PHY_ENSEMBLE = ensemble_communicator
29     ensemble_pool_size = 1
30     CALL getin("ensemble_pool_size", ensemble_pool_size)
31     whole_ensemble_size=ensemble_pool_size
32     CALL getin("whole_ensemble_size", whole_ensemble_size)
33     ensemble_management=.FALSE.
34     IF (whole_ensemble_size>1) ensemble_management=.TRUE. 
35     ensemble_pool_rank=0
36     CALL getin("ensemble_pool_rank", ensemble_pool_rank)
37     
38     CALL MPI_COMM_SIZE(COMM_LMDZ_PHY_ENSEMBLE,ensemble_comm_size,ierr)
39     CALL MPI_COMM_RANK(COMM_LMDZ_PHY_ENSEMBLE,ensemble_comm_rank,ierr)
40     PRINT*,ensemble_comm_size,ensemble_comm_rank
41     IF (MOD(ensemble_comm_size,ensemble_pool_size)/=0) THEN
42      CALL abort_physic('Init_mpi','Nb of MPI processes in whole ensemble is not divisible by the size of ensemble',1)
43     ENDIF 
44     member_size = ensemble_comm_size/ensemble_pool_size
45     ensemble_rank = ensemble_comm_rank/member_size
46     CALL MPI_COMM_SPLIT(COMM_LMDZ_PHY_ENSEMBLE, ensemble_rank, ensemble_comm_rank, member_communicator,ierr)
47     whole_ensemble_rank = ensemble_pool_rank*ensemble_pool_size + ensemble_rank       
48   
49   END SUBROUTINE  init_phys_lmdz_ensemble
50
51
52END MODULE mod_phys_lmdz_ensemble
Note: See TracBrowser for help on using the repository browser.