diff --git a/docs/man-openmpi/man3/MPI_Type_match_size.3.rst b/docs/man-openmpi/man3/MPI_Type_match_size.3.rst index 331e964678a..986225311f4 100644 --- a/docs/man-openmpi/man3/MPI_Type_match_size.3.rst +++ b/docs/man-openmpi/man3/MPI_Type_match_size.3.rst @@ -65,9 +65,9 @@ The function returns an MPI datatype matching a local variable of type (*typeclass*, *size*). The returned type is a reference (handle) to a predefined named datatype, not a duplicate. This type cannot be freed. -The value of *typeclass* may be set to one of MPI_TYPECLASS_REAL, -MPI_TYPECLASS_INTEGER, or MPI_TYPECLASS_COMPLEX, corresponding to the -desired datatype. +The value of *typeclass* may be set to one of MPI_TYPECLASS_LOGICAL, +MPI_TYPECLASS_INTEGER, MPI_TYPECLASS_REAL, or MPI_TYPECLASS_COMPLEX, +corresponding to the desired datatype. MPI_type_match_size can be used to obtain a size-specific type that matches a Fortran numeric intrinsic type: first call :ref:`MPI_Sizeof` to diff --git a/ompi/datatype/ompi_datatype.h b/ompi/datatype/ompi_datatype.h index 0c77079b916..193a1f259f9 100644 --- a/ompi/datatype/ompi_datatype.h +++ b/ompi/datatype/ompi_datatype.h @@ -49,6 +49,7 @@ BEGIN_C_DECLS #define OMPI_DATATYPE_FLAG_ANALYZED 0x0400 #define OMPI_DATATYPE_FLAG_MONOTONIC 0x0800 /* Keep trace of the type of the predefined datatypes */ +#define OMPI_DATATYPE_FLAG_DATA_BOOL 0x0000 /* TODO: what to do here? */ #define OMPI_DATATYPE_FLAG_DATA_INT 0x1000 #define OMPI_DATATYPE_FLAG_DATA_FLOAT 0x2000 #define OMPI_DATATYPE_FLAG_DATA_COMPLEX 0x3000 diff --git a/ompi/datatype/ompi_datatype_module.c b/ompi/datatype/ompi_datatype_module.c index d9627e66edd..50b60cd87d7 100644 --- a/ompi/datatype/ompi_datatype_module.c +++ b/ompi/datatype/ompi_datatype_module.c @@ -179,7 +179,7 @@ ompi_predefined_datatype_t ompi_mpi_complex32 = OMPI_DATATYPE_INIT_UNAVAILA /* * Fortran datatypes */ -ompi_predefined_datatype_t ompi_mpi_logical = OMPI_DATATYPE_INIT_PREDEFINED_BASIC_TYPE_FORTRAN (INT, LOGICAL, OMPI_SIZEOF_FORTRAN_LOGICAL, OMPI_ALIGNMENT_FORTRAN_LOGICAL, 0 ); +ompi_predefined_datatype_t ompi_mpi_logical = OMPI_DATATYPE_INIT_PREDEFINED_BASIC_TYPE_FORTRAN (INT, LOGICAL, OMPI_SIZEOF_FORTRAN_LOGICAL, OMPI_ALIGNMENT_FORTRAN_LOGICAL, OMPI_DATATYPE_FLAG_DATA_BOOL ); ompi_predefined_datatype_t ompi_mpi_character = OMPI_DATATYPE_INIT_PREDEFINED_BASIC_TYPE_FORTRAN (INT, CHARACTER, 1, OPAL_ALIGNMENT_CHAR, 0 ); ompi_predefined_datatype_t ompi_mpi_integer = OMPI_DATATYPE_INIT_PREDEFINED_BASIC_TYPE_FORTRAN (INT, INTEGER, OMPI_SIZEOF_FORTRAN_INTEGER, OMPI_ALIGNMENT_FORTRAN_INTEGER, OMPI_DATATYPE_FLAG_DATA_INT ); ompi_predefined_datatype_t ompi_mpi_real = OMPI_DATATYPE_INIT_PREDEFINED_BASIC_TYPE_FORTRAN (FLOAT, REAL, OMPI_SIZEOF_FORTRAN_REAL, OMPI_ALIGNMENT_FORTRAN_REAL, OMPI_DATATYPE_FLAG_DATA_FLOAT ); @@ -204,27 +204,27 @@ ompi_predefined_datatype_t ompi_mpi_2dblcplex = OMPI_DATATYPE_INIT_DEFER (2 /* For each of these we figure out, whether it is available -- otherwise it's set to unavailable */ #if OMPI_HAVE_FORTRAN_LOGICAL1 -ompi_predefined_datatype_t ompi_mpi_logical1 = OMPI_DATATYPE_INIT_PREDEFINED_BASIC_TYPE_FORTRAN (INT, LOGICAL1, OMPI_SIZEOF_FORTRAN_LOGICAL1, OMPI_ALIGNMENT_FORTRAN_LOGICAL1, 0); +ompi_predefined_datatype_t ompi_mpi_logical1 = OMPI_DATATYPE_INIT_PREDEFINED_BASIC_TYPE_FORTRAN (INT, LOGICAL1, OMPI_SIZEOF_FORTRAN_LOGICAL1, OMPI_ALIGNMENT_FORTRAN_LOGICAL1, OMPI_DATATYPE_FLAG_DATA_BOOL); #else ompi_predefined_datatype_t ompi_mpi_logical1 = OMPI_DATATYPE_INIT_UNAVAILABLE (LOGICAL1, OMPI_DATATYPE_FLAG_DATA_FORTRAN ); #endif #if OMPI_HAVE_FORTRAN_LOGICAL2 -ompi_predefined_datatype_t ompi_mpi_logical2 = OMPI_DATATYPE_INIT_PREDEFINED_BASIC_TYPE_FORTRAN (INT, LOGICAL2, OMPI_SIZEOF_FORTRAN_LOGICAL2, OMPI_ALIGNMENT_FORTRAN_LOGICAL2, 0); +ompi_predefined_datatype_t ompi_mpi_logical2 = OMPI_DATATYPE_INIT_PREDEFINED_BASIC_TYPE_FORTRAN (INT, LOGICAL2, OMPI_SIZEOF_FORTRAN_LOGICAL2, OMPI_ALIGNMENT_FORTRAN_LOGICAL2, OMPI_DATATYPE_FLAG_DATA_BOOL); #else ompi_predefined_datatype_t ompi_mpi_logical2 = OMPI_DATATYPE_INIT_UNAVAILABLE (LOGICAL2, OMPI_DATATYPE_FLAG_DATA_FORTRAN ); #endif #if OMPI_HAVE_FORTRAN_LOGICAL4 -ompi_predefined_datatype_t ompi_mpi_logical4 = OMPI_DATATYPE_INIT_PREDEFINED_BASIC_TYPE_FORTRAN (INT, LOGICAL4, OMPI_SIZEOF_FORTRAN_LOGICAL4, OMPI_ALIGNMENT_FORTRAN_LOGICAL4, 0); +ompi_predefined_datatype_t ompi_mpi_logical4 = OMPI_DATATYPE_INIT_PREDEFINED_BASIC_TYPE_FORTRAN (INT, LOGICAL4, OMPI_SIZEOF_FORTRAN_LOGICAL4, OMPI_ALIGNMENT_FORTRAN_LOGICAL4, OMPI_DATATYPE_FLAG_DATA_BOOL); #else ompi_predefined_datatype_t ompi_mpi_logical4 = OMPI_DATATYPE_INIT_UNAVAILABLE (LOGICAL4, OMPI_DATATYPE_FLAG_DATA_FORTRAN ); #endif #if OMPI_HAVE_FORTRAN_LOGICAL8 -ompi_predefined_datatype_t ompi_mpi_logical8 = OMPI_DATATYPE_INIT_PREDEFINED_BASIC_TYPE_FORTRAN (INT, LOGICAL8, OMPI_SIZEOF_FORTRAN_LOGICAL8, OMPI_ALIGNMENT_FORTRAN_LOGICAL8, 0); +ompi_predefined_datatype_t ompi_mpi_logical8 = OMPI_DATATYPE_INIT_PREDEFINED_BASIC_TYPE_FORTRAN (INT, LOGICAL8, OMPI_SIZEOF_FORTRAN_LOGICAL8, OMPI_ALIGNMENT_FORTRAN_LOGICAL8, OMPI_DATATYPE_FLAG_DATA_BOOL); #else ompi_predefined_datatype_t ompi_mpi_logical8 = OMPI_DATATYPE_INIT_UNAVAILABLE (LOGICAL8, OMPI_DATATYPE_FLAG_DATA_FORTRAN ); #endif #if OMPI_HAVE_FORTRAN_LOGICAL16 -ompi_predefined_datatype_t ompi_mpi_logical16 = OMPI_DATATYPE_INIT_PREDEFINED_BASIC_TYPE_FORTRAN (INT, LOGICAL16, OMPI_SIZEOF_FORTRAN_LOGICAL16, OMPI_ALIGNMENT_FORTRAN_LOGICAL16, 0); +ompi_predefined_datatype_t ompi_mpi_logical16 = OMPI_DATATYPE_INIT_PREDEFINED_BASIC_TYPE_FORTRAN (INT, LOGICAL16, OMPI_SIZEOF_FORTRAN_LOGICAL16, OMPI_ALIGNMENT_FORTRAN_LOGICAL16, OMPI_DATATYPE_FLAG_DATA_BOOL); #else ompi_predefined_datatype_t ompi_mpi_logical16 = OMPI_DATATYPE_INIT_UNAVAILABLE (LOGICAL16, OMPI_DATATYPE_FLAG_DATA_FORTRAN ); #endif diff --git a/ompi/include/mpi.h.in b/ompi/include/mpi.h.in index 47a66ef1ba9..be336bb26ce 100644 --- a/ompi/include/mpi.h.in +++ b/ompi/include/mpi.h.in @@ -1381,6 +1381,7 @@ OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_ub; #define MPI_TYPECLASS_INTEGER 1 #define MPI_TYPECLASS_REAL 2 #define MPI_TYPECLASS_COMPLEX 3 +#define MPI_TYPECLASS_LOGICAL 4 /* Aint helper macros (MPI-3.1) */ #define MPI_Aint_add(base, disp) ((MPI_Aint) ((char *) (base) + (disp))) diff --git a/ompi/include/mpif-values.pl b/ompi/include/mpif-values.pl index 4abf78ed062..277ee3135ce 100755 --- a/ompi/include/mpif-values.pl +++ b/ompi/include/mpif-values.pl @@ -287,6 +287,7 @@ sub read_value_from_file { $constants->{MPI_TYPECLASS_INTEGER} = 1; $constants->{MPI_TYPECLASS_REAL} = 2; $constants->{MPI_TYPECLASS_COMPLEX} = 3; +$constants->{MPI_TYPECLASS_LOGICAL} = 4; $constants->{MPI_MODE_NOCHECK} = 1; $constants->{MPI_MODE_NOPRECEDE} = 2; $constants->{MPI_MODE_NOPUT} = 4; diff --git a/ompi/mpi/c/type_match_size.c b/ompi/mpi/c/type_match_size.c index d34f4825960..efcc3ee80fb 100644 --- a/ompi/mpi/c/type_match_size.c +++ b/ompi/mpi/c/type_match_size.c @@ -54,6 +54,9 @@ int MPI_Type_match_size(int typeclass, int size, MPI_Datatype *type) case MPI_TYPECLASS_COMPLEX: *type = (MPI_Datatype)ompi_datatype_match_size( size, OMPI_DATATYPE_FLAG_DATA_COMPLEX, OMPI_DATATYPE_FLAG_DATA_FORTRAN ); break; + case MPI_TYPECLASS_LOGICAL: + *type = (MPI_Datatype)ompi_datatype_match_size( size, OMPI_DATATYPE_FLAG_DATA_BOOL, OMPI_DATATYPE_FLAG_DATA_FORTRAN ); + break; default: *type = &ompi_mpi_datatype_null.dt; } diff --git a/ompi/mpi/fortran/mpif-h/type_match_size_f.c b/ompi/mpi/fortran/mpif-h/type_match_size_f.c index e6b6b3388e7..4ac620c3a3a 100644 --- a/ompi/mpi/fortran/mpif-h/type_match_size_f.c +++ b/ompi/mpi/fortran/mpif-h/type_match_size_f.c @@ -97,6 +97,9 @@ void ompi_type_match_size_f(MPI_Fint *typeclass, MPI_Fint *size, MPI_Fint *type, case MPI_TYPECLASS_COMPLEX: c_type = (MPI_Datatype)ompi_datatype_match_size( c_size, OMPI_DATATYPE_FLAG_DATA_COMPLEX, OMPI_DATATYPE_FLAG_DATA_FORTRAN ); break; + case MPI_TYPECLASS_LOGICAL: + c_type = (MPI_Datatype)ompi_datatype_match_size( c_size, OMPI_DATATYPE_FLAG_DATA_BOOL, OMPI_DATATYPE_FLAG_DATA_FORTRAN ); + break; default: c_type = &ompi_mpi_datatype_null.dt; }