2
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
3
* University Research and Technology
4
* Corporation. All rights reserved.
5
* Copyright (c) 2004-2005 The University of Tennessee and The University
6
* of Tennessee Research Foundation. All rights
8
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
9
* University of Stuttgart. All rights reserved.
10
* Copyright (c) 2004-2005 The Regents of the University of California.
11
* All rights reserved.
14
* Additional copyrights may follow
19
#ifndef OMPI_FINT_2_INT_H
20
#define OMPI_FINT_2_INT_H
22
#include "ompi_config.h"
27
* Define MACROS to take account of different size of MPI_Fint from int
30
#if OMPI_SIZEOF_FORTRAN_INTEGER == SIZEOF_INT
31
#define OMPI_ARRAY_NAME_DECL(a)
32
#define OMPI_2_DIM_ARRAY_NAME_DECL(a, dim2)
33
#define OMPI_SINGLE_NAME_DECL(a)
34
#define OMPI_ARRAY_NAME_CONVERT(a) a
35
#define OMPI_SINGLE_NAME_CONVERT(a) a
36
#define OMPI_INT_2_FINT(a) a
37
#define OMPI_FINT_2_INT(a) a
38
#define OMPI_ARRAY_FINT_2_INT_ALLOC(in, n)
39
#define OMPI_ARRAY_FINT_2_INT(in, n)
40
#define OMPI_2_DIM_ARRAY_FINT_2_INT(in, n, dim2)
41
#define OMPI_ARRAY_FINT_2_INT_CLEANUP(in)
42
#define OMPI_SINGLE_FINT_2_INT(in)
43
#define OMPI_SINGLE_INT_2_FINT(in)
44
#define OMPI_ARRAY_INT_2_FINT(in, n)
46
#elif OMPI_SIZEOF_FORTRAN_INTEGER > SIZEOF_INT
47
#define OMPI_ARRAY_NAME_DECL(a) int *c_##a
48
#define OMPI_2_DIM_ARRAY_NAME_DECL(a, dim2) int (*c_##a)[dim2], dim2_index
49
#define OMPI_SINGLE_NAME_DECL(a) int c_##a
50
#define OMPI_ARRAY_NAME_CONVERT(a) c_##a
51
#define OMPI_SINGLE_NAME_CONVERT(a) &c_##a
52
#define OMPI_INT_2_FINT(a) a
53
#define OMPI_FINT_2_INT(a) (int) (a)
55
/* This is for OUT parameters. Does only alloc */
56
#define OMPI_ARRAY_FINT_2_INT_ALLOC(in, n) \
57
OMPI_ARRAY_NAME_CONVERT(in) = malloc(n * sizeof(int))
59
/* This is for IN/IN-OUT parameters. Does alloc and assignment */
60
#define OMPI_ARRAY_FINT_2_INT(in, n) \
61
OMPI_ARRAY_NAME_CONVERT(in) = malloc(n * sizeof(int)); \
63
OMPI_ARRAY_NAME_CONVERT(in)[n - 1] = (int) in[n - 1]; \
67
/* This is for 2-dim arrays */
68
#define OMPI_2_DIM_ARRAY_FINT_2_INT(in, n, dim2) \
69
OMPI_ARRAY_NAME_CONVERT(in) = (int (*)[dim2]) malloc(n * sizeof(*OMPI_ARRAY_NAME_CONVERT(in))); \
71
for(dim2_index = 0; dim2_index < dim2; ++dim2_index) { \
72
OMPI_ARRAY_NAME_CONVERT(in)[n - 1][dim2_index] = (int)in[n - 1][dim2_index]; \
77
/* This is for IN parameters. Does only free */
78
#define OMPI_ARRAY_FINT_2_INT_CLEANUP(in) \
79
free(OMPI_ARRAY_NAME_CONVERT(in))
81
/* This is for single IN parameter */
82
#define OMPI_SINGLE_FINT_2_INT(in) \
83
OMPI_ARRAY_NAME_CONVERT(in) = (int) *(in)
85
/* This is for single OUT parameter */
86
#define OMPI_SINGLE_INT_2_FINT(in) \
87
*(in) = OMPI_ARRAY_NAME_CONVERT(in)
89
/* This is for OUT/IN-OUT parametes. Does back assignment and free */
90
#define OMPI_ARRAY_INT_2_FINT(in, n) \
92
in[n - 1] = OMPI_ARRAY_NAME_CONVERT(in)[n - 1]; \
95
free(OMPI_ARRAY_NAME_CONVERT(in))
97
#else /* int > MPI_Fint */
98
#define OMPI_ARRAY_NAME_DECL(a) int *c_##a
99
#define OMPI_2_DIM_ARRAY_NAME_DECL(a, dim2) int (*c_##a)[dim2], dim2_index
100
#define OMPI_SINGLE_NAME_DECL(a) int c_##a
101
#define OMPI_ARRAY_NAME_CONVERT(a) c_##a
102
#define OMPI_SINGLE_NAME_CONVERT(a) &c_##a
103
#define OMPI_INT_2_FINT(a) (MPI_Fint)(a)
104
#define OMPI_FINT_2_INT(a) (a)
106
/* This is for OUT parameters. Does only alloc */
107
#define OMPI_ARRAY_FINT_2_INT_ALLOC(in, n) \
108
OMPI_ARRAY_NAME_CONVERT(in) = malloc(n * sizeof(int))
110
#define OMPI_ARRAY_FINT_2_INT(in, n) \
111
OMPI_ARRAY_NAME_CONVERT(in) = malloc(n * sizeof(int)); \
113
OMPI_ARRAY_NAME_CONVERT(in)[n - 1] = in[n - 1]; \
117
#define OMPI_2_DIM_ARRAY_FINT_2_INT(in, n, dim2) \
118
OMPI_ARRAY_NAME_CONVERT(in) = (int (*)[dim2]) malloc(n * sizeof(*OMPI_ARRAY_NAME_CONVERT(in))); \
120
for(dim2_index = 0; dim2_index < dim2; ++dim2_index) { \
121
OMPI_ARRAY_NAME_CONVERT(in)[n - 1][dim2_index] = in[n - 1][dim2_index]; \
126
#define OMPI_ARRAY_FINT_2_INT_CLEANUP(in) \
127
free(OMPI_ARRAY_NAME_CONVERT(in))
129
#define OMPI_SINGLE_FINT_2_INT(in) \
130
OMPI_ARRAY_NAME_CONVERT(in) = *(in)
132
#define OMPI_SINGLE_INT_2_FINT(in) \
133
*in = (MPI_Fint) OMPI_ARRAY_NAME_CONVERT(in)
135
#define OMPI_ARRAY_INT_2_FINT(in, n) \
137
in[n - 1] = (MPI_Fint) OMPI_ARRAY_NAME_CONVERT(in)[n - 1]; \
140
free(OMPI_ARRAY_NAME_CONVERT(in))
145
* Define MACROS to take account of different size of logical from int
148
#if OMPI_SIZEOF_FORTRAN_LOGICAL == SIZEOF_INT
149
# define OMPI_LOGICAL_NAME_DECL(in) /* Not needed for int==logical */
150
# define OMPI_LOGICAL_NAME_CONVERT(in) in /* Not needed for int==logical */
151
# define OMPI_LOGICAL_SINGLE_NAME_CONVERT(in) in /* Not needed for int==logical */
152
# define OMPI_LOGICAL_ARRAY_NAME_DECL(in) /* Not needed for int==logical */
153
# define OMPI_LOGICAL_ARRAY_NAME_CONVERT(in) in /* Not needed for int==logical */
154
# define OMPI_ARRAY_LOGICAL_2_INT_ALLOC(in,n) /* Not needed for int==logical */
155
# define OMPI_ARRAY_LOGICAL_2_INT_CLEANUP(in) /* Not needed for int==logical */
157
# if OMPI_FORTRAN_VALUE_TRUE == 1
158
# define OMPI_FORTRAN_MUST_CONVERT_LOGICAL_2_INT 0
159
# define OMPI_LOGICAL_2_INT(a) a
160
# define OMPI_INT_2_LOGICAL(a) a
161
# define OMPI_ARRAY_LOGICAL_2_INT(in, n)
162
# define OMPI_ARRAY_INT_2_LOGICAL(in, n)
163
# define OMPI_SINGLE_INT_2_LOGICAL(a) /* Single-OUT variable -- Not needed for int==logical, true=1 */
165
# define OMPI_FORTRAN_MUST_CONVERT_LOGICAL_2_INT 1
166
# define OMPI_LOGICAL_2_INT(a) ((a)==0? 0 : 1)
167
# define OMPI_INT_2_LOGICAL(a) ((a)==0? 0 : OMPI_FORTRAN_VALUE_TRUE)
168
# define OMPI_SINGLE_INT_2_LOGICAL(a) *a=OMPI_INT_2_LOGICAL(OMPI_LOGICAL_NAME_CONVERT(*a))
169
# define OMPI_ARRAY_LOGICAL_2_INT(in, n) do { \
171
OMPI_ARRAY_LOGICAL_2_INT_ALLOC(in, __n); \
173
OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)[__n]=OMPI_LOGICAL_2_INT(in[__n]); \
177
# define OMPI_ARRAY_INT_2_LOGICAL(in, n) do { \
180
in[__n]=OMPI_INT_2_LOGICAL(OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)[__n]); \
184
/* free(OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)) * No Need to free, here */
189
* For anything other than Fortran-logical == C-int, we have to convert
191
# define OMPI_FORTRAN_MUST_CONVERT_LOGICAL_2_INT 1
192
# define OMPI_LOGICAL_NAME_DECL(in) int c_##in
193
# define OMPI_LOGICAL_NAME_CONVERT(in) c_##in
194
# define OMPI_LOGICAL_SINGLE_NAME_CONVERT(in) &c_##in
195
# define OMPI_LOGICAL_ARRAY_NAME_DECL(in) int * c_##in
196
# define OMPI_LOGICAL_ARRAY_NAME_CONVERT(in) c_##in
197
# define OMPI_ARRAY_LOGICAL_2_INT_ALLOC(in,n) \
198
OMPI_LOGICAL_ARRAY_NAME_CONVERT(in) = malloc(n * sizeof(int))
199
# define OMPI_ARRAY_LOGICAL_2_INT_CLEANUP(in) \
200
free(OMPI_LOGICAL_ARRAY_NAME_CONVERT(in))
202
# if OMPI_FORTRAN_VALUE_TRUE == 1
203
# define OMPI_LOGICAL_2_INT(a) (int)a
204
# define OMPI_INT_2_LOGICAL(a) (MPI_Flogical)a
205
# define OMPI_SINGLE_INT_2_LOGICAL(a) *a=(OMPI_INT_2_LOGICAL(OMPI_LOGICAL_NAME_CONVERT(a)))
207
# define OMPI_LOGICAL_2_INT(a) ((a)==0? 0 : 1)
208
# define OMPI_INT_2_LOGICAL(a) ((a)==0? 0 : OMPI_FORTRAN_VALUE_TRUE)
209
# define OMPI_SINGLE_INT_2_LOGICAL(a) *a=(OMPI_INT_2_LOGICAL(OMPI_LOGICAL_NAME_CONVERT(a)))
211
# define OMPI_ARRAY_LOGICAL_2_INT(in, n) do { \
213
OMPI_ARRAY_LOGICAL_2_INT_ALLOC(in, __n); \
215
OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)[__n]=OMPI_LOGICAL_2_INT(in[__n]); \
219
# define OMPI_ARRAY_INT_2_LOGICAL(in, n) do { \
222
in[__n]=OMPI_INT_2_LOGICAL(OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)[__n]); \
226
/* free(OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)) * No Need to free, here */
227
#endif /* OMPI_SIZEOF_FORTRAN_LOGICAL */
230
#endif /* OMPI_FINT_2_INT_H */