source: CONFIG_DEVT/LMDZOR_V6.2_work_ENSEMBLES/modeles/LMDZ/libf/dyn3dmem/mod_const_mpi.F90 @ 5488

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

Ensemble management in LMDZ dynamic : splitting whole communicator to distribute a new one at each member.

YM

File size: 3.5 KB
Line 
1!
2! $Id: mod_const_mpi.F90 2055 2014-06-04 12:33:27Z acaubel $
3!
4MODULE mod_const_mpi
5  IMPLICIT NONE
6  INTEGER,SAVE :: COMM_LMDZ
7  INTEGER,SAVE :: MPI_REAL_LMDZ
8  INTEGER,SAVE :: COMM_LMDZ_ENSEMBLE
9
10CONTAINS
11
12  SUBROUTINE Init_const_mpi
13#ifdef CPP_IOIPSL
14    USE IOIPSL, ONLY: getin
15#else
16! if not using IOIPSL, we still need to use (a local version of) getin
17    USE ioipsl_getincom, only: getin
18#endif
19! Use of Oasis-MCT coupler
20#ifdef CPP_OMCT
21    USE mod_prism
22#endif
23#ifdef CPP_XIOS
24    USE wxios, only: wxios_init
25#endif
26    IMPLICIT NONE
27#ifdef CPP_MPI
28    INCLUDE 'mpif.h'
29#endif
30
31    INTEGER             :: ierr
32    INTEGER             :: comp_id
33    INTEGER             :: thread_required
34    INTEGER             :: thread_provided
35    CHARACTER(len = 6)  :: type_ocean
36   
37
38!$OMP MASTER
39    type_ocean = 'force '
40    CALL getin('type_ocean', type_ocean)
41!$OMP END MASTER
42!$OMP BARRIER
43
44    IF (type_ocean=='couple') THEN
45#ifdef CPP_COUPLE
46!$OMP MASTER
47#ifdef CPP_XIOS
48      CALL wxios_init("LMDZ", outcom=COMM_LMDZ, type_ocean=type_ocean)
49#else
50       CALL prism_init_comp_proto (comp_id, 'LMDZ', ierr)
51       CALL prism_get_localcomm_proto(COMM_LMDZ,ierr)
52#endif
53!$OMP END MASTER
54#endif
55#ifdef CPP_MPI
56      MPI_REAL_LMDZ=MPI_REAL8
57#endif
58    ELSE
59      CALL init_mpi
60    ENDIF
61
62  END SUBROUTINE Init_const_mpi
63 
64  SUBROUTINE Init_mpi
65#ifdef CPP_XIOS
66    USE wxios, only: wxios_init
67#endif
68
69#ifdef CPP_IOIPSL
70    USE IOIPSL, ONLY: getin
71#else
72! if not using IOIPSL, we still need to use (a local version of) getin
73    USE ioipsl_getincom, only: getin
74#endif
75
76  IMPLICIT NONE
77#ifdef CPP_MPI
78     INCLUDE 'mpif.h'
79#endif
80    INTEGER             :: ierr
81    INTEGER             :: thread_required
82    INTEGER             :: thread_provided
83    INTEGER             :: ensemble_pool_size
84    INTEGER             :: ensemble_comm_size
85    INTEGER             :: ensemble_comm_rank
86    INTEGER             :: ensemble_rank
87    INTEGER             :: member_size
88
89#ifdef CPP_MPI
90!$OMP MASTER
91      thread_required=MPI_THREAD_SERIALIZED
92
93      CALL MPI_INIT_THREAD(thread_required,thread_provided,ierr)
94      IF (thread_provided < thread_required) THEN
95        PRINT *,'Warning : The multithreaded level of MPI librairy do not provide the requiered level',  &
96                ' in mod_const_mpi::Init_const_mpi'
97      ENDIF
98      COMM_LMDZ_ENSEMBLE=MPI_COMM_WORLD
99      MPI_REAL_LMDZ=MPI_REAL8
100!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
101! Initialisation de XIOS
102!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
103#ifdef CPP_XIOS
104      CALL wxios_init("LMDZ", outcom=COMM_LMDZ_ENSEMBLE)
105#endif
106!$OMP END MASTER
107#else
108#ifdef CPP_XIOS
109!$OMP MASTER
110      CALL wxios_init("LMDZ")
111!$OMP END MASTER
112#endif
113#endif
114
115  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
116  !! SPLIT COMMUNICATOR FOR ENSEMBLE         !!!
117  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
118     ensemble_pool_size = 1
119     CALL getin("ensemble_pool_size", ensemble_pool_size)
120
121     CALL MPI_COMM_SIZE(COMM_LMDZ_ENSEMBLE,ensemble_comm_size,ierr)
122     CALL MPI_COMM_RANK(COMM_LMDZ_ENSEMBLE,ensemble_comm_rank,ierr)
123     IF (MOD(ensemble_comm_size,ensemble_pool_size)/=0) THEN
124      CALL abort_physic('Init_mpi','Nb of MPI processes in whole ensemble is not divisible by the size of ensemble',1)
125     ENDIF 
126     member_size = ensemble_comm_size/ensemble_pool_size
127     ensemble_rank = ensemble_comm_rank/member_size
128     CALL MPI_COMM_SPLIT(COMM_LMDZ_ENSEMBLE, ensemble_rank, ensemble_comm_rank,COMM_LMDZ,ierr)
129     
130     
131   END SUBROUTINE Init_mpi
132   
133END MODULE mod_const_mpi
Note: See TracBrowser for help on using the repository browser.