SURFEX v8.1
General documentation of Surfex
mpl_read_mod.F90
Go to the documentation of this file.
2 
3 !
4 ! Purpose. read from an MPIIO file
5 ! --------
6 !
7 !
8 ! Interface.
9 ! ----------
10 ! call mpl_read(...)
11 !
12 ! Explicit arguments :
13 ! --------------------
14 !
15 ! input arguments:
16 ! kfptr - handle for file
17 ! kop - requested operation
18 ! kbuf - buffer containing data to be written
19 ! klen - length of buffer in words
20 ! input/output arguements:
21 ! kreq - request handle for non-blocking operations
22 ! output arguments:
23 ! kerror - error code
24 !
25 ! Implicit arguments :
26 ! --------------------
27 !
28 ! Method.
29 ! -------
30 ! MPL supports 4 styles of MPIIO
31 !
32 ! kop = 1 - Blocking, non collective, shared file pointer
33 ! using MPI_FILE_WRITE_SHARED,
34 ! MPI_FILE_READ_SHARED
35 ! kop = 2 - Blocking, collective, ordered, shared file pointer
36 ! using MPI_FILE_WRITE_ORDERED,
37 ! MPI_FILE_READ_ORDERED
38 ! kop = 3 - Non Blocking, non collective, shared file pointer
39 ! using MPI_FILE_IWRITE_SHARED,
40 ! MPI_FILE_IREAD_SHARED
41 ! and MPI_WAIT
42 ! kop = 4 - Non Blocking, collective, ordered, shared file pointer
43 ! using MPI_FILE_WRITE_ORDERED_BEGIN/END,
44 ! MPI_FILE_READ_ORDERED_BEGIN/END
45 !
46 ! Externals.
47 ! ----------
48 !
49 ! Reference.
50 ! ----------
51 ! none yet
52 !
53 ! Author.
54 ! -------
55 ! G.Mozdzynski
56 !
57 ! Modifications.
58 ! --------------
59 ! Original : 2000-12-11
60 ! R. EL Khatib 24-May-2011 Change ifdef MPI2 into ifndef MPI1
61 ! -----------------------------------------------------------------
62 !
63 USE parkind1 ,ONLY : jpim ,jprb ,jprm
64 
65 USE mpl_mpif
69 
70 IMPLICIT NONE
71 
72 INTERFACE mpl_read
73 MODULE PROCEDURE mpl_read_int,mpl_read_real8
74 END INTERFACE
75 
76 PRIVATE
77 PUBLIC mpl_read
78 
79 CONTAINS
80 
81 SUBROUTINE mpl_read_int(KFPTR,KOP,KBUF,KLEN,KREQ,KERROR)
82 
83 
84 #ifdef USE_8_BYTE_WORDS
85  USE mpi4to8, ONLY : &
86  mpi_file_read_shared => mpi_file_read_shared8, &
87  mpi_file_read_ordered => mpi_file_read_ordered8, &
88  mpi_file_iread_shared => mpi_file_iread_shared8, &
89  mpi_file_read_ordered_begin => mpi_file_read_ordered_begin8, &
90  mpi_wait => mpi_wait8, mpi_file_read_ordered_end => mpi_file_read_ordered_end8
91 #endif
92 
93 INTEGER(KIND=JPIM),INTENT(IN) :: KFPTR,KOP,KLEN
94 INTEGER(KIND=JPIM),INTENT(OUT) :: KERROR
95 INTEGER(KIND=JPIM) KBUF(:)
96 INTEGER(KIND=JPIM) KREQ
97 
98 
99 INTEGER(KIND=JPIM) STATUS(mpi_status_size)
100 !
101 #ifndef MPI1
102 
103 ! -----------------------------------------------------------------
104 !
105 ! 1. Preamble
106 ! --------
107 
108 IF( mpl_rank > mpl_numio ) THEN
109  kerror = -1
110  RETURN
111 ENDIF
112 
113 IF( kop >= 1.AND.kop <= 4 ) THEN
114 
115  IF( kop /= mpl_iop ) THEN
116  kerror = -1
117  RETURN
118  ENDIF
119 
120 ENDIF
121 ! -----------------------------------------------------------------
122 !
123 ! 2. Check style and take appropriate action
124 ! ---------------------------------------
125 
126 
127 IF( kop == 1 ) THEN
128 
129 ! blocking read, non collective, shared file pointer
130 
131  CALL mpi_file_read_shared(kfptr,&
132  & kbuf,&
133  & klen,&
134  & mpi_integer,&
135  & status,&
136  & kerror)
137 
138 ELSEIF( kop == 2 ) THEN
139 
140 ! blocking read, collective, ordered with shared file pointer
141 
142  CALL mpi_file_read_ordered(kfptr,&
143  & kbuf,&
144  & klen,&
145  & mpi_integer,&
146  & status,&
147  & kerror)
148 
149 ELSEIF( kop == 3 ) THEN
150 
151 ! non blocking read, non collective, shared file pointer
152 
153  CALL mpi_file_iread_shared(kfptr,&
154  & kbuf,&
155  & klen,&
156  & mpi_integer,&
157  & kreq,&
158  & kerror)
159 
160 ELSEIF( kop == 4 ) THEN
161 
162 ! non blocking read, collective, ordered with shared file pointer
163 
164  CALL mpi_file_read_ordered_begin(kfptr,&
165  & kbuf,&
166  & klen,&
167  & mpi_integer,&
168  & kerror)
169 
170 ELSEIF( kop == 5 ) THEN
171 
172  CALL mpi_wait(kreq,&
173  & status,&
174  & kerror )
175 
176 ELSEIF( kop == 6 ) THEN
177 
178  CALL mpi_file_read_ordered_end(kfptr,&
179  & kbuf,&
180  & status,&
181  & kerror)
182 
183 ELSE
184 
185  kerror =-1
186  RETURN
187 
188 ENDIF
189 
190 #else
191 
192 CALL abor1('MPL_READ_INT not build with MPI2')
193 
194 #endif
195 !
196 ! -----------------------------------------------------------------
197 RETURN
198 END SUBROUTINE mpl_read_int
199 
200 SUBROUTINE mpl_read_real8(KFPTR,KOP,PBUF,KLEN,KREQ,KERROR)
202 
203 #ifdef USE_8_BYTE_WORDS
204  USE mpi4to8, ONLY : &
205  mpi_file_read_shared => mpi_file_read_shared8, &
206  mpi_file_read_ordered => mpi_file_read_ordered8, &
207  mpi_file_iread_shared => mpi_file_iread_shared8, &
208  mpi_file_read_ordered_begin => mpi_file_read_ordered_begin8, &
209  mpi_wait => mpi_wait8, mpi_file_read_ordered_end => mpi_file_read_ordered_end8
210 #endif
211 
212 INTEGER(KIND=JPIM),INTENT(IN) :: KFPTR,KOP,KLEN
213 INTEGER(KIND=JPIM),INTENT(OUT) :: KERROR
214 REAL(KIND=JPRM) PBUF(:)
215 INTEGER(KIND=JPIM) KREQ
216 
217 
218 INTEGER(KIND=JPIM) STATUS(mpi_status_size)
219 !
220 #ifndef MPI1
221 
222 ! -----------------------------------------------------------------
223 !
224 ! 1. Preamble
225 ! --------
226 
227 IF( mpl_rank > mpl_numio ) THEN
228  kerror = -1
229  RETURN
230 ENDIF
231 
232 IF( kop >= 1.AND.kop <= 4 ) THEN
233 
234  IF( kop /= mpl_iop ) THEN
235  kerror = -1
236  RETURN
237  ENDIF
238 
239 ENDIF
240 ! -----------------------------------------------------------------
241 !
242 ! 2. Check style and take appropriate action
243 ! ---------------------------------------
244 
245 
246 IF( kop == 1 ) THEN
247 
248 ! blocking read, non collective, shared file pointer
249 
250  CALL mpi_file_read_shared(kfptr,&
251  & pbuf,&
252  & klen,&
253  & mpi_real8,&
254  & status,&
255  & kerror)
256 
257 ELSEIF( kop == 2 ) THEN
258 
259 ! blocking read, collective, ordered with shared file pointer
260 
261  CALL mpi_file_read_ordered(kfptr,&
262  & pbuf,&
263  & klen,&
264  & mpi_real8,&
265  & status,&
266  & kerror)
267 
268 ELSEIF( kop == 3 ) THEN
269 
270 ! non blocking read, non collective, shared file pointer
271 
272  CALL mpi_file_iread_shared(kfptr,&
273  & pbuf,&
274  & klen,&
275  & mpi_real8,&
276  & kreq,&
277  & kerror)
278 
279 ELSEIF( kop == 4 ) THEN
280 
281 ! non blocking read, collective, ordered with shared file pointer
282 
283  CALL mpi_file_read_ordered_begin(kfptr,&
284  & pbuf,&
285  & klen,&
286  & mpi_real8,&
287  & kerror)
288 
289 ELSEIF( kop == 5 ) THEN
290 
291  CALL mpi_wait(kreq,&
292  & status,&
293  & kerror )
294 
295 ELSEIF( kop == 6 ) THEN
296 
297  CALL mpi_file_read_ordered_end(kfptr,&
298  & pbuf,&
299  & status,&
300  & kerror)
301 
302 ELSE
303 
304  kerror =-1
305  RETURN
306 
307 ENDIF
308 
309 !
310 ! -----------------------------------------------------------------
311 #else
312 
313 CALL abor1('MPL_READ_REAL8 not build with MPI2')
314 
315 #endif
316 
317 RETURN
318 END SUBROUTINE mpl_read_real8
319 
320 END MODULE mpl_read_mod
subroutine mpl_read_int(KFPTR, KOP, KBUF, KLEN, KREQ, KERROR)
integer, parameter jpim
Definition: parkind1.F90:13
subroutine mpl_read_real8(KFPTR, KOP, PBUF, KLEN, KREQ, KERROR)
subroutine abor1(CDTEXT)
Definition: abor1.F90:2
integer(kind=jpim), public mpl_iop
integer(kind=jpim), public mpl_numio
integer, parameter jprb
Definition: parkind1.F90:32
integer, parameter jprm
Definition: parkind1.F90:30
integer(kind=jpim) mpl_rank