1      MODULE MPI__type_SV
2!
3!
4!       Michael Hennecke
5!       A Fortran 90 interface to MPI version 1.1
6!       RZ Uni Karlsruhe, Internal Report 63/96
7!
8!         Auxiliary module template MPI__type_SV
9!
10!         03-Oct-1996, hennecke@rz.uni-karlsruhe.de (v0.9c beta)
11!
12!       Permission is granted to copy and distribute this file
13!       or modified versions of this file for no fee, provided the
14!       copyright notice and this permission notice are preserved
15!       on all copies.
16!
17!       (C) 1996  Michael Hennecke, RZ Universitaet Karlsruhe
18!
19!
20        USE TIMER_MPI_M, only: timer_mpi
21
22        IMPLICIT NONE
23        PRIVATE
24
25!       ... A.9  Fortran Bindings for Point-to-Point Communication  ...
26
27!!!     PUBLIC :: MPI_PACK
28!!!     INTERFACE MPI_PACK
29!!!       MODULE PROCEDURE MPI_PACK_T
30!!!     END INTERFACE ! MPI_PACK
31
32!!!     PUBLIC :: MPI_UNPACK
33!!!     INTERFACE MPI_UNPACK
34!!!       MODULE PROCEDURE MPI_UNPACK_T
35!!!     END INTERFACE ! MPI_UNPACK
36
37!       ... A.10  Fortran Bindings for Collective Communication  ...
38
39        PUBLIC :: MPI_GATHER
40        INTERFACE MPI_GATHER
41          MODULE PROCEDURE MPI_GATHER_T
42        END INTERFACE ! MPI_GATHER
43
44        PUBLIC :: MPI_GATHERV
45        INTERFACE MPI_GATHERV
46          MODULE PROCEDURE MPI_GATHERV_T
47        END INTERFACE ! MPI_GATHERV
48
49        PUBLIC :: MPI_SCATTER
50        INTERFACE MPI_SCATTER
51          MODULE PROCEDURE MPI_SCATTER_T
52        END INTERFACE ! MPI_SCATTER
53
54        PUBLIC :: MPI_SCATTERV
55        INTERFACE MPI_SCATTERV
56          MODULE PROCEDURE MPI_SCATTERV_T
57        END INTERFACE ! MPI_SCATTERV
58
59        PUBLIC :: MPI_ALLGATHER
60        INTERFACE MPI_ALLGATHER
61          MODULE PROCEDURE MPI_ALLGATHER_T
62        END INTERFACE ! MPI_ALLGATHER
63
64        PUBLIC :: MPI_ALLGATHERV
65        INTERFACE MPI_ALLGATHERV
66          MODULE PROCEDURE MPI_ALLGATHERV_T
67        END INTERFACE ! MPI_ALLGATHERV
68
69        PUBLIC :: MPI_ALLTOALL
70        INTERFACE MPI_ALLTOALL
71          MODULE PROCEDURE MPI_ALLTOALL_T
72        END INTERFACE ! MPI_ALLTOALL
73
74        PUBLIC :: MPI_ALLTOALLV
75        INTERFACE MPI_ALLTOALLV
76          MODULE PROCEDURE MPI_ALLTOALLV_T
77        END INTERFACE ! MPI_ALLTOALLV
78
79        PUBLIC :: MPI_REDUCE
80        INTERFACE MPI_REDUCE
81          MODULE PROCEDURE MPI_REDUCE_T
82        END INTERFACE ! MPI_REDUCE
83
84        PUBLIC :: MPI_ALLREDUCE
85        INTERFACE MPI_ALLREDUCE
86          MODULE PROCEDURE MPI_ALLREDUCE_T
87        END INTERFACE ! MPI_ALLREDUCE
88
89        PUBLIC :: MPI_REDUCE_SCATTER
90        INTERFACE MPI_REDUCE_SCATTER
91          MODULE PROCEDURE MPI_REDUCE_SCATTER_T
92        END INTERFACE ! MPI_REDUCE_SCATTER
93
94        PUBLIC :: MPI_SCAN
95        INTERFACE MPI_SCAN
96          MODULE PROCEDURE MPI_SCAN_T
97        END INTERFACE ! MPI_SCAN
98
99      CONTAINS
100
101!       ... A.9  Fortran Bindings for Point-to-Point Communication  ...
102
103        SUBROUTINE MPI_PACK_T(                                          &
104     &      INBUF, INCOUNT, DATATYPE, OUTBUF, OUTCOUNT, POSITION,       &
105     &      COMM, IERROR)
106          type, INTENT(IN)  :: INBUF
107          INTEGER, INTENT(IN)  :: INCOUNT
108          INTEGER, INTENT(IN)  :: DATATYPE
109          type, INTENT(OUT) :: OUTBUF(*)
110          INTEGER, INTENT(IN)  :: OUTCOUNT
111          INTEGER, INTENT(INOUT) :: POSITION
112          INTEGER, INTENT(IN)  :: COMM
113          INTEGER, INTENT(OUT) :: IERROR
114          EXTERNAL MPI_PACK
115          CALL     MPI_PACK(                                            &
116     &      INBUF, INCOUNT, DATATYPE, OUTBUF, OUTCOUNT, POSITION,       &
117     &      COMM, IERROR)
118        END SUBROUTINE MPI_PACK_T
119
120        SUBROUTINE MPI_UNPACK_T(                                        &
121     &      INBUF, INSIZE, POSITION, OUTBUF, OUTCOUNT, DATATYPE,        &
122     &      COMM, IERROR)
123          type, INTENT(IN)  :: INBUF
124          INTEGER, INTENT(IN)  :: INSIZE
125          INTEGER, INTENT(INOUT) :: POSITION
126          type, INTENT(OUT) :: OUTBUF(*)
127          INTEGER, INTENT(IN)  :: OUTCOUNT
128          INTEGER, INTENT(IN)  :: DATATYPE
129          INTEGER, INTENT(IN)  :: COMM
130          INTEGER, INTENT(OUT) :: IERROR
131          EXTERNAL MPI_UNPACK
132          CALL     MPI_UNPACK(                                          &
133     &      INBUF, INSIZE, POSITION, OUTBUF, OUTCOUNT, DATATYPE,        &
134     &      COMM, IERROR)
135        END SUBROUTINE MPI_UNPACK_T
136
137!      ... A.10  Fortran Bindings for Collective Communication  ...
138
139        SUBROUTINE MPI_GATHER_T(                                        &
140     &      SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,           &
141     &      RECVTYPE, ROOT, COMM, IERROR)
142          type, INTENT(IN)  :: SENDBUF
143          INTEGER, INTENT(IN)  :: SENDCOUNT
144          INTEGER, INTENT(IN)  :: SENDTYPE
145          type, INTENT(OUT) :: RECVBUF(*)
146          INTEGER, INTENT(IN)  :: RECVCOUNT
147          INTEGER, INTENT(IN)  :: RECVTYPE
148          INTEGER, INTENT(IN)  :: ROOT
149          INTEGER, INTENT(IN)  :: COMM
150          INTEGER, INTENT(OUT) :: IERROR
151          EXTERNAL MPI_GATHER
152          call timer_mpi('MPI_GATHER',1)
153          CALL     MPI_GATHER(                                          &
154     &      SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,           &
155     &      RECVTYPE, ROOT, COMM, IERROR)
156          call timer_mpi('MPI_GATHER',2)
157        END SUBROUTINE MPI_GATHER_T
158
159        SUBROUTINE MPI_GATHERV_T(                                       &
160     &      SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNTS,          &
161     &      DISPLS, RECVTYPE, ROOT, COMM, IERROR)
162          type, INTENT(IN)  :: SENDBUF
163          INTEGER, INTENT(IN)  :: SENDCOUNT
164          INTEGER, INTENT(IN)  :: SENDTYPE
165          type, INTENT(OUT) :: RECVBUF(*)
166          INTEGER, INTENT(IN)  :: RECVCOUNTS(*)
167          INTEGER, INTENT(IN)  :: DISPLS(*)
168          INTEGER, INTENT(IN)  :: RECVTYPE
169          INTEGER, INTENT(IN)  :: ROOT
170          INTEGER, INTENT(IN)  :: COMM
171          INTEGER, INTENT(OUT) :: IERROR
172          EXTERNAL MPI_GATHERV
173          CALL     MPI_GATHERV(                                         &
174     &      SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNTS,          &
175     &      DISPLS, RECVTYPE, ROOT, COMM, IERROR)
176        END SUBROUTINE MPI_GATHERV_T
177
178        SUBROUTINE MPI_SCATTER_T(                                       &
179     &      SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,           &
180     &      RECVTYPE, ROOT, COMM, IERROR)
181          type, INTENT(IN)  :: SENDBUF
182          INTEGER, INTENT(IN)  :: SENDCOUNT
183          INTEGER, INTENT(IN)  :: SENDTYPE
184          type, INTENT(OUT) :: RECVBUF(*)
185          INTEGER, INTENT(IN)  :: RECVCOUNT
186          INTEGER, INTENT(IN)  :: RECVTYPE
187          INTEGER, INTENT(IN)  :: ROOT
188          INTEGER, INTENT(IN)  :: COMM
189          INTEGER, INTENT(OUT) :: IERROR
190          EXTERNAL MPI_SCATTER
191          CALL     MPI_SCATTER(                                         &
192     &      SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,           &
193     &      RECVTYPE, ROOT, COMM, IERROR)
194        END SUBROUTINE MPI_SCATTER_T
195
196        SUBROUTINE MPI_SCATTERV_T(                                      &
197     &      SENDBUF, SENDCOUNTS, DISPLS, SENDTYPE, RECVBUF,             &
198     &      RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR)
199          type, INTENT(IN)  :: SENDBUF
200          INTEGER, INTENT(IN)  :: SENDCOUNTS(*)
201          INTEGER, INTENT(IN)  :: DISPLS(*)
202          INTEGER, INTENT(IN)  :: SENDTYPE
203          type, INTENT(OUT) :: RECVBUF(*)
204          INTEGER, INTENT(IN)  :: RECVCOUNT
205          INTEGER, INTENT(IN)  :: RECVTYPE
206          INTEGER, INTENT(IN)  :: ROOT
207          INTEGER, INTENT(IN)  :: COMM
208          INTEGER, INTENT(OUT) :: IERROR
209          EXTERNAL MPI_SCATTERV
210          CALL     MPI_SCATTERV(                                        &
211     &      SENDBUF, SENDCOUNTS, DISPLS, SENDTYPE, RECVBUF,             &
212     &      RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR)
213        END SUBROUTINE MPI_SCATTERV_T
214
215        SUBROUTINE MPI_ALLGATHER_T(                                     &
216     &      SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,           &
217     &      RECVTYPE, COMM, IERROR)
218          type, INTENT(IN)  :: SENDBUF
219          INTEGER, INTENT(IN)  :: SENDCOUNT
220          INTEGER, INTENT(IN)  :: SENDTYPE
221          type, INTENT(OUT) :: RECVBUF(*)
222          INTEGER, INTENT(IN)  :: RECVCOUNT
223          INTEGER, INTENT(IN)  :: RECVTYPE
224          INTEGER, INTENT(IN)  :: COMM
225          INTEGER, INTENT(OUT) :: IERROR
226          EXTERNAL MPI_ALLGATHER
227          call timer_mpi('MPI_ALLGATHER',1)
228          CALL     MPI_ALLGATHER(                                       &
229     &      SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,           &
230     &      RECVTYPE, COMM, IERROR)
231          call timer_mpi('MPI_ALLGATHER',2)
232        END SUBROUTINE MPI_ALLGATHER_T
233
234        SUBROUTINE MPI_ALLGATHERV_T(                                    &
235     &      SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNTS,          &
236     &      DISPLS, RECVTYPE, COMM, IERROR)
237          type, INTENT(IN)  :: SENDBUF
238          INTEGER, INTENT(IN)  :: SENDCOUNT
239          INTEGER, INTENT(IN)  :: SENDTYPE
240          type, INTENT(OUT) :: RECVBUF(*)
241          INTEGER, INTENT(IN)  :: RECVCOUNTS(*)
242          INTEGER, INTENT(IN)  :: DISPLS(*)
243          INTEGER, INTENT(IN)  :: RECVTYPE
244          INTEGER, INTENT(IN)  :: COMM
245          INTEGER, INTENT(OUT) :: IERROR
246          EXTERNAL MPI_ALLGATHERV
247          CALL     MPI_ALLGATHERV(                                      &
248     &      SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNTS,          &
249     &      DISPLS, RECVTYPE, COMM, IERROR)
250        END SUBROUTINE MPI_ALLGATHERV_T
251
252        SUBROUTINE MPI_ALLTOALL_T(                                      &
253     &      SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,           &
254     &      RECVTYPE, COMM, IERROR)
255          type, INTENT(IN)  :: SENDBUF
256          INTEGER, INTENT(IN)  :: SENDCOUNT
257          INTEGER, INTENT(IN)  :: SENDTYPE
258          type, INTENT(OUT) :: RECVBUF(*)
259          INTEGER, INTENT(IN)  :: RECVCOUNT
260          INTEGER, INTENT(IN)  :: RECVTYPE
261          INTEGER, INTENT(IN)  :: COMM
262          INTEGER, INTENT(OUT) :: IERROR
263          EXTERNAL MPI_ALLTOALL
264          CALL     MPI_ALLTOALL(                                        &
265     &      SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,           &
266     &      RECVTYPE, COMM, IERROR)
267        END SUBROUTINE MPI_ALLTOALL_T
268
269        SUBROUTINE MPI_ALLTOALLV_T(                                     &
270     &      SENDBUF, SENDCOUNTS, SDISPLS, SENDTYPE, RECVBUF,            &
271     &      RECVCOUNTS, RDISPLS, RECVTYPE, COMM, IERROR)
272          type, INTENT(IN)  :: SENDBUF
273          INTEGER, INTENT(IN)  :: SENDCOUNTS(*)
274          INTEGER, INTENT(IN)  :: SDISPLS(*)
275          INTEGER, INTENT(IN)  :: SENDTYPE
276          type, INTENT(OUT) :: RECVBUF(*)
277          INTEGER, INTENT(IN)  :: RECVCOUNTS(*)
278          INTEGER, INTENT(IN)  :: RDISPLS(*)
279          INTEGER, INTENT(IN)  :: RECVTYPE
280          INTEGER, INTENT(IN)  :: COMM
281          INTEGER, INTENT(OUT) :: IERROR
282          EXTERNAL MPI_ALLTOALLV
283          CALL     MPI_ALLTOALLV(                                       &
284     &      SENDBUF, SENDCOUNTS, SDISPLS, SENDTYPE, RECVBUF,            &
285     &      RECVCOUNTS, RDISPLS, RECVTYPE, COMM, IERROR)
286        END SUBROUTINE MPI_ALLTOALLV_T
287
288        SUBROUTINE MPI_REDUCE_T(                                        &
289     &      SENDBUF, RECVBUF, COUNT, DATATYPE, OP, ROOT, COMM, IERROR)
290          type, INTENT(IN)  :: SENDBUF
291          type, INTENT(OUT) :: RECVBUF(*)
292          INTEGER, INTENT(IN)  :: COUNT
293          INTEGER, INTENT(IN)  :: DATATYPE
294          INTEGER, INTENT(IN)  :: OP
295          INTEGER, INTENT(IN)  :: ROOT
296          INTEGER, INTENT(IN)  :: COMM
297          INTEGER, INTENT(OUT) :: IERROR
298          EXTERNAL MPI_REDUCE
299          call timer_mpi('MPI_REDUCE',1)
300          CALL     MPI_REDUCE(                                          &
301     &      SENDBUF, RECVBUF, COUNT, DATATYPE, OP, ROOT, COMM, IERROR)
302          call timer_mpi('MPI_REDUCE',2)
303        END SUBROUTINE MPI_REDUCE_T
304
305        SUBROUTINE MPI_ALLREDUCE_T(                                     &
306     &      SENDBUF, RECVBUF, COUNT, DATATYPE, OP, COMM, IERROR)
307          type, INTENT(IN)  :: SENDBUF
308          type, INTENT(OUT) :: RECVBUF(*)
309          INTEGER, INTENT(IN)  :: COUNT
310          INTEGER, INTENT(IN)  :: DATATYPE
311          INTEGER, INTENT(IN)  :: OP
312          INTEGER, INTENT(IN)  :: COMM
313          INTEGER, INTENT(OUT) :: IERROR
314          EXTERNAL MPI_ALLREDUCE
315          call timer_mpi('MPI_ALLREDUCE',1)
316          CALL     MPI_ALLREDUCE(                                       &
317     &      SENDBUF, RECVBUF, COUNT, DATATYPE, OP, COMM, IERROR)
318          call timer_mpi('MPI_ALLREDUCE',2)
319        END SUBROUTINE MPI_ALLREDUCE_T
320
321        SUBROUTINE MPI_REDUCE_SCATTER_T(                                &
322     &      SENDBUF, RECVBUF, RECVCOUNTS, DATATYPE, OP, COMM, IERROR)
323          type, INTENT(IN)  :: SENDBUF
324          type, INTENT(OUT) :: RECVBUF(*)
325          INTEGER, INTENT(IN)  :: RECVCOUNTS(*)
326          INTEGER, INTENT(IN)  :: DATATYPE
327          INTEGER, INTENT(IN)  :: OP
328          INTEGER, INTENT(IN)  :: COMM
329          INTEGER, INTENT(OUT) :: IERROR
330          EXTERNAL MPI_REDUCE_SCATTER
331          CALL     MPI_REDUCE_SCATTER(                                  &
332     &      SENDBUF, RECVBUF, RECVCOUNTS, DATATYPE, OP, COMM, IERROR)
333        END SUBROUTINE MPI_REDUCE_SCATTER_T
334
335        SUBROUTINE MPI_SCAN_T(                                          &
336     &      SENDBUF, RECVBUF, COUNT, DATATYPE, OP, COMM, IERROR)
337          type, INTENT(IN)  :: SENDBUF
338          type, INTENT(OUT) :: RECVBUF(*)
339          INTEGER, INTENT(IN)  :: COUNT
340          INTEGER, INTENT(IN)  :: DATATYPE
341          INTEGER, INTENT(IN)  :: OP
342          INTEGER, INTENT(IN)  :: COMM
343          INTEGER, INTENT(OUT) :: IERROR
344          EXTERNAL MPI_SCAN
345          CALL     MPI_SCAN(                                            &
346     &      SENDBUF, RECVBUF, COUNT, DATATYPE, OP, COMM, IERROR)
347        END SUBROUTINE MPI_SCAN_T
348
349      END MODULE MPI__type_SV
350