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