1! --- 2! Copyright (C) 1996-2016 The SIESTA group 3! This file is distributed under the terms of the 4! GNU General Public License: see COPYING in the top directory 5! or http://www.gnu.org/copyleft/gpl.txt . 6! See Docs/Contributors.txt for a list of contributors. 7! --- 8 MODULE MPI_INTERFACES 9! 10! 11! Michael Hennecke 12! A Fortran 90 interface to MPI version 1.1 13! RZ Uni Karlsruhe, Internal Report 63/96 14! 15! 03-Oct-1996, hennecke@rz.uni-karlsruhe.de (v0.9c beta) 16! 17! Permission is granted to copy and distribute this file 18! or modified versions of this file for no fee, provided the 19! copyright notice and this permission notice are preserved 20! on all copies. 21! 22! (C) 1996 Michael Hennecke, RZ Universitaet Karlsruhe 23! 24! 25! Modified by Alberto Garcia, wdpgaara@lg.ehu.es 26! 27 USE MPI__INCLUDE 28 29! ... generic overloads for <choice> argument routines ... 30 31 USE MPI__logical_V 32 USE MPI__logical_S 33 USE MPI__character_V 34 USE MPI__character_S 35 36 include "V_S.uses" 37 38! ... these are for two different-rank <choice> arguments ... 39 40 USE MPI__logical_VS 41 USE MPI__logical_SV 42 USE MPI__character_VS 43 USE MPI__character_SV 44 45 include "VS.uses" 46 47! ... this is for *ALL* combinations of type/rank of SENDRECV ... 48! USE MPI__sendrecv 49 50 IMPLICIT NONE 51! 52! ... A.9 Fortran Bindings for Point-to-Point Communication ... 53 54 INTERFACE 55 SUBROUTINE MPI_GET_COUNT(STATUS, DATATYPE, COUNT, IERROR) 56 USE MPI__INCLUDE, ONLY: MPI_STATUS_SIZE 57 INTEGER, INTENT(IN) :: STATUS(MPI_STATUS_SIZE) 58 INTEGER, INTENT(IN) :: DATATYPE 59 INTEGER, INTENT(OUT) :: COUNT 60 INTEGER, INTENT(OUT) :: IERROR 61 END SUBROUTINE MPI_GET_COUNT 62 63 SUBROUTINE MPI_WAIT(REQUEST, STATUS, IERROR) 64 USE MPI__INCLUDE, ONLY: MPI_STATUS_SIZE 65 INTEGER, INTENT(INOUT) :: REQUEST 66 INTEGER, INTENT(OUT) :: STATUS(MPI_STATUS_SIZE) 67 INTEGER, INTENT(OUT) :: IERROR 68 END SUBROUTINE MPI_WAIT 69 70 SUBROUTINE MPI_TEST(REQUEST, FLAG, STATUS, IERROR) 71 USE MPI__INCLUDE, ONLY: MPI_STATUS_SIZE 72 INTEGER, INTENT(INOUT) :: REQUEST 73 LOGICAL, INTENT(OUT) :: FLAG 74 INTEGER, INTENT(OUT) :: STATUS(MPI_STATUS_SIZE) 75 INTEGER, INTENT(OUT) :: IERROR 76 END SUBROUTINE MPI_TEST 77 78 SUBROUTINE MPI_REQUEST_FREE(REQUEST, IERROR) 79 INTEGER, INTENT(INOUT) :: REQUEST 80 INTEGER, INTENT(OUT) :: IERROR 81 END SUBROUTINE MPI_REQUEST_FREE 82 83 SUBROUTINE MPI_WAITANY( & 84 & COUNT, ARRAY_OF_REQUESTS, INDEX, STATUS, IERROR) 85 USE MPI__INCLUDE, ONLY: MPI_STATUS_SIZE 86 INTEGER, INTENT(IN) :: COUNT 87 INTEGER, INTENT(INOUT) :: ARRAY_OF_REQUESTS(*) 88 INTEGER, INTENT(OUT) :: INDEX 89 INTEGER, INTENT(OUT) :: STATUS(MPI_STATUS_SIZE) 90 INTEGER, INTENT(OUT) :: IERROR 91 END SUBROUTINE MPI_WAITANY 92 93 SUBROUTINE MPI_TESTANY( & 94 & COUNT, ARRAY_OF_REQUESTS, INDEX, FLAG, STATUS, IERROR) 95 USE MPI__INCLUDE, ONLY: MPI_STATUS_SIZE 96 INTEGER, INTENT(IN) :: COUNT 97 INTEGER, INTENT(INOUT) :: ARRAY_OF_REQUESTS(*) 98 INTEGER, INTENT(OUT) :: INDEX 99 LOGICAL, INTENT(OUT) :: FLAG 100 INTEGER, INTENT(OUT) :: STATUS(MPI_STATUS_SIZE) 101 INTEGER, INTENT(OUT) :: IERROR 102 END SUBROUTINE MPI_TESTANY 103 104 SUBROUTINE MPI_WAITALL( & 105 & COUNT, ARRAY_OF_REQUESTS, ARRAY_OF_STATUSES, IERROR) 106 USE MPI__INCLUDE, ONLY: MPI_STATUS_SIZE 107 INTEGER, INTENT(IN) :: COUNT 108 INTEGER, INTENT(INOUT) :: ARRAY_OF_REQUESTS(*) 109 INTEGER, INTENT(OUT) :: ARRAY_OF_STATUSES(MPI_STATUS_SIZE,*) 110 INTEGER, INTENT(OUT) :: IERROR 111 END SUBROUTINE MPI_WAITALL 112 113 SUBROUTINE MPI_TESTALL( & 114 & COUNT, ARRAY_OF_REQUESTS, FLAG, ARRAY_OF_STATUSES, IERROR) 115 USE MPI__INCLUDE, ONLY: MPI_STATUS_SIZE 116 INTEGER, INTENT(IN) :: COUNT 117 INTEGER, INTENT(INOUT) :: ARRAY_OF_REQUESTS(*) 118 LOGICAL, INTENT(OUT) :: FLAG 119 INTEGER, INTENT(OUT) :: ARRAY_OF_STATUSES(MPI_STATUS_SIZE,*) 120 INTEGER, INTENT(OUT) :: IERROR 121 END SUBROUTINE MPI_TESTALL 122 123 SUBROUTINE MPI_WAITSOME( & 124 & INCOUNT, ARRAY_OF_REQUESTS, OUTCOUNT, ARRAY_OF_INDICES, & 125 & ARRAY_OF_STATUSES, IERROR) 126 USE MPI__INCLUDE, ONLY: MPI_STATUS_SIZE 127 INTEGER, INTENT(IN) :: INCOUNT 128 INTEGER, INTENT(INOUT) :: ARRAY_OF_REQUESTS(*) 129 INTEGER, INTENT(OUT) :: OUTCOUNT 130 INTEGER, INTENT(OUT) :: ARRAY_OF_INDICES(*) 131 INTEGER, INTENT(OUT) :: ARRAY_OF_STATUSES(MPI_STATUS_SIZE,*) 132 INTEGER, INTENT(OUT) :: IERROR 133 END SUBROUTINE MPI_WAITSOME 134 135 SUBROUTINE MPI_TESTSOME( & 136 & INCOUNT, ARRAY_OF_REQUESTS, OUTCOUNT, ARRAY_OF_INDICES, & 137 & ARRAY_OF_STATUSES, IERROR) 138 USE MPI__INCLUDE, ONLY: MPI_STATUS_SIZE 139 INTEGER, INTENT(IN) :: INCOUNT 140 INTEGER, INTENT(INOUT) :: ARRAY_OF_REQUESTS(*) 141 INTEGER, INTENT(OUT) :: OUTCOUNT 142 INTEGER, INTENT(OUT) :: ARRAY_OF_INDICES(*) 143 INTEGER, INTENT(OUT) :: ARRAY_OF_STATUSES(MPI_STATUS_SIZE,*) 144 INTEGER, INTENT(OUT) :: IERROR 145 END SUBROUTINE MPI_TESTSOME 146 147 SUBROUTINE MPI_IPROBE(SOURCE, TAG, COMM, FLAG, STATUS, IERROR) 148 USE MPI__INCLUDE, ONLY: MPI_STATUS_SIZE 149 INTEGER, INTENT(IN) :: SOURCE 150 INTEGER, INTENT(IN) :: TAG 151 INTEGER, INTENT(IN) :: COMM 152 LOGICAL, INTENT(OUT) :: FLAG 153 INTEGER, INTENT(OUT) :: STATUS(MPI_STATUS_SIZE) 154 INTEGER, INTENT(OUT) :: IERROR 155 END SUBROUTINE MPI_IPROBE 156 157 SUBROUTINE MPI_PROBE(SOURCE, TAG, COMM, STATUS, IERROR) 158 USE MPI__INCLUDE, ONLY: MPI_STATUS_SIZE 159 INTEGER, INTENT(IN) :: SOURCE 160 INTEGER, INTENT(IN) :: TAG 161 INTEGER, INTENT(IN) :: COMM 162 INTEGER, INTENT(OUT) :: STATUS(MPI_STATUS_SIZE) 163 INTEGER, INTENT(OUT) :: IERROR 164 END SUBROUTINE MPI_PROBE 165 166 SUBROUTINE MPI_CANCEL(REQUEST, IERROR) 167 INTEGER, INTENT(IN) :: REQUEST 168 INTEGER, INTENT(OUT) :: IERROR 169 END SUBROUTINE MPI_CANCEL 170 171 SUBROUTINE MPI_TEST_CANCELLED(STATUS, FLAG, IERROR) 172 USE MPI__INCLUDE, ONLY: MPI_STATUS_SIZE 173 INTEGER, INTENT(IN) :: STATUS(MPI_STATUS_SIZE) 174 LOGICAL, INTENT(OUT) :: FLAG 175 INTEGER, INTENT(OUT) :: IERROR 176 END SUBROUTINE MPI_TEST_CANCELLED 177 178 SUBROUTINE MPI_START(REQUEST, IERROR) 179 INTEGER, INTENT(INOUT) :: REQUEST 180 INTEGER, INTENT(OUT) :: IERROR 181 END SUBROUTINE MPI_START 182 183 SUBROUTINE MPI_STARTALL(COUNT, ARRAY_OF_REQUESTS, IERROR) 184 INTEGER, INTENT(IN) :: COUNT 185 INTEGER, INTENT(INOUT) :: ARRAY_OF_REQUESTS(*) 186 INTEGER, INTENT(OUT) :: IERROR 187 END SUBROUTINE MPI_STARTALL 188 189 SUBROUTINE MPI_TYPE_CONTIGUOUS( & 190 & COUNT, OLDTYPE, NEWTYPE, IERROR) 191 INTEGER, INTENT(IN) :: COUNT 192 INTEGER, INTENT(IN) :: OLDTYPE 193 INTEGER, INTENT(OUT) :: NEWTYPE 194 INTEGER, INTENT(OUT) :: IERROR 195 END SUBROUTINE MPI_TYPE_CONTIGUOUS 196 197 SUBROUTINE MPI_TYPE_VECTOR( & 198 & COUNT, BLOCKLENGTH, STRIDE, OLDTYPE, NEWTYPE, IERROR) 199 INTEGER, INTENT(IN) :: COUNT 200 INTEGER, INTENT(IN) :: BLOCKLENGTH 201 INTEGER, INTENT(IN) :: STRIDE 202 INTEGER, INTENT(IN) :: OLDTYPE 203 INTEGER, INTENT(OUT) :: NEWTYPE 204 INTEGER, INTENT(OUT) :: IERROR 205 END SUBROUTINE MPI_TYPE_VECTOR 206 207 SUBROUTINE MPI_TYPE_HVECTOR( & 208 & COUNT, BLOCKLENGTH, STRIDE, OLDTYPE, NEWTYPE, IERROR) 209 INTEGER, INTENT(IN) :: COUNT 210 INTEGER, INTENT(IN) :: BLOCKLENGTH 211 INTEGER, INTENT(IN) :: STRIDE 212 INTEGER, INTENT(IN) :: OLDTYPE 213 INTEGER, INTENT(OUT) :: NEWTYPE 214 INTEGER, INTENT(OUT) :: IERROR 215 END SUBROUTINE MPI_TYPE_HVECTOR 216 217 SUBROUTINE MPI_TYPE_INDEXED( & 218 & COUNT, ARRAY_OF_BLOCKLENGTHS, ARRAY_OF_DISPLACEMENTS, & 219 & OLDTYPE, NEWTYPE, IERROR) 220 INTEGER, INTENT(IN) :: COUNT 221 INTEGER, INTENT(IN) :: ARRAY_OF_BLOCKLENGTHS(*) 222 INTEGER, INTENT(IN) :: ARRAY_OF_DISPLACEMENTS(*) 223 INTEGER, INTENT(IN) :: OLDTYPE 224 INTEGER, INTENT(OUT) :: NEWTYPE 225 INTEGER, INTENT(OUT) :: IERROR 226 END SUBROUTINE MPI_TYPE_INDEXED 227 228 SUBROUTINE MPI_TYPE_HINDEXED( & 229 & COUNT, ARRAY_OF_BLOCKLENGTHS, ARRAY_OF_DISPLACEMENTS, & 230 & OLDTYPE, NEWTYPE, IERROR) 231 INTEGER, INTENT(IN) :: COUNT 232 INTEGER, INTENT(IN) :: ARRAY_OF_BLOCKLENGTHS(*) 233 INTEGER, INTENT(IN) :: ARRAY_OF_DISPLACEMENTS(*) 234 INTEGER, INTENT(IN) :: OLDTYPE 235 INTEGER, INTENT(OUT) :: NEWTYPE 236 INTEGER, INTENT(OUT) :: IERROR 237 END SUBROUTINE MPI_TYPE_HINDEXED 238 239 SUBROUTINE MPI_TYPE_STRUCT( & 240 & COUNT, ARRAY_OF_BLOCKLENGTHS, ARRAY_OF_DISPLACEMENTS, & 241 & ARRAY_OF_TYPES, NEWTYPE, IERROR) 242 INTEGER, INTENT(IN) :: COUNT 243 INTEGER, INTENT(IN) :: ARRAY_OF_BLOCKLENGTHS(*) 244 INTEGER, INTENT(IN) :: ARRAY_OF_DISPLACEMENTS(*) 245 INTEGER, INTENT(IN) :: ARRAY_OF_TYPES(*) 246 INTEGER, INTENT(OUT) :: NEWTYPE 247 INTEGER, INTENT(OUT) :: IERROR 248 END SUBROUTINE MPI_TYPE_STRUCT 249 250 SUBROUTINE MPI_TYPE_EXTENT(DATATYPE, EXTENT, IERROR) 251 INTEGER, INTENT(IN) :: DATATYPE 252 INTEGER, INTENT(OUT) :: EXTENT 253 INTEGER, INTENT(OUT) :: IERROR 254 END SUBROUTINE MPI_TYPE_EXTENT 255 256 SUBROUTINE MPI_TYPE_SIZE(DATATYPE, SIZE, IERROR) 257 INTEGER, INTENT(IN) :: DATATYPE 258 INTEGER, INTENT(OUT) :: SIZE 259 INTEGER, INTENT(OUT) :: IERROR 260 END SUBROUTINE MPI_TYPE_SIZE 261 262 SUBROUTINE MPI_TYPE_COUNT(DATATYPE, COUNT, IERROR) 263 INTEGER, INTENT(IN) :: DATATYPE 264 INTEGER, INTENT(OUT) :: COUNT 265 INTEGER, INTENT(OUT) :: IERROR 266 END SUBROUTINE MPI_TYPE_COUNT 267 268 SUBROUTINE MPI_TYPE_LB( DATATYPE, DISPLACEMENT, IERROR) 269 INTEGER, INTENT(IN) :: DATATYPE 270 INTEGER, INTENT(OUT) :: DISPLACEMENT 271 INTEGER, INTENT(OUT) :: IERROR 272 END SUBROUTINE MPI_TYPE_LB 273 274 SUBROUTINE MPI_TYPE_UB( DATATYPE, DISPLACEMENT, IERROR) 275 INTEGER, INTENT(IN) :: DATATYPE 276 INTEGER, INTENT(OUT) :: DISPLACEMENT 277 INTEGER, INTENT(OUT) :: IERROR 278 END SUBROUTINE MPI_TYPE_UB 279 280 SUBROUTINE MPI_TYPE_COMMIT(DATATYPE, IERROR) 281 INTEGER, INTENT(INOUT) :: DATATYPE 282 INTEGER, INTENT(OUT) :: IERROR 283 END SUBROUTINE MPI_TYPE_COMMIT 284 285 SUBROUTINE MPI_TYPE_FREE(DATATYPE, IERROR) 286 INTEGER, INTENT(INOUT) :: DATATYPE 287 INTEGER, INTENT(OUT) :: IERROR 288 END SUBROUTINE MPI_TYPE_FREE 289 290 SUBROUTINE MPI_GET_ELEMENTS(STATUS, DATATYPE, COUNT, IERROR) 291 USE MPI__INCLUDE, ONLY: MPI_STATUS_SIZE 292 INTEGER, INTENT(IN) :: STATUS(MPI_STATUS_SIZE) 293 INTEGER, INTENT(IN) :: DATATYPE 294 INTEGER, INTENT(OUT) :: COUNT 295 INTEGER, INTENT(OUT) :: IERROR 296 END SUBROUTINE MPI_GET_ELEMENTS 297 298 SUBROUTINE MPI_PACK_SIZE( & 299 & INCOUNT, DATATYPE, COMM, SIZE, IERROR) 300 INTEGER, INTENT(IN) :: INCOUNT 301 INTEGER, INTENT(IN) :: DATATYPE 302 INTEGER, INTENT(IN) :: COMM 303 INTEGER, INTENT(OUT) :: SIZE 304 INTEGER, INTENT(OUT) :: IERROR 305 END SUBROUTINE MPI_PACK_SIZE 306 END INTERFACE 307 308! ... A.10 Fortran Bindings for Collective Communication ... 309 310 INTERFACE 311 SUBROUTINE MPI_BARRIER(COMM, IERROR) 312 INTEGER, INTENT(IN) :: COMM 313 INTEGER, INTENT(OUT) :: IERROR 314 END SUBROUTINE MPI_BARRIER 315 316 SUBROUTINE MPI_OP_CREATE( FUNCTION, COMMUTE, OP, IERROR) 317 EXTERNAL FUNCTION 318 LOGICAL, INTENT(IN) :: COMMUTE 319 INTEGER, INTENT(OUT) :: OP 320 INTEGER, INTENT(OUT) :: IERROR 321 END SUBROUTINE MPI_OP_CREATE 322 323 SUBROUTINE MPI_OP_FREE( OP, IERROR) 324 INTEGER, INTENT(IN) :: OP 325 INTEGER, INTENT(OUT) :: IERROR 326 END SUBROUTINE MPI_OP_FREE 327 END INTERFACE 328 329! ... A.11 Fortran Bindings for Groups, Contexts, etc. ... 330 331 INTERFACE 332 SUBROUTINE MPI_GROUP_SIZE(GROUP, SIZE, IERROR) 333 INTEGER, INTENT(IN) :: GROUP 334 INTEGER, INTENT(OUT) :: SIZE 335 INTEGER, INTENT(OUT) :: IERROR 336 END SUBROUTINE MPI_GROUP_SIZE 337 338 SUBROUTINE MPI_GROUP_RANK(GROUP, RANK, IERROR) 339 INTEGER, INTENT(IN) :: GROUP 340 INTEGER, INTENT(OUT) :: RANK 341 INTEGER, INTENT(OUT) :: IERROR 342 END SUBROUTINE MPI_GROUP_RANK 343 344 SUBROUTINE MPI_GROUP_TRANSLATE_RANKS( & 345 & GROUP1, N, RANKS1, GROUP2, RANKS2, IERROR) 346 INTEGER, INTENT(IN) :: GROUP1 347 INTEGER, INTENT(IN) :: N 348 INTEGER, INTENT(IN) :: RANKS1(*) 349 INTEGER, INTENT(IN) :: GROUP2 350 INTEGER, INTENT(OUT) :: RANKS2(*) 351 INTEGER, INTENT(OUT) :: IERROR 352 END SUBROUTINE MPI_GROUP_TRANSLATE_RANKS 353 354 SUBROUTINE MPI_GROUP_COMPARE(GROUP1, GROUP2, RESULT, IERROR) 355 INTEGER, INTENT(IN) :: GROUP1 356 INTEGER, INTENT(IN) :: GROUP2 357 INTEGER, INTENT(OUT) :: RESULT 358 INTEGER, INTENT(OUT) :: IERROR 359 END SUBROUTINE MPI_GROUP_COMPARE 360 361 SUBROUTINE MPI_COMM_GROUP(COMM, GROUP, IERROR) 362 INTEGER, INTENT(IN) :: COMM 363 INTEGER, INTENT(OUT) :: GROUP 364 INTEGER, INTENT(OUT) :: IERROR 365 END SUBROUTINE MPI_COMM_GROUP 366 367 SUBROUTINE MPI_GROUP_UNION(GROUP1, GROUP2, NEWGROUP, IERROR) 368 INTEGER, INTENT(IN) :: GROUP1 369 INTEGER, INTENT(IN) :: GROUP2 370 INTEGER, INTENT(OUT) :: NEWGROUP 371 INTEGER, INTENT(OUT) :: IERROR 372 END SUBROUTINE MPI_GROUP_UNION 373 374 SUBROUTINE MPI_GROUP_INTERSECTION( & 375 & GROUP1, GROUP2, NEWGROUP, IERROR) 376 INTEGER, INTENT(IN) :: GROUP1 377 INTEGER, INTENT(IN) :: GROUP2 378 INTEGER, INTENT(OUT) :: NEWGROUP 379 INTEGER, INTENT(OUT) :: IERROR 380 END SUBROUTINE MPI_GROUP_INTERSECTION 381 382 SUBROUTINE MPI_GROUP_DIFFERENCE( & 383 & GROUP1, GROUP2, NEWGROUP, IERROR) 384 INTEGER, INTENT(IN) :: GROUP1 385 INTEGER, INTENT(IN) :: GROUP2 386 INTEGER, INTENT(OUT) :: NEWGROUP 387 INTEGER, INTENT(OUT) :: IERROR 388 END SUBROUTINE MPI_GROUP_DIFFERENCE 389 390 SUBROUTINE MPI_GROUP_INCL(GROUP, N, RANKS, NEWGROUP, IERROR) 391 INTEGER, INTENT(IN) :: GROUP 392 INTEGER, INTENT(IN) :: N 393 INTEGER, INTENT(IN) :: RANKS(*) 394 INTEGER, INTENT(OUT) :: NEWGROUP 395 INTEGER, INTENT(OUT) :: IERROR 396 END SUBROUTINE MPI_GROUP_INCL 397 398 SUBROUTINE MPI_GROUP_EXCL(GROUP, N, RANKS, NEWGROUP, IERROR) 399 INTEGER, INTENT(IN) :: GROUP 400 INTEGER, INTENT(IN) :: N 401 INTEGER, INTENT(IN) :: RANKS(*) 402 INTEGER, INTENT(OUT) :: NEWGROUP 403 INTEGER, INTENT(OUT) :: IERROR 404 END SUBROUTINE MPI_GROUP_EXCL 405 406 SUBROUTINE MPI_GROUP_RANGE_INCL( & 407 & GROUP, N, RANGES, NEWGROUP, IERROR) 408 INTEGER, INTENT(IN) :: GROUP 409 INTEGER, INTENT(IN) :: N 410 INTEGER, INTENT(IN) :: RANGES(3,*) 411 INTEGER, INTENT(OUT) :: NEWGROUP 412 INTEGER, INTENT(OUT) :: IERROR 413 END SUBROUTINE MPI_GROUP_RANGE_INCL 414 415 SUBROUTINE MPI_GROUP_RANGE_EXCL( & 416 & GROUP, N, RANGES, NEWGROUP, IERROR) 417 INTEGER, INTENT(IN) :: GROUP 418 INTEGER, INTENT(IN) :: N 419 INTEGER, INTENT(IN) :: RANGES(3,*) 420 INTEGER, INTENT(OUT) :: NEWGROUP 421 INTEGER, INTENT(OUT) :: IERROR 422 END SUBROUTINE MPI_GROUP_RANGE_EXCL 423 424 SUBROUTINE MPI_GROUP_FREE(GROUP, IERROR) 425 INTEGER, INTENT(INOUT) :: GROUP 426 INTEGER, INTENT(OUT) :: IERROR 427 END SUBROUTINE MPI_GROUP_FREE 428 429 SUBROUTINE MPI_COMM_SIZE(COMM, SIZE, IERROR) 430 INTEGER, INTENT(IN) :: COMM 431 INTEGER, INTENT(OUT) :: SIZE 432 INTEGER, INTENT(OUT) :: IERROR 433 END SUBROUTINE MPI_COMM_SIZE 434 435 SUBROUTINE MPI_COMM_RANK(COMM, RANK, IERROR) 436 INTEGER, INTENT(IN) :: COMM 437 INTEGER, INTENT(OUT) :: RANK 438 INTEGER, INTENT(OUT) :: IERROR 439 END SUBROUTINE MPI_COMM_RANK 440 441 SUBROUTINE MPI_COMM_COMPARE(COMM1, COMM2, RESULT, IERROR) 442 INTEGER, INTENT(IN) :: COMM1 443 INTEGER, INTENT(IN) :: COMM2 444 INTEGER, INTENT(OUT) :: RESULT 445 INTEGER, INTENT(OUT) :: IERROR 446 END SUBROUTINE MPI_COMM_COMPARE 447 448 SUBROUTINE MPI_COMM_DUP(COMM, NEWCOMM, IERROR) 449 INTEGER, INTENT(IN) :: COMM 450 INTEGER, INTENT(OUT) :: NEWCOMM 451 INTEGER, INTENT(OUT) :: IERROR 452 END SUBROUTINE MPI_COMM_DUP 453 454 SUBROUTINE MPI_COMM_CREATE(COMM, GROUP, NEWCOMM, IERROR) 455 INTEGER, INTENT(IN) :: COMM 456 INTEGER, INTENT(IN) :: GROUP 457 INTEGER, INTENT(OUT) :: NEWCOMM 458 INTEGER, INTENT(OUT) :: IERROR 459 END SUBROUTINE MPI_COMM_CREATE 460 461 SUBROUTINE MPI_COMM_SPLIT(COMM, COLOR, KEY, NEWCOMM, IERROR) 462 INTEGER, INTENT(IN) :: COMM 463 INTEGER, INTENT(IN) :: COLOR 464 INTEGER, INTENT(IN) :: KEY 465 INTEGER, INTENT(OUT) :: NEWCOMM 466 INTEGER, INTENT(OUT) :: IERROR 467 END SUBROUTINE MPI_COMM_SPLIT 468 469 SUBROUTINE MPI_COMM_FREE(COMM, IERROR) 470 INTEGER, INTENT(INOUT) :: COMM 471 INTEGER, INTENT(OUT) :: IERROR 472 END SUBROUTINE MPI_COMM_FREE 473 474 SUBROUTINE MPI_COMM_TEST_INTER(COMM, FLAG, IERROR) 475 INTEGER, INTENT(IN) :: COMM 476 INTEGER, INTENT(OUT) :: IERROR 477 LOGICAL :: FLAG 478 END SUBROUTINE MPI_COMM_TEST_INTER 479 480 SUBROUTINE MPI_COMM_REMOTE_SIZE(COMM, SIZE, IERROR) 481 INTEGER, INTENT(IN) :: COMM 482 INTEGER, INTENT(OUT) :: SIZE 483 INTEGER, INTENT(OUT) :: IERROR 484 END SUBROUTINE MPI_COMM_REMOTE_SIZE 485 486 SUBROUTINE MPI_COMM_REMOTE_GROUP(COMM, GROUP, IERROR) 487 INTEGER, INTENT(IN) :: COMM 488 INTEGER, INTENT(OUT) :: GROUP 489 INTEGER, INTENT(OUT) :: IERROR 490 END SUBROUTINE MPI_COMM_REMOTE_GROUP 491 492 SUBROUTINE MPI_INTERCOMM_CREATE( & 493 & LOCAL_COMM, LOCAL_LEADER, PEER_COMM, REMOTE_LEADER, & 494 & TAG, NEWINTERCOMM, IERROR) 495 INTEGER, INTENT(IN) :: LOCAL_COMM 496 INTEGER, INTENT(IN) :: LOCAL_LEADER 497 INTEGER, INTENT(IN) :: PEER_COMM 498 INTEGER, INTENT(IN) :: REMOTE_LEADER 499 INTEGER, INTENT(IN) :: TAG 500 INTEGER, INTENT(OUT) :: NEWINTERCOMM 501 INTEGER, INTENT(OUT) :: IERROR 502 END SUBROUTINE MPI_INTERCOMM_CREATE 503 504 SUBROUTINE MPI_INTERCOMM_MERGE( & 505 & INTERCOMM, HIGH, NEWINTRACOMM, IERROR) 506 INTEGER, INTENT(IN) :: INTERCOMM 507 LOGICAL, INTENT(IN) :: HIGH 508 INTEGER, INTENT(OUT) :: NEWINTRACOMM 509 INTEGER, INTENT(OUT) :: IERROR 510 END SUBROUTINE MPI_INTERCOMM_MERGE 511 512 SUBROUTINE MPI_KEYVAL_CREATE( & 513 & COPY_FN, DELETE_FN, KEYVAL, EXTRA_STATE, IERROR) 514 EXTERNAL COPY_FN, DELETE_FN 515 INTEGER, INTENT(OUT) :: KEYVAL 516 INTEGER, INTENT(IN) :: EXTRA_STATE 517 INTEGER, INTENT(OUT) :: IERROR 518 END SUBROUTINE MPI_KEYVAL_CREATE 519 520 SUBROUTINE MPI_KEYVAL_FREE(KEYVAL, IERROR) 521 INTEGER, INTENT(INOUT) :: KEYVAL 522 INTEGER, INTENT(OUT) :: IERROR 523 END SUBROUTINE MPI_KEYVAL_FREE 524 525 SUBROUTINE MPI_ATTR_PUT(COMM, KEYVAL, ATTRIBUTE_VAL, IERROR) 526 INTEGER, INTENT(IN) :: COMM 527 INTEGER, INTENT(IN) :: KEYVAL 528 INTEGER, INTENT(IN) :: ATTRIBUTE_VAL 529 INTEGER, INTENT(OUT) :: IERROR 530 END SUBROUTINE MPI_ATTR_PUT 531 532 SUBROUTINE MPI_ATTR_GET( & 533 & COMM, KEYVAL, ATTRIBUTE_VAL, FLAG, IERROR) 534 INTEGER, INTENT(IN) :: COMM 535 INTEGER, INTENT(IN) :: KEYVAL 536 INTEGER, INTENT(OUT) :: ATTRIBUTE_VAL 537 LOGICAL, INTENT(OUT) :: FLAG 538 INTEGER, INTENT(OUT) :: IERROR 539 END SUBROUTINE MPI_ATTR_GET 540 541 SUBROUTINE MPI_ATTR_DELETE(COMM, KEYVAL, IERROR) 542 INTEGER, INTENT(IN) :: COMM 543 INTEGER, INTENT(IN) :: KEYVAL 544 INTEGER, INTENT(OUT) :: IERROR 545 END SUBROUTINE MPI_ATTR_DELETE 546 END INTERFACE 547 548! ... A.12 Fortran Bindings for Process Topologies ... 549 550 INTERFACE 551 SUBROUTINE MPI_CART_CREATE( & 552 & COMM_OLD, NDIMS, DIMS, PERIODS, REORDER, COMM_CART, & 553 & IERROR) 554 INTEGER, INTENT(IN) :: COMM_OLD 555 INTEGER, INTENT(IN) :: NDIMS 556 INTEGER, INTENT(IN) :: DIMS(*) 557 LOGICAL, INTENT(IN) :: PERIODS(*) 558 LOGICAL, INTENT(IN) :: REORDER 559 INTEGER, INTENT(OUT) :: COMM_CART 560 INTEGER, INTENT(OUT) :: IERROR 561 END SUBROUTINE MPI_CART_CREATE 562 563 SUBROUTINE MPI_DIMS_CREATE(NNODES, NDIMS, DIMS, IERROR) 564 INTEGER, INTENT(IN) :: NNODES 565 INTEGER, INTENT(IN) :: NDIMS 566 INTEGER, INTENT(INOUT) :: DIMS(*) 567 INTEGER, INTENT(OUT) :: IERROR 568 END SUBROUTINE MPI_DIMS_CREATE 569 570 SUBROUTINE MPI_GRAPH_CREATE( & 571 & COMM_OLD, NNODES, INDEX, EDGES, REORDER, COMM_GRAPH, & 572 & IERROR) 573 INTEGER, INTENT(IN) :: COMM_OLD 574 INTEGER, INTENT(IN) :: NNODES 575 INTEGER, INTENT(IN) :: INDEX(*) 576 INTEGER, INTENT(IN) :: EDGES(*) 577 LOGICAL, INTENT(IN) :: REORDER 578 INTEGER, INTENT(OUT) :: COMM_GRAPH 579 INTEGER, INTENT(OUT) :: IERROR 580 END SUBROUTINE MPI_GRAPH_CREATE 581 582 SUBROUTINE MPI_TOPO_TEST(COMM, STATUS, IERROR) 583 INTEGER, INTENT(IN) :: COMM 584 INTEGER, INTENT(OUT) :: STATUS 585 INTEGER, INTENT(OUT) :: IERROR 586 END SUBROUTINE MPI_TOPO_TEST 587 588 SUBROUTINE MPI_GRAPHDIMS_GET(COMM, NNODES, NEDGES, IERROR) 589 INTEGER, INTENT(IN) :: COMM 590 INTEGER, INTENT(OUT) :: NNODES 591 INTEGER, INTENT(OUT) :: NEDGES 592 INTEGER, INTENT(OUT) :: IERROR 593 END SUBROUTINE MPI_GRAPHDIMS_GET 594 595 SUBROUTINE MPI_GRAPH_GET( & 596 & COMM, MAXINDEX, MAXEDGES, INDEX, EDGES, IERROR) 597 INTEGER, INTENT(IN) :: COMM 598 INTEGER, INTENT(IN) :: MAXINDEX 599 INTEGER, INTENT(IN) :: MAXEDGES 600 INTEGER, INTENT(OUT) :: INDEX(*) 601 INTEGER, INTENT(OUT) :: EDGES(*) 602 INTEGER, INTENT(OUT) :: IERROR 603 END SUBROUTINE MPI_GRAPH_GET 604 605 SUBROUTINE MPI_CARTDIM_GET(COMM, NDIMS, IERROR) 606 INTEGER, INTENT(IN) :: COMM 607 INTEGER, INTENT(OUT) :: NDIMS 608 INTEGER, INTENT(OUT) :: IERROR 609 END SUBROUTINE MPI_CARTDIM_GET 610 611 SUBROUTINE MPI_CART_GET( & 612 & COMM, MAXDIMS, DIMS, PERIODS, COORDS, IERROR) 613 INTEGER, INTENT(IN) :: COMM 614 INTEGER, INTENT(IN) :: MAXDIMS 615 INTEGER, INTENT(OUT) :: DIMS(*) 616 LOGICAL, INTENT(OUT) :: PERIODS(*) 617 INTEGER, INTENT(OUT) :: COORDS(*) 618 INTEGER, INTENT(OUT) :: IERROR 619 END SUBROUTINE MPI_CART_GET 620 621 SUBROUTINE MPI_CART_RANK(COMM, COORDS, RANK, IERROR) 622 INTEGER, INTENT(IN) :: COMM 623 INTEGER, INTENT(IN) :: COORDS(*) 624 INTEGER, INTENT(OUT) :: RANK 625 INTEGER, INTENT(OUT) :: IERROR 626 END SUBROUTINE MPI_CART_RANK 627 628 SUBROUTINE MPI_CART_COORDS( & 629 & COMM, RANK, MAXDIMS, COORDS, IERROR) 630 INTEGER, INTENT(IN) :: COMM 631 INTEGER, INTENT(IN) :: RANK 632 INTEGER, INTENT(IN) :: MAXDIMS 633 INTEGER, INTENT(OUT) :: COORDS(*) 634 INTEGER, INTENT(OUT) :: IERROR 635 END SUBROUTINE MPI_CART_COORDS 636 637 SUBROUTINE MPI_GRAPH_NEIGHBORS_COUNT( & 638 & COMM, RANK, NNEIGHBORS, IERROR) 639 INTEGER, INTENT(IN) :: COMM 640 INTEGER, INTENT(IN) :: RANK 641 INTEGER, INTENT(OUT) :: NNEIGHBORS 642 INTEGER, INTENT(OUT) :: IERROR 643 END SUBROUTINE MPI_GRAPH_NEIGHBORS_COUNT 644 645 SUBROUTINE MPI_GRAPH_NEIGHBORS( & 646 & COMM, RANK, MAXNEIGHBORS, NEIGHBORS, IERROR) 647 INTEGER, INTENT(IN) :: COMM 648 INTEGER, INTENT(IN) :: RANK 649 INTEGER, INTENT(IN) :: MAXNEIGHBORS 650 INTEGER, INTENT(OUT) :: NEIGHBORS(*) 651 INTEGER, INTENT(OUT) :: IERROR 652 END SUBROUTINE MPI_GRAPH_NEIGHBORS 653 654 SUBROUTINE MPI_CART_SHIFT( & 655 & COMM, DIRECTION, DISP, RANK_SOURCE, RANK_DEST, IERROR) 656 INTEGER, INTENT(IN) :: COMM 657 INTEGER, INTENT(IN) :: DIRECTION 658 INTEGER, INTENT(IN) :: DISP 659 INTEGER, INTENT(OUT) :: RANK_SOURCE 660 INTEGER, INTENT(OUT) :: RANK_DEST 661 INTEGER, INTENT(OUT) :: IERROR 662 END SUBROUTINE MPI_CART_SHIFT 663 664 SUBROUTINE MPI_CART_SUB(COMM, REMAIN_DIMS, NEWCOMM, IERROR) 665 INTEGER, INTENT(IN) :: COMM 666 LOGICAL, INTENT(IN) :: REMAIN_DIMS(*) 667 INTEGER, INTENT(OUT) :: NEWCOMM 668 INTEGER, INTENT(OUT) :: IERROR 669 END SUBROUTINE MPI_CART_SUB 670 671 SUBROUTINE MPI_CART_MAP( & 672 & COMM, NDIMS, DIMS, PERIODS, NEWRANK, IERROR) 673 INTEGER, INTENT(IN) :: COMM 674 INTEGER, INTENT(IN) :: NDIMS 675 INTEGER, INTENT(IN) :: DIMS(*) 676 LOGICAL, INTENT(IN) :: PERIODS(*) 677 INTEGER, INTENT(OUT) :: NEWRANK 678 INTEGER, INTENT(OUT) :: IERROR 679 END SUBROUTINE MPI_CART_MAP 680 681 SUBROUTINE MPI_GRAPH_MAP( & 682 & COMM, NNODES, INDEX, EDGES, NEWRANK, IERROR) 683 INTEGER, INTENT(IN) :: COMM 684 INTEGER, INTENT(IN) :: NNODES 685 INTEGER, INTENT(IN) :: INDEX(*) 686 INTEGER, INTENT(IN) :: EDGES(*) 687 INTEGER, INTENT(OUT) :: NEWRANK 688 INTEGER, INTENT(OUT) :: IERROR 689 END SUBROUTINE MPI_GRAPH_MAP 690 END INTERFACE 691 692! ... A.13 Fortran Bindings for Environmental Inquiry ... 693 694 INTERFACE 695 SUBROUTINE MPI_GET_PROCESSOR_NAME(NAME, RESULTLEN, IERROR) 696 CHARACTER*(*), INTENT(OUT) :: NAME 697 INTEGER, INTENT(OUT) :: RESULTLEN 698 INTEGER, INTENT(OUT) :: IERROR 699 END SUBROUTINE MPI_GET_PROCESSOR_NAME 700 701 SUBROUTINE MPI_ERRHANDLER_CREATE(FUNCTION, ERRHANDLER, IERROR) 702 EXTERNAL FUNCTION 703 INTEGER, INTENT(OUT) :: ERRHANDLER 704 INTEGER, INTENT(OUT) :: IERROR 705 END SUBROUTINE MPI_ERRHANDLER_CREATE 706 707 SUBROUTINE MPI_ERRHANDLER_SET(COMM, ERRHANDLER, IERROR) 708 INTEGER, INTENT(IN) :: COMM 709 INTEGER, INTENT(IN) :: ERRHANDLER 710 INTEGER, INTENT(OUT) :: IERROR 711 END SUBROUTINE MPI_ERRHANDLER_SET 712 713 SUBROUTINE MPI_ERRHANDLER_GET(COMM, ERRHANDLER, IERROR) 714 INTEGER, INTENT(IN) :: COMM 715 INTEGER, INTENT(OUT) :: ERRHANDLER 716 INTEGER, INTENT(OUT) :: IERROR 717 END SUBROUTINE MPI_ERRHANDLER_GET 718 719 SUBROUTINE MPI_ERRHANDLER_FREE(ERRHANDLER, IERROR) 720 INTEGER, INTENT(IN) :: ERRHANDLER ! bug? 721 INTEGER, INTENT(OUT) :: IERROR 722 END SUBROUTINE MPI_ERRHANDLER_FREE 723 724 SUBROUTINE MPI_ERROR_STRING( & 725 & ERRORCODE, STRING, RESULTLEN, IERROR) 726 INTEGER, INTENT(IN) :: ERRORCODE 727 CHARACTER*(*), INTENT(OUT) :: STRING 728 INTEGER, INTENT(OUT) :: RESULTLEN 729 INTEGER, INTENT(OUT) :: IERROR 730 END SUBROUTINE MPI_ERROR_STRING 731 732 SUBROUTINE MPI_ERROR_CLASS(ERRORCODE, ERRORCLASS, IERROR) 733 INTEGER, INTENT(IN) :: ERRORCODE 734 INTEGER, INTENT(OUT) :: ERRORCLASS 735 INTEGER, INTENT(OUT) :: IERROR 736 END SUBROUTINE MPI_ERROR_CLASS 737 738!!! AG: Removed WTIME and WTICK specifications. 739!!! They are both real*8 in all implementations 740!!! 741 SUBROUTINE MPI_INIT(IERROR) 742 INTEGER, INTENT(OUT) :: IERROR 743 END SUBROUTINE MPI_INIT 744 745 SUBROUTINE MPI_FINALIZE(IERROR) 746 INTEGER, INTENT(OUT) :: IERROR 747 END SUBROUTINE MPI_FINALIZE 748 749 SUBROUTINE MPI_INITIALIZED(FLAG, IERROR) 750 LOGICAL, INTENT(OUT) :: FLAG 751 INTEGER, INTENT(OUT) :: IERROR 752 END SUBROUTINE MPI_INITIALIZED 753 754 SUBROUTINE MPI_ABORT(COMM, ERRORCODE, IERROR) 755 INTEGER, INTENT(IN) :: COMM 756 INTEGER, INTENT(IN) :: ERRORCODE 757 INTEGER, INTENT(OUT) :: IERROR 758 END SUBROUTINE MPI_ABORT 759 END INTERFACE 760 761! ... A.14 Fortran Bindings for Profiling ... 762 763 INTERFACE 764 SUBROUTINE MPI_PCONTROL(LEVEL) 765 INTEGER, INTENT(IN) :: LEVEL 766! ... maybe more arguments ... 767 END SUBROUTINE MPI_PCONTROL 768 END INTERFACE 769 770 public 771 772 END MODULE MPI_INTERFACES 773