SURFEX v8.1
General documentation of Surfex
mpl_groups.F90
Go to the documentation of this file.
1 MODULE mpl_groups
2 
3 ! Purpose.
4 ! --------
5 ! Use MPI groups for easier to read code (and more efficient
6 ! communications, at least on IBM).
7 
8 ! Author.
9 ! -------
10 ! Y. Tremolet
11 
12 ! Modifications.
13 ! --------------
14 ! Original: 02-03-13
15 ! ------------------------------------------------------------------
16 
17 ! --- *NOT* THREAD SAFE YET ---
18 
19 USE parkind1 ,ONLY : jpim ,jprb
20 
21 USE mpl_mpif
24 
25 IMPLICIT NONE
26 PRIVATE
29 
31  & MPL_GP_GRID
32 LOGICAL,SAVE :: lgroupsetup=.false.
33 CONTAINS
34 ! ------------------------------------------------------------------
35 
36 SUBROUTINE mpl_groups_create(KPROCW, KPROCV)
37 
38 
39 #ifdef USE_8_BYTE_WORDS
40  USE mpi4to8, ONLY : &
41  mpi_cart_create => mpi_cart_create8, mpi_comm_group => mpi_comm_group8, &
42  mpi_cart_sub => mpi_cart_sub8
43 #endif
44 
45 
46 IMPLICIT NONE
47 INTEGER(KIND=JPIM), INTENT(IN) :: KPROCW, KPROCV
48 
49 INTEGER(KIND=JPIM) :: IDIMS(2), IERR
50 LOGICAL :: LTORUS(2), LDIMS(2), LREORDER
51 
52 IF(lgroupsetup) RETURN
53 
54 idims(1)=kprocw
55 idims(2)=kprocv
56 ltorus(1)=.false.
57 ltorus(2)=.false.
58 lreorder=.false.
59 
60 CALL mpi_cart_create(mpl_comm_oml(1), 2, idims, ltorus, lreorder, &
61  & mpl_comm_grid, ierr)
62 IF (ierr/=0) CALL mpl_message(ierr,'MPL_GROUPS_CREATE: MPI_CART_CREATE')
63 
64 CALL mpi_comm_group(mpl_comm_grid, mpl_gp_grid, ierr)
65 IF (ierr/=0) CALL mpl_message(ierr,'MPL_GROUPS_CREATE: mpi_comm_group')
66 
67 ! Group all levels for same Ms
68 ! ----------------------------
69 ldims(1)=.false.
70 ldims(2)=.true.
71 CALL mpi_cart_sub(mpl_comm_grid, ldims, mpl_all_levs_comm, ierr)
72 IF (ierr/=0) CALL mpl_message(ierr,'MPL_GROUPS_CREATE: mpi_cart_sub 1')
73 
74 ! Group all Ms for same levels
75 ! ----------------------------
76 ldims(1)=.true.
77 ldims(2)=.false.
78 CALL mpi_cart_sub(mpl_comm_grid, ldims, mpl_all_ms_comm, ierr)
79 IF (ierr/=0) CALL mpl_message(ierr,'MPL_GROUPS_CREATE: mpi_cart_sub 2')
80 
81 lgroupsetup=.true.
82 
83 END SUBROUTINE mpl_groups_create
84 
85 ! ------------------------------------------------------------------
86 
87 FUNCTION mpl_cart_rank(KPROCW, KPROCV)
88 
89 #ifdef USE_8_BYTE_WORDS
90  USE mpi4to8, ONLY : &
91  mpi_cart_rank => mpi_cart_rank8
92 #endif
93 
94 IMPLICIT NONE
95 INTEGER(KIND=JPIM), INTENT(IN) :: KPROCW, KPROCV
96 INTEGER(KIND=JPIM) :: MPL_CART_RANK
97 
98 INTEGER(KIND=JPIM) :: IDIMS(2), IPROC, IERR
99 
100 idims(1)=kprocw-1
101 idims(2)=kprocv-1
102 
103 CALL mpi_cart_rank(mpl_comm_grid, idims, iproc, ierr)
104 IF (ierr/=0) CALL mpl_message(ierr,'MPL_CART_RANK: mpi_cart_rank')
105 
106 mpl_cart_rank=iproc+1
107 
108 END FUNCTION mpl_cart_rank
109 
110 ! ------------------------------------------------------------------
111 
112 SUBROUTINE mpl_cart_coords(KPROC, KPROCW, KPROCV)
114 #ifdef USE_8_BYTE_WORDS
115  USE mpi4to8, ONLY : &
116  mpi_cart_coords => mpi_cart_coords8
117 #endif
118 
119 
120 IMPLICIT NONE
121 INTEGER(KIND=JPIM), INTENT(IN) :: KPROC
122 INTEGER(KIND=JPIM), INTENT(OUT) :: KPROCW, KPROCV
123 
124 INTEGER(KIND=JPIM) :: IDIMS(2), IPROC, IERR
125 
126 iproc=kproc-1
127 
128 CALL mpi_cart_coords(mpl_comm_grid, iproc, 2, idims, ierr)
129 IF (ierr/=0) CALL mpl_message(ierr,'MPL_CART_COORDS: mpi_cart_coords')
130 
131 kprocw=idims(1)+1
132 kprocv=idims(2)+1
133 
134 END SUBROUTINE mpl_cart_coords
135 
136 ! ------------------------------------------------------------------
137 
138 END MODULE mpl_groups
subroutine, public mpl_message(KERROR, CDMESSAGE, CDSTRING, LDABORT)
integer, parameter jpim
Definition: parkind1.F90:13
integer(kind=jpim) mpl_gp_grid
Definition: mpl_groups.F90:30
integer(kind=jpim), dimension(:), allocatable mpl_comm_oml
integer, parameter jprb
Definition: parkind1.F90:32
subroutine, public mpl_groups_create(KPROCW, KPROCV)
Definition: mpl_groups.F90:37
integer(kind=jpim), public mpl_comm_grid
Definition: mpl_groups.F90:30
integer(kind=jpim) function, public mpl_cart_rank(KPROCW, KPROCV)
Definition: mpl_groups.F90:88
integer(kind=jpim), public mpl_all_levs_comm
Definition: mpl_groups.F90:30
subroutine, public mpl_cart_coords(KPROC, KPROCW, KPROCV)
Definition: mpl_groups.F90:113
integer(kind=jpim), public mpl_all_ms_comm
Definition: mpl_groups.F90:30
logical, save lgroupsetup
Definition: mpl_groups.F90:32