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