1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #ifndef OMPI_FORTRAN_BASE_FINT_2_INT_H
24 #define OMPI_FORTRAN_BASE_FINT_2_INT_H
25
26 #include "ompi_config.h"
27
28 #include <stdlib.h>
29
30
31
32
33
34 #if OMPI_SIZEOF_FORTRAN_INTEGER == SIZEOF_INT
35 #define OMPI_ARRAY_NAME_DECL(a)
36 #define OMPI_2_DIM_ARRAY_NAME_DECL(a, dim2)
37 #define OMPI_SINGLE_NAME_DECL(a)
38 #define OMPI_ARRAY_NAME_CONVERT(a) a
39 #define OMPI_SINGLE_NAME_CONVERT(a) a
40 #define OMPI_INT_2_FINT(a) a
41 #define OMPI_FINT_2_INT(a) a
42 #define OMPI_PFINT_2_PINT(a) a
43 #define OMPI_ARRAY_FINT_2_INT_ALLOC(in, n)
44 #define OMPI_ARRAY_FINT_2_INT(in, n)
45 #define OMPI_2_DIM_ARRAY_FINT_2_INT(in, n, dim2)
46 #define OMPI_ARRAY_FINT_2_INT_CLEANUP(in)
47 #define OMPI_SINGLE_FINT_2_INT(in)
48 #define OMPI_SINGLE_INT_2_FINT(in)
49 #define OMPI_ARRAY_INT_2_FINT(in, n)
50
51 #elif OMPI_SIZEOF_FORTRAN_INTEGER > SIZEOF_INT
52 #define OMPI_ARRAY_NAME_DECL(a) int *c_##a
53 #define OMPI_2_DIM_ARRAY_NAME_DECL(a, dim2) int (*c_##a)[dim2], dim2_index
54 #define OMPI_SINGLE_NAME_DECL(a) int c_##a
55 #define OMPI_ARRAY_NAME_CONVERT(a) c_##a
56 #define OMPI_SINGLE_NAME_CONVERT(a) &c_##a
57 #define OMPI_INT_2_FINT(a) a
58 #define OMPI_FINT_2_INT(a) (int) (a)
59 #define OMPI_PFINT_2_PINT(a) (int *) (a)
60
61
62 #define OMPI_ARRAY_FINT_2_INT_ALLOC(in, n) \
63 OMPI_ARRAY_NAME_CONVERT(in) = malloc(n * sizeof(int))
64
65
66 #define OMPI_ARRAY_FINT_2_INT(in, n) \
67 do { \
68 int converted_n = (int)(n); \
69 OMPI_ARRAY_NAME_CONVERT(in) = malloc(converted_n * sizeof(int)); \
70 while(--converted_n >= 0) { \
71 OMPI_ARRAY_NAME_CONVERT(in)[converted_n] = (int) in[converted_n]; \
72 } \
73 } while (0)
74
75
76 #define OMPI_2_DIM_ARRAY_FINT_2_INT(in, n, dim2) \
77 do { \
78 int converted_n = (int)(n); \
79 OMPI_ARRAY_NAME_CONVERT(in) = (int (*)[dim2]) malloc(converted_n * sizeof(*OMPI_ARRAY_NAME_CONVERT(in))); \
80 while(--converted_n >= 0) { \
81 for(dim2_index = 0; dim2_index < dim2; ++dim2_index) { \
82 OMPI_ARRAY_NAME_CONVERT(in)[converted_n][dim2_index] = (int)in[converted_n][dim2_index]; \
83 } \
84 } \
85 } while (0)
86
87
88 #define OMPI_ARRAY_FINT_2_INT_CLEANUP(in) \
89 free(OMPI_ARRAY_NAME_CONVERT(in))
90
91
92 #define OMPI_SINGLE_FINT_2_INT(in) \
93 OMPI_ARRAY_NAME_CONVERT(in) = (int) *(in)
94
95
96 #define OMPI_SINGLE_INT_2_FINT(in) \
97 *(in) = OMPI_ARRAY_NAME_CONVERT(in)
98
99
100 #define OMPI_ARRAY_INT_2_FINT(in, n) \
101 do { \
102 int converted_n = (int)(n); \
103 while(--converted_n >= 0) { \
104 in[converted_n] = OMPI_ARRAY_NAME_CONVERT(in)[converted_n]; \
105 } \
106 free(OMPI_ARRAY_NAME_CONVERT(in)); \
107 } while (0)
108 #else
109 #define OMPI_ARRAY_NAME_DECL(a) int *c_##a
110 #define OMPI_2_DIM_ARRAY_NAME_DECL(a, dim2) int (*c_##a)[dim2], dim2_index
111 #define OMPI_SINGLE_NAME_DECL(a) int c_##a
112 #define OMPI_ARRAY_NAME_CONVERT(a) c_##a
113 #define OMPI_SINGLE_NAME_CONVERT(a) &c_##a
114 #define OMPI_INT_2_FINT(a) (MPI_Fint)(a)
115 #define OMPI_FINT_2_INT(a) (a)
116 #define OMPI_PFINT_2_PINT(a) a
117
118
119 #define OMPI_ARRAY_FINT_2_INT_ALLOC(in, n) \
120 OMPI_ARRAY_NAME_CONVERT(in) = malloc(n * sizeof(int))
121
122 #define OMPI_ARRAY_FINT_2_INT(in, n) \
123 do { \
124 int converted_n = (int)(n); \
125 OMPI_ARRAY_NAME_CONVERT(in) = malloc(converted_n * sizeof(int)); \
126 while(--converted_n >= 0) { \
127 OMPI_ARRAY_NAME_CONVERT(in)[converted_n] = in[converted_n]; \
128 } \
129 } while (0)
130
131 #define OMPI_2_DIM_ARRAY_FINT_2_INT(in, n, dim2) \
132 do { \
133 int converted_n = (int)(n); \
134 OMPI_ARRAY_NAME_CONVERT(in) = (int (*)[dim2]) malloc(converted_n * sizeof(*OMPI_ARRAY_NAME_CONVERT(in))); \
135 while(--converted_n >= 0) { \
136 for(dim2_index = 0; dim2_index < dim2; ++dim2_index) { \
137 OMPI_ARRAY_NAME_CONVERT(in)[converted_n][dim2_index] = in[converted_n][dim2_index]; \
138 } \
139 } \
140 } while (0)
141
142 #define OMPI_ARRAY_FINT_2_INT_CLEANUP(in) \
143 free(OMPI_ARRAY_NAME_CONVERT(in))
144
145 #define OMPI_SINGLE_FINT_2_INT(in) \
146 OMPI_ARRAY_NAME_CONVERT(in) = *(in)
147
148 #define OMPI_SINGLE_INT_2_FINT(in) \
149 *in = (MPI_Fint) OMPI_ARRAY_NAME_CONVERT(in)
150
151 #define OMPI_ARRAY_INT_2_FINT(in, n) \
152 do { \
153 int converted_n = (int)(n); \
154 while(--converted_n >= 0) { \
155 in[converted_n] = OMPI_ARRAY_NAME_CONVERT(in)[converted_n]; \
156 } \
157 free(OMPI_ARRAY_NAME_CONVERT(in)); \
158 } while (0)
159
160 #endif
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181 #if (OMPI_SIZEOF_FORTRAN_LOGICAL == SIZEOF_INT) && (OMPI_FORTRAN_VALUE_TRUE == 1)
182 # define OMPI_LOGICAL_NAME_DECL(in)
183 # define OMPI_LOGICAL_NAME_CONVERT(in) in
184 # define OMPI_LOGICAL_SINGLE_NAME_CONVERT(in) in
185 # define OMPI_LOGICAL_ARRAY_NAME_DECL(in)
186 # define OMPI_LOGICAL_ARRAY_NAME_CONVERT(in) in
187 # define OMPI_ARRAY_LOGICAL_2_INT_ALLOC(in,n)
188 # define OMPI_ARRAY_LOGICAL_2_INT_CLEANUP(in)
189
190 # define OMPI_FORTRAN_MUST_CONVERT_LOGICAL_2_INT 0
191 # define OMPI_LOGICAL_2_INT(a) a
192 # define OMPI_INT_2_LOGICAL(a) a
193 # define OMPI_ARRAY_LOGICAL_2_INT(in, n)
194 # define OMPI_ARRAY_INT_2_LOGICAL(in, n)
195 # define OMPI_SINGLE_INT_2_LOGICAL(a)
196 #else
197
198
199
200 # define OMPI_FORTRAN_MUST_CONVERT_LOGICAL_2_INT 1
201 # define OMPI_LOGICAL_NAME_DECL(in) int c_##in
202 # define OMPI_LOGICAL_NAME_CONVERT(in) c_##in
203 # define OMPI_LOGICAL_SINGLE_NAME_CONVERT(in) &c_##in
204 # define OMPI_LOGICAL_ARRAY_NAME_DECL(in) int * c_##in
205 # define OMPI_LOGICAL_ARRAY_NAME_CONVERT(in) c_##in
206 # define OMPI_ARRAY_LOGICAL_2_INT_ALLOC(in,n) \
207 OMPI_LOGICAL_ARRAY_NAME_CONVERT(in) = malloc(n * sizeof(int))
208 # define OMPI_ARRAY_LOGICAL_2_INT_CLEANUP(in) \
209 free(OMPI_LOGICAL_ARRAY_NAME_CONVERT(in))
210
211 # if OMPI_FORTRAN_VALUE_TRUE == 1
212 # define OMPI_LOGICAL_2_INT(a) (int)a
213 # define OMPI_INT_2_LOGICAL(a) (ompi_fortran_logical_t)a
214 # define OMPI_SINGLE_INT_2_LOGICAL(a) *a=(OMPI_INT_2_LOGICAL(OMPI_LOGICAL_NAME_CONVERT(a)))
215 # else
216 # define OMPI_LOGICAL_2_INT(a) ((a)==0? 0 : 1)
217 # define OMPI_INT_2_LOGICAL(a) ((a)==0? 0 : OMPI_FORTRAN_VALUE_TRUE)
218 # define OMPI_SINGLE_INT_2_LOGICAL(a) *a=(OMPI_INT_2_LOGICAL(OMPI_LOGICAL_NAME_CONVERT(a)))
219 # endif
220 # define OMPI_ARRAY_LOGICAL_2_INT(in, n) do { \
221 int converted_n = (int)(n); \
222 OMPI_ARRAY_LOGICAL_2_INT_ALLOC(in, converted_n + 1); \
223 while (--converted_n >= 0) { \
224 OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)[converted_n]=OMPI_LOGICAL_2_INT(in[converted_n]); \
225 } \
226 } while (0)
227 # define OMPI_ARRAY_INT_2_LOGICAL(in, n) do { \
228 int converted_n = (int)(n); \
229 while (--converted_n >= 0) { \
230 in[converted_n]=OMPI_INT_2_LOGICAL(OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)[converted_n]); \
231 } \
232 OMPI_ARRAY_LOGICAL_2_INT_CLEANUP(in); \
233 } while (0)
234 #endif
235
236
237 #endif