source: CONFIG_DEVT/IPSLCM6.2.2_ENSEMBLES/config/IPSLCM6/SOURCES/NEMO/ensemble.F90 @ 6205

Last change on this file since 6205 was 6205, checked in by aclsce, 2 years ago

Forgot some modifications.

File size: 3.3 KB
Line 
1MODULE ensemble_oce
2
3 
4  LOGICAL,SAVE :: ensemble_management         ! true if ensemble is managed
5  INTEGER,SAVE :: COMM_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 
10  INTEGER,SAVE :: ensemble_pool_size, ensemble_pool_rank, ensemble_pool_member_rank
11  LOGICAL,SAVE :: namelist_read=.FALSE. 
12  CHARACTER(LEN=256) :: str_ensemble_pool_member_rank
13 
14CONTAINS
15
16  SUBROUTINE init_ensemble(ensemble_communicator, member_communicator)
17  USE lib_mpp
18  IMPLICIT NONE
19#if defined key_mpp_mpi
20   INCLUDE 'mpif.h'
21#endif
22
23    INTEGER, INTENT(IN)  :: ensemble_communicator          ! communicator of pool ensemble
24    INTEGER, INTENT(OUT) :: member_communicator            ! returned communicator for local member
25    INTEGER :: ensemble_comm_size, ensemble_comm_rank
26    INTEGER :: ierr
27   
28    CALL read_ensemble_namelist
29    COMM_ENSEMBLE=ensemble_communicator
30
31#if defined key_mpp_mpi
32     CALL MPI_COMM_SIZE(ensemble_communicator,ensemble_comm_size,ierr)
33     CALL MPI_COMM_RANK(ensemble_communicator,ensemble_comm_rank,ierr)
34#endif
35
36     IF (MOD(ensemble_comm_size,ensemble_pool_size)/=0) THEN
37       CALL ctl_stop('ensemble_oce::init_ensemble  :  Nb of MPI processes in whole ensemble is not divisible by the size of ensemble')
38     ENDIF 
39   
40#if defined key_mpp_mpi
41     CALL MPI_COMM_SPLIT(COMM_ENSEMBLE, ensemble_pool_member_rank, ensemble_comm_rank, member_communicator,ierr)
42#endif
43     whole_ensemble_rank = ensemble_pool_size*ensemble_pool_rank+ensemble_pool_member_rank
44     
45  END SUBROUTINE init_ensemble
46 
47 
48  SUBROUTINE get_ensemble_code_id(base_code_id, ensemble_code_id)
49  IMPLICIT NONE
50    CHARACTER(LEN=*), INTENT(IN)  :: base_code_id
51    CHARACTER(LEN=*), INTENT(OUT) :: ensemble_code_id
52    CHARACTER(LEN=256)            :: str_rank
53   
54    CALL read_ensemble_namelist
55   
56    IF (ensemble_management) THEN
57      WRITE(str_rank,*) ensemble_pool_member_rank
58      ensemble_code_id=TRIM(ADJUSTL(base_code_id))//":"//TRIM(ADJUSTL(str_rank))
59    ELSE
60      ensemble_code_id=base_code_id
61    ENDIF
62   
63  END SUBROUTINE get_ensemble_code_id
64
65  SUBROUTINE read_ensemble_namelist
66  USE lib_mpp
67  IMPLICIT NONE
68    CHARACTER(LEN=*),PARAMETER :: filename="namelist_ensemble"
69    INTEGER          :: ierr, u
70    LOGICAL :: exist
71    NAMELIST /ensemble/ whole_ensemble_size, ensemble_pool_size, ensemble_pool_rank, ensemble_pool_member_rank
72
73    IF (.NOT.namelist_read) THEN
74      ensemble_management=.FALSE.
75      ensemble_pool_size = 1
76      whole_ensemble_size = ensemble_pool_size
77      ensemble_pool_rank=0
78      ensemble_pool_member_rank=0
79   
80      INQUIRE(file=filename, EXIST=exist)
81      IF (exist) THEN
82        OPEN(action='read', file=filename, iostat=ierr, newunit=u)
83        READ(u,nml=ensemble, iostat=ierr)
84        IF (ierr /= 0) CALL ctl_stop('ensemble_oce::init_ensemble  :  failed to read ensemble namelist')
85        CLOSE(u)
86        ensemble_management=.TRUE.
87      ELSE
88        ensemble_management=.FALSE.
89      ENDIF
90      IF (whole_ensemble_size>1) ensemble_management=.TRUE.
91      namelist_read=.TRUE.
92    ENDIF
93    str_ensemble_pool_member_rank=""
94    WRITE(str_ensemble_pool_member_rank,*) ensemble_pool_member_rank
95   END SUBROUTINE read_ensemble_namelist
96
97END MODULE ensemble_oce
Note: See TracBrowser for help on using the repository browser.