1!
2! Copyright (C) by Argonne National Laboratory
3!     See COPYRIGHT in top-level directory
4!
5       MODULE MPI_SIZEOFS
6!      This module contains the definitions for MPI_SIZEOF for the
7!      predefined, named types in Fortran 90.  This is provided
8!      as a separate module to allow MPI_SIZEOF to supply the
9!      basic size information even when we do not provide the
10!      arbitrary choice types
11       IMPLICIT NONE
12!
13       PUBLIC :: MPI_SIZEOF
14       INTERFACE MPI_SIZEOF
15           MODULE PROCEDURE MPI_SIZEOF_I, MPI_SIZEOF_R,                &
16     &                      MPI_SIZEOF_L, MPI_SIZEOF_CH, MPI_SIZEOF_CX,&
17     &           MPI_SIZEOF_IV, MPI_SIZEOF_RV,                         &
18     &           MPI_SIZEOF_LV, MPI_SIZEOF_CHV, MPI_SIZEOF_CXV
19@REQD@           MODULE PROCEDURE MPI_SIZEOF_D, MPI_SIZEOF_DV
20@REQI1@          MODULE PROCEDURE MPI_SIZEOF_I1, MPI_SIZEOF_I1V
21@REQI2@          MODULE PROCEDURE MPI_SIZEOF_I2, MPI_SIZEOF_I2V
22@REQI8@          MODULE PROCEDURE MPI_SIZEOF_I8, MPI_SIZEOF_I8V
23       END INTERFACE ! MPI_SIZEOF
24!
25       CONTAINS
26!
27       SUBROUTINE MPI_SIZEOF_I( X, SIZE, IERROR )
28       INTEGER X
29       INTEGER SIZE, IERROR
30       SIZE = @SIZEOF_FC_INTEGER@
31       IERROR = 0
32       END SUBROUTINE MPI_SIZEOF_I
33!
34       SUBROUTINE MPI_SIZEOF_R( X, SIZE, IERROR )
35       REAL X
36       INTEGER SIZE, IERROR
37       SIZE = @SIZEOF_FC_REAL@
38       IERROR = 0
39       END SUBROUTINE MPI_SIZEOF_R
40!
41! If reals and doubles have been forced to the same size (e.g., with
42! -i8 -r8 to compilers like g95), then the compiler may refuse to
43! allow interfaces that use real and double precision (failing to
44! determine which one is intended)
45@REQD@       SUBROUTINE MPI_SIZEOF_D( X, SIZE, IERROR )
46@REQD@       DOUBLE PRECISION X
47@REQD@       INTEGER SIZE, IERROR
48@REQD@       SIZE = @SIZEOF_FC_DOUBLE_PRECISION@
49@REQD@       IERROR = 0
50@REQD@       END SUBROUTINE MPI_SIZEOF_D
51!
52       SUBROUTINE MPI_SIZEOF_L( X, SIZE, IERROR )
53       LOGICAL X
54       INTEGER SIZE, IERROR
55       SIZE = @SIZEOF_FC_INTEGER@
56       IERROR = 0
57       END SUBROUTINE MPI_SIZEOF_L
58!
59       SUBROUTINE MPI_SIZEOF_CH( X, SIZE, IERROR )
60       CHARACTER X
61       INTEGER SIZE, IERROR
62       SIZE = @SIZEOF_FC_CHARACTER@
63       IERROR = 0
64       END SUBROUTINE MPI_SIZEOF_CH
65!
66       SUBROUTINE MPI_SIZEOF_CX( X, SIZE, IERROR )
67       COMPLEX X
68       INTEGER SIZE, IERROR
69       SIZE = 2*@SIZEOF_FC_REAL@
70       IERROR = 0
71       END SUBROUTINE MPI_SIZEOF_CX
72!
73       SUBROUTINE MPI_SIZEOF_IV( X, SIZE, IERROR )
74       INTEGER X(*)
75       INTEGER SIZE, IERROR
76       SIZE = @SIZEOF_FC_INTEGER@
77       IERROR = 0
78       END SUBROUTINE MPI_SIZEOF_IV
79!
80       SUBROUTINE MPI_SIZEOF_RV( X, SIZE, IERROR )
81       REAL X(*)
82       INTEGER SIZE, IERROR
83       SIZE = @SIZEOF_FC_REAL@
84       IERROR = 0
85       END SUBROUTINE MPI_SIZEOF_RV
86!
87! If reals and doubles have been forced to the same size (e.g., with
88! -i8 -r8 to compilers like g95), then the compiler may refuse to
89! allow interfaces that use real and double precision (failing to
90! determine which one is intended)
91@REQD@       SUBROUTINE MPI_SIZEOF_DV( X, SIZE, IERROR )
92@REQD@       DOUBLE PRECISION X(*)
93@REQD@       INTEGER SIZE, IERROR
94@REQD@       SIZE = @SIZEOF_FC_DOUBLE_PRECISION@
95@REQD@       IERROR = 0
96@REQD@       END SUBROUTINE MPI_SIZEOF_DV
97!
98       SUBROUTINE MPI_SIZEOF_LV( X, SIZE, IERROR )
99       LOGICAL X(*)
100       INTEGER SIZE, IERROR
101       SIZE = @SIZEOF_FC_INTEGER@
102       IERROR = 0
103       END SUBROUTINE MPI_SIZEOF_LV
104!
105       SUBROUTINE MPI_SIZEOF_CHV( X, SIZE, IERROR )
106       CHARACTER X(*)
107       INTEGER SIZE, IERROR
108       SIZE = @SIZEOF_FC_CHARACTER@
109       IERROR = 0
110       END SUBROUTINE MPI_SIZEOF_CHV
111!
112       SUBROUTINE MPI_SIZEOF_CXV( X, SIZE, IERROR )
113       COMPLEX X(*)
114       INTEGER SIZE, IERROR
115       SIZE = 2*@SIZEOF_FC_REAL@
116       IERROR = 0
117       END SUBROUTINE MPI_SIZEOF_CXV
118!
119! Support for the optional Integer*8 type
120! Note that we may want to replace this with code that handles
121! MPI_OFFSET_KIND or MPI_ADDRESS_KIND integers
122@REQI8@       SUBROUTINE MPI_SIZEOF_I8( X, SIZE, IERROR )
123@REQI8@       INTEGER*8 X
124@REQI8@       INTEGER SIZE, IERROR
125@REQI8@       SIZE = 8
126@REQI8@       IERROR = 0
127@REQI8@       END SUBROUTINE MPI_SIZEOF_I8
128@REQI8@       SUBROUTINE MPI_SIZEOF_I8V( X, SIZE, IERROR )
129@REQI8@       INTEGER*8 X(*)
130@REQI8@       INTEGER SIZE, IERROR
131@REQI8@       SIZE = 8
132@REQI8@       IERROR = 0
133@REQI8@       END SUBROUTINE MPI_SIZEOF_I8V
134!
135@REQI1@       SUBROUTINE MPI_SIZEOF_I1( X, SIZE, IERROR )
136@REQI1@       INTEGER*1 X
137@REQI1@       INTEGER SIZE, IERROR
138@REQI1@       SIZE = 1
139@REQI1@       IERROR = 0
140@REQI1@       END SUBROUTINE MPI_SIZEOF_I1
141@REQI1@       SUBROUTINE MPI_SIZEOF_I1V( X, SIZE, IERROR )
142@REQI1@       INTEGER*1 X(*)
143@REQI1@       INTEGER SIZE, IERROR
144@REQI1@       SIZE = 1
145@REQI1@       IERROR = 0
146@REQI1@       END SUBROUTINE MPI_SIZEOF_I1V
147!
148@REQI2@       SUBROUTINE MPI_SIZEOF_I2( X, SIZE, IERROR )
149@REQI2@       INTEGER*2 X
150@REQI2@       INTEGER SIZE, IERROR
151@REQI2@       SIZE = 2
152@REQI2@       IERROR = 0
153@REQI2@       END SUBROUTINE MPI_SIZEOF_I2
154@REQI2@       SUBROUTINE MPI_SIZEOF_I2V( X, SIZE, IERROR )
155@REQI2@       INTEGER*2 X(*)
156@REQI2@       INTEGER SIZE, IERROR
157@REQI2@       SIZE = 2
158@REQI2@       IERROR = 0
159@REQI2@       END SUBROUTINE MPI_SIZEOF_I2V
160!
161!
162! We don't include double complex.  If we did, we'd need to include the
163! same hack as for real and double above if the compiler has been forced
164! to make them the same size.
165       END MODULE MPI_SIZEOFS
166