1 | MODULE 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 | |
---|
14 | CONTAINS |
---|
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 | |
---|
97 | END MODULE ensemble_oce |
---|