1
1
openmpi/ompi/mpi/f77/fint_2_int.h
Rainer Keller bf0892bb32 - Implement correct Fortran Logical-handling in f77/f90 interface in
case of:
    sizeof(MPI_Flogical) != sizeof (int)
  and
    Fortran value of .TRUE. != 1
  as is often the case.
- Check in configure the value of .TRUE., the C-type coresponding to
  logical and check, that fortran compiler does not do something strange
  with arrays of logicals
- Convert all occurrences of logicals in the fortran wrappers, only
  in case it is needed.
  *Please note* Implementation of MPI_Cart_sub needed special treatment.
- Output these value in ompi_info -a
- Clean up the prototypes_mpi.h to just have a single definition and
  thereby deleting the necessity for prototypes_pmpi.h

- configured, compiled and tested with F90-program, which uses
  MPI_Cart_create and MPI_Cart_get:
  linux ia32, gcc (no testing, as no f90)
  linux ia32, gcc --disable-mpi-f77 --disable-mpi-f90 (had a bug there)
  linux ia32, icc-8.1
  linux opteron, gcc-3.3.5, pgcc, pathccx/pathf90 (tested just
pgi-compiler)
  linux em64t, gcc, icc-8.1 (tested just icc)

This commit was SVN r8254.
2005-11-24 16:52:35 +00:00

231 строка
8.4 KiB
C

/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#ifndef OMPI_FINT_2_INT_H
#define OMPI_FINT_2_INT_H
#include "ompi_config.h"
#include <stdlib.h>
/*
* Define MACROS to take account of different size of MPI_Fint from int
*/
#if OMPI_SIZEOF_FORTRAN_INTEGER == SIZEOF_INT
#define OMPI_ARRAY_NAME_DECL(a)
#define OMPI_2_DIM_ARRAY_NAME_DECL(a, dim2)
#define OMPI_SINGLE_NAME_DECL(a)
#define OMPI_ARRAY_NAME_CONVERT(a) a
#define OMPI_SINGLE_NAME_CONVERT(a) a
#define OMPI_INT_2_FINT(a) a
#define OMPI_FINT_2_INT(a) a
#define OMPI_ARRAY_FINT_2_INT_ALLOC(in, n)
#define OMPI_ARRAY_FINT_2_INT(in, n)
#define OMPI_2_DIM_ARRAY_FINT_2_INT(in, n, dim2)
#define OMPI_ARRAY_FINT_2_INT_CLEANUP(in)
#define OMPI_SINGLE_FINT_2_INT(in)
#define OMPI_SINGLE_INT_2_FINT(in)
#define OMPI_ARRAY_INT_2_FINT(in, n)
#elif OMPI_SIZEOF_FORTRAN_INTEGER > SIZEOF_INT
#define OMPI_ARRAY_NAME_DECL(a) int *c_##a
#define OMPI_2_DIM_ARRAY_NAME_DECL(a, dim2) int (*c_##a)[dim2], dim2_index
#define OMPI_SINGLE_NAME_DECL(a) int c_##a
#define OMPI_ARRAY_NAME_CONVERT(a) c_##a
#define OMPI_SINGLE_NAME_CONVERT(a) &c_##a
#define OMPI_INT_2_FINT(a) a
#define OMPI_FINT_2_INT(a) (int) (a)
/* This is for OUT parameters. Does only alloc */
#define OMPI_ARRAY_FINT_2_INT_ALLOC(in, n) \
OMPI_ARRAY_NAME_CONVERT(in) = malloc(n * sizeof(int))
/* This is for IN/IN-OUT parameters. Does alloc and assignment */
#define OMPI_ARRAY_FINT_2_INT(in, n) \
OMPI_ARRAY_NAME_CONVERT(in) = malloc(n * sizeof(int)); \
while(n > 0) { \
OMPI_ARRAY_NAME_CONVERT(in)[n - 1] = (int) in[n - 1]; \
--n; \
}
/* This is for 2-dim arrays */
#define OMPI_2_DIM_ARRAY_FINT_2_INT(in, n, dim2) \
OMPI_ARRAY_NAME_CONVERT(in) = (int (*)[dim2]) malloc(n * sizeof(*OMPI_ARRAY_NAME_CONVERT(in))); \
while(n > 0) { \
for(dim2_index = 0; dim2_index < dim2; ++dim2_index) { \
OMPI_ARRAY_NAME_CONVERT(in)[n - 1][dim2_index] = (int)in[n - 1][dim2_index]; \
} \
--n; \
}
/* This is for IN parameters. Does only free */
#define OMPI_ARRAY_FINT_2_INT_CLEANUP(in) \
free(OMPI_ARRAY_NAME_CONVERT(in))
/* This is for single IN parameter */
#define OMPI_SINGLE_FINT_2_INT(in) \
OMPI_ARRAY_NAME_CONVERT(in) = (int) *(in)
/* This is for single OUT parameter */
#define OMPI_SINGLE_INT_2_FINT(in) \
*(in) = OMPI_ARRAY_NAME_CONVERT(in)
/* This is for OUT/IN-OUT parametes. Does back assignment and free */
#define OMPI_ARRAY_INT_2_FINT(in, n) \
while(n > 0) {\
in[n - 1] = OMPI_ARRAY_NAME_CONVERT(in)[n - 1]; \
--n; \
} \
free(OMPI_ARRAY_NAME_CONVERT(in))
#else /* int > MPI_Fint */
#define OMPI_ARRAY_NAME_DECL(a) int *c_##a
#define OMPI_2_DIM_ARRAY_NAME_DECL(a, dim2) int (*c_##a)[dim2], dim2_index
#define OMPI_SINGLE_NAME_DECL(a) int c_##a
#define OMPI_ARRAY_NAME_CONVERT(a) c_##a
#define OMPI_SINGLE_NAME_CONVERT(a) &c_##a
#define OMPI_INT_2_FINT(a) (MPI_Fint)(a)
#define OMPI_FINT_2_INT(a) (a)
/* This is for OUT parameters. Does only alloc */
#define OMPI_ARRAY_FINT_2_INT_ALLOC(in, n) \
OMPI_ARRAY_NAME_CONVERT(in) = malloc(n * sizeof(int))
#define OMPI_ARRAY_FINT_2_INT(in, n) \
OMPI_ARRAY_NAME_CONVERT(in) = malloc(n * sizeof(int)); \
while(n > 0) { \
OMPI_ARRAY_NAME_CONVERT(in)[n - 1] = in[n - 1]; \
--n; \
}
#define OMPI_2_DIM_ARRAY_FINT_2_INT(in, n, dim2) \
OMPI_ARRAY_NAME_CONVERT(in) = (int (*)[dim2]) malloc(n * sizeof(*OMPI_ARRAY_NAME_CONVERT(in))); \
while(n > 0) { \
for(dim2_index = 0; dim2_index < dim2; ++dim2_index) { \
OMPI_ARRAY_NAME_CONVERT(in)[n - 1][dim2_index] = in[n - 1][dim2_index]; \
} \
--n; \
}
#define OMPI_ARRAY_FINT_2_INT_CLEANUP(in) \
free(OMPI_ARRAY_NAME_CONVERT(in))
#define OMPI_SINGLE_FINT_2_INT(in) \
OMPI_ARRAY_NAME_CONVERT(in) = *(in)
#define OMPI_SINGLE_INT_2_FINT(in) \
*in = (MPI_Fint) OMPI_ARRAY_NAME_CONVERT(in)
#define OMPI_ARRAY_INT_2_FINT(in, n) \
while(n > 0) {\
in[n - 1] = (MPI_Fint) OMPI_ARRAY_NAME_CONVERT(in)[n - 1]; \
--n; \
} \
free(OMPI_ARRAY_NAME_CONVERT(in))
#endif
/*
* Define MACROS to take account of different size of logical from int
*/
#if OMPI_SIZEOF_FORTRAN_LOGICAL == SIZEOF_INT
# define OMPI_LOGICAL_NAME_DECL(in) /* Not needed for int==logical */
# define OMPI_LOGICAL_NAME_CONVERT(in) in /* Not needed for int==logical */
# define OMPI_LOGICAL_SINGLE_NAME_CONVERT(in) in /* Not needed for int==logical */
# define OMPI_LOGICAL_ARRAY_NAME_DECL(in) /* Not needed for int==logical */
# define OMPI_LOGICAL_ARRAY_NAME_CONVERT(in) in /* Not needed for int==logical */
# define OMPI_ARRAY_LOGICAL_2_INT_ALLOC(in,n) /* Not needed for int==logical */
# define OMPI_ARRAY_LOGICAL_2_INT_CLEANUP(in) /* Not needed for int==logical */
# if OMPI_FORTRAN_VALUE_TRUE == 1
# define OMPI_FORTRAN_MUST_CONVERT_LOGICAL_2_INT 0
# define OMPI_LOGICAL_2_INT(a) a
# define OMPI_INT_2_LOGICAL(a) a
# define OMPI_ARRAY_LOGICAL_2_INT(in, n)
# define OMPI_ARRAY_INT_2_LOGICAL(in, n)
# define OMPI_SINGLE_INT_2_LOGICAL(a) /* Single-OUT variable -- Not needed for int==logical, true=1 */
# else
# define OMPI_FORTRAN_MUST_CONVERT_LOGICAL_2_INT 1
# define OMPI_LOGICAL_2_INT(a) ((a)==0? 0 : 1)
# define OMPI_INT_2_LOGICAL(a) ((a)==0? 0 : OMPI_FORTRAN_VALUE_TRUE)
# define OMPI_SINGLE_INT_2_LOGICAL(a) *a=OMPI_INT_2_LOGICAL(OMPI_LOGICAL_NAME_CONVERT(*a))
# define OMPI_ARRAY_LOGICAL_2_INT(in, n) do { \
int __n = (n); \
OMPI_ARRAY_LOGICAL_2_INT_ALLOC(in, __n); \
while (__n > 0) { \
OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)[__n]=OMPI_LOGICAL_2_INT(in[__n]); \
__n--; \
} \
} while (0)
# define OMPI_ARRAY_INT_2_LOGICAL(in, n) do { \
int __n = (n); \
while (__n > 0) { \
in[__n]=OMPI_INT_2_LOGICAL(OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)[__n]); \
__n--; \
} \
} while (0) \
/* free(OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)) * No Need to free, here */
# endif
#else
/*
* For anything other than Fortran-logical == C-int, we have to convert
*/
# define OMPI_FORTRAN_MUST_CONVERT_LOGICAL_2_INT 1
# define OMPI_LOGICAL_NAME_DECL(in) int c_##in
# define OMPI_LOGICAL_NAME_CONVERT(in) c_##in
# define OMPI_LOGICAL_SINGLE_NAME_CONVERT(in) &c_##in
# define OMPI_LOGICAL_ARRAY_NAME_DECL(in) int * c_##in
# define OMPI_LOGICAL_ARRAY_NAME_CONVERT(in) c_##in
# define OMPI_ARRAY_LOGICAL_2_INT_ALLOC(in,n) \
OMPI_LOGICAL_ARRAY_NAME_CONVERT(in) = malloc(n * sizeof(int))
# define OMPI_ARRAY_LOGICAL_2_INT_CLEANUP(in) \
free(OMPI_LOGICAL_ARRAY_NAME_CONVERT(in))
# if OMPI_FORTRAN_VALUE_TRUE == 1
# define OMPI_LOGICAL_2_INT(a) (int)a
# define OMPI_INT_2_LOGICAL(a) (MPI_Flogical)a
# define OMPI_SINGLE_INT_2_LOGICAL(a) *a=(OMPI_INT_2_LOGICAL(OMPI_LOGICAL_NAME_CONVERT(a)))
# else
# define OMPI_LOGICAL_2_INT(a) ((a)==0? 0 : 1)
# define OMPI_INT_2_LOGICAL(a) ((a)==0? 0 : OMPI_FORTRAN_VALUE_TRUE)
# define OMPI_SINGLE_INT_2_LOGICAL(a) *a=(OMPI_INT_2_LOGICAL(OMPI_LOGICAL_NAME_CONVERT(a)))
# endif
# define OMPI_ARRAY_LOGICAL_2_INT(in, n) do { \
int __n = (n); \
OMPI_ARRAY_LOGICAL_2_INT_ALLOC(in, __n); \
while (__n > 0) { \
OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)[__n]=OMPI_LOGICAL_2_INT(in[__n]); \
__n--; \
} \
} while (0)
# define OMPI_ARRAY_INT_2_LOGICAL(in, n) do { \
int __n = (n); \
while (__n > 0) { \
in[__n]=OMPI_INT_2_LOGICAL(OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)[__n]); \
__n--; \
} \
} while (0) \
/* free(OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)) * No Need to free, here */
#endif /* OMPI_SIZEOF_FORTRAN_LOGICAL */
#endif /* OMPI_FINT_2_INT_H */