Blame test/mpi/dtpools/src/dtpools_internal.c

Packit Service c5cf8c
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
Packit Service c5cf8c
/*
Packit Service c5cf8c
 *
Packit Service c5cf8c
 *  (C) 2018 by Argonne National Laboratory.
Packit Service c5cf8c
 *      See COPYRIGHT in top-level directory.
Packit Service c5cf8c
 */
Packit Service c5cf8c
Packit Service c5cf8c
#include <sys/types.h>
Packit Service c5cf8c
#include <stdint.h>
Packit Service c5cf8c
#include "dtpools_internal.h"
Packit Service c5cf8c
#include "dtpoolsconf.h"
Packit Service c5cf8c
Packit Service c5cf8c
#define TYPE_NAME_MAXLEN (256)
Packit Service c5cf8c
#define BASIC_TYPE_NAME_MAXLEN (64)
Packit Service c5cf8c
Packit Service c5cf8c
#define DTPI_OBJ_INIT_BUF(c_type, type_ptr)                                  \
Packit Service c5cf8c
    do {                                                                     \
Packit Service c5cf8c
        type_ptr = (c_type *) buf_ptr;                                       \
Packit Service c5cf8c
        k = par->user.val_start;                                             \
Packit Service c5cf8c
        for (i = 0; i < par->core.type_totlen; i += par->core.type_stride) { \
Packit Service c5cf8c
            for (j = 0; j < par->core.type_blklen; j++) {                    \
Packit Service c5cf8c
                type_ptr[i+j] = (c_type) k;                                  \
Packit Service c5cf8c
                k += par->user.val_stride;                                   \
Packit Service c5cf8c
                if (--count == 0) {                                          \
Packit Service c5cf8c
                    return;                                                  \
Packit Service c5cf8c
                }                                                            \
Packit Service c5cf8c
            }                                                                \
Packit Service c5cf8c
        }                                                                    \
Packit Service c5cf8c
    } while (0)
Packit Service c5cf8c
Packit Service c5cf8c
#define DTPI_OBJ_INIT_COMP_BUF(c_type, a_type, b_type, type_ptr)             \
Packit Service c5cf8c
    do {                                                                     \
Packit Service c5cf8c
        type_ptr = (c_type *) buf_ptr;                                       \
Packit Service c5cf8c
        k = par->user.val_start;                                             \
Packit Service c5cf8c
        for (i = 0; i < par->core.type_totlen; i += par->core.type_stride) { \
Packit Service c5cf8c
            for (j = 0; j < par->core.type_blklen; j++) {                    \
Packit Service c5cf8c
                type_ptr[i+j].a = (a_type) k;                                \
Packit Service c5cf8c
                type_ptr[i+j].b = (b_type) k;                                \
Packit Service c5cf8c
                k += par->user.val_stride;                                   \
Packit Service c5cf8c
                if (--count == 0) {                                          \
Packit Service c5cf8c
                    return;                                                  \
Packit Service c5cf8c
                }                                                            \
Packit Service c5cf8c
            }                                                                \
Packit Service c5cf8c
        }                                                                    \
Packit Service c5cf8c
    } while (0)
Packit Service c5cf8c
Packit Service c5cf8c
#define DTPI_OBJ_CHECK_BUF_AND_JUMP(c_type, type_ptr)                        \
Packit Service c5cf8c
    do {                                                                     \
Packit Service c5cf8c
        type_ptr = (c_type *) buf_ptr;                                       \
Packit Service c5cf8c
        k = par->user.val_start;                                             \
Packit Service c5cf8c
        for (i = 0; i < par->core.type_totlen; i += par->core.type_stride) { \
Packit Service c5cf8c
            for (j = 0; j < par->core.type_blklen; j++) {                    \
Packit Service c5cf8c
                if (type_ptr[i+j] != (c_type) k) {                           \
Packit Service c5cf8c
                    FPRINTF(stdout, "recv buf[%d]=%d != %d\n",               \
Packit Service c5cf8c
                            i+j, (int) type_ptr[i+j], k);                    \
Packit Service c5cf8c
                    goto fn_fail;                                            \
Packit Service c5cf8c
                }                                                            \
Packit Service c5cf8c
                k += par->user.val_stride;                                   \
Packit Service c5cf8c
                if (--count == 0) {                                          \
Packit Service c5cf8c
                    goto fn_exit;                                            \
Packit Service c5cf8c
                }                                                            \
Packit Service c5cf8c
            }                                                                \
Packit Service c5cf8c
        }                                                                    \
Packit Service c5cf8c
    } while (0)
Packit Service c5cf8c
Packit Service c5cf8c
#define DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(c_type, a_type, b_type, type_ptr)   \
Packit Service c5cf8c
    do {                                                                     \
Packit Service c5cf8c
        type_ptr = (c_type *) buf_ptr;                                       \
Packit Service c5cf8c
        k = par->user.val_start;                                             \
Packit Service c5cf8c
        for (i = 0; i < par->core.type_totlen; i += par->core.type_stride) { \
Packit Service c5cf8c
            for (j = 0; j < par->core.type_blklen; j++) {                    \
Packit Service c5cf8c
                if (type_ptr[i+j].a != (a_type) k ||                         \
Packit Service c5cf8c
                    type_ptr[i+j].b != (b_type) k) {                         \
Packit Service c5cf8c
                    FPRINTF(stdout, "recv buf[%d].{a=%d,b=%d} != %d\n", i+j, \
Packit Service c5cf8c
                            (int) type_ptr[i+j].a, (int) type_ptr[i+j].b, k);\
Packit Service c5cf8c
                    goto fn_fail;                                            \
Packit Service c5cf8c
                }                                                            \
Packit Service c5cf8c
                k += par->user.val_stride;                                   \
Packit Service c5cf8c
                if (--count == 0) {                                          \
Packit Service c5cf8c
                    goto fn_exit;                                            \
Packit Service c5cf8c
                }                                                            \
Packit Service c5cf8c
            }                                                                \
Packit Service c5cf8c
        }                                                                    \
Packit Service c5cf8c
    } while (0)
Packit Service c5cf8c
Packit Service c5cf8c
/*
Packit Service c5cf8c
 * Composite types
Packit Service c5cf8c
 */
Packit Service c5cf8c
typedef struct {
Packit Service c5cf8c
    float a;
Packit Service c5cf8c
    float b;
Packit Service c5cf8c
} dtp_c_complex;
Packit Service c5cf8c
Packit Service c5cf8c
typedef dtp_c_complex dtp_c_float_complex;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct {
Packit Service c5cf8c
    double a;
Packit Service c5cf8c
    double b;
Packit Service c5cf8c
} dtp_c_double_complex;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct {
Packit Service c5cf8c
    long double a;
Packit Service c5cf8c
    long double b;
Packit Service c5cf8c
} dtp_c_long_double_complex;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct {
Packit Service c5cf8c
    float a;
Packit Service c5cf8c
    int b;
Packit Service c5cf8c
} dtp_float_int;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct {
Packit Service c5cf8c
    double a;
Packit Service c5cf8c
    int b;
Packit Service c5cf8c
} dtp_double_int;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct {
Packit Service c5cf8c
    long a;
Packit Service c5cf8c
    int b;
Packit Service c5cf8c
} dtp_long_int;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct {
Packit Service c5cf8c
    int a;
Packit Service c5cf8c
    int b;
Packit Service c5cf8c
} dtp_2int;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct {
Packit Service c5cf8c
    short a;
Packit Service c5cf8c
    int b;
Packit Service c5cf8c
} dtp_short_int;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct {
Packit Service c5cf8c
    long double a;
Packit Service c5cf8c
    int b;
Packit Service c5cf8c
} dtp_long_double_int;
Packit Service c5cf8c
Packit Service c5cf8c
/*
Packit Service c5cf8c
 * Casting pointers
Packit Service c5cf8c
 */
Packit Service c5cf8c
union DTPI_Cast_ptr {
Packit Service c5cf8c
    char *char_ptr;
Packit Service c5cf8c
    wchar_t *wchar_ptr;
Packit Service c5cf8c
    short int *short_ptr;
Packit Service c5cf8c
    int *int_ptr;
Packit Service c5cf8c
    long int *long_ptr;
Packit Service c5cf8c
    long long int *long_long_ptr;
Packit Service c5cf8c
    unsigned char *uchar_ptr;
Packit Service c5cf8c
    unsigned short int *ushort_ptr;
Packit Service c5cf8c
    unsigned int *uint_ptr;
Packit Service c5cf8c
    unsigned long int *ulong_ptr;
Packit Service c5cf8c
    unsigned long long int *ulong_long_ptr;
Packit Service c5cf8c
    float *float_ptr;
Packit Service c5cf8c
    double *double_ptr;
Packit Service c5cf8c
    long double *long_double_ptr;
Packit Service c5cf8c
    int8_t *int8_ptr;
Packit Service c5cf8c
    int16_t *int16_ptr;
Packit Service c5cf8c
    int32_t *int32_ptr;
Packit Service c5cf8c
    int64_t *int64_ptr;
Packit Service c5cf8c
    uint8_t *uint8_ptr;
Packit Service c5cf8c
    uint16_t *uint16_ptr;
Packit Service c5cf8c
    uint32_t *uint32_ptr;
Packit Service c5cf8c
    uint64_t *uint64_ptr;
Packit Service c5cf8c
    /* composite types */
Packit Service c5cf8c
    dtp_c_complex *c_complex_ptr;
Packit Service c5cf8c
    dtp_c_float_complex *c_float_complex_ptr;
Packit Service c5cf8c
    dtp_c_double_complex *c_double_complex_ptr;
Packit Service c5cf8c
    dtp_c_long_double_complex *c_long_double_complex_ptr;
Packit Service c5cf8c
    dtp_float_int *float_int_ptr;
Packit Service c5cf8c
    dtp_double_int *double_int_ptr;
Packit Service c5cf8c
    dtp_long_int *long_int_ptr;
Packit Service c5cf8c
    dtp_2int *int_int_ptr;
Packit Service c5cf8c
    dtp_short_int *short_int_ptr;
Packit Service c5cf8c
    dtp_long_double_int *long_double_int_ptr;
Packit Service c5cf8c
    /* TODO: add remaining types */
Packit Service c5cf8c
};
Packit Service c5cf8c
Packit Service c5cf8c
/* --------------------------------------------------------- */
Packit Service c5cf8c
/* Utility Functions                                         */
Packit Service c5cf8c
/* --------------------------------------------------------- */
Packit Service c5cf8c
Packit Service c5cf8c
void DTPI_Print_error(int errcode)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int errclass, slen;
Packit Service c5cf8c
    char string[ERR_STRING_MAX_LEN];
Packit Service c5cf8c
Packit Service c5cf8c
    MPI_Error_class(errcode, &errclass);
Packit Service c5cf8c
    MPI_Error_string(errcode, string, &slen);
Packit Service c5cf8c
Packit Service c5cf8c
    fprintf(stdout, "Error class %d (%s)\n", errclass, string);
Packit Service c5cf8c
    fflush(stdout);
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
void DTPI_Init_creators(DTPI_Creator * creators)
Packit Service c5cf8c
{
Packit Service c5cf8c
    memset(creators, 0, sizeof(*creators));
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_SIMPLE__BASIC] = DTPI_Basic_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_SIMPLE__CONTIG] = DTPI_Contig_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_SIMPLE__VECTOR] = DTPI_Vector_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_SIMPLE__HVECTOR] = DTPI_Hvector_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_SIMPLE__INDEXED] = DTPI_Indexed_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_SIMPLE__HINDEXED] = DTPI_Hindexed_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_SIMPLE__BLOCK_INDEXED] = DTPI_Block_indexed_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_SIMPLE__BLOCK_HINDEXED] = DTPI_Block_hindexed_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_BLK__VECTOR] = DTPI_Vector_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_BLK__HVECTOR] = DTPI_Hvector_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_BLK__INDEXED] = DTPI_Indexed_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_BLK__HINDEXED] = DTPI_Hindexed_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_BLK__BLOCK_INDEXED] = DTPI_Block_indexed_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_BLK__BLOCK_HINDEXED] = DTPI_Block_hindexed_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_BLK__SUBARRAY_C] = DTPI_Subarray_c_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_BLK__SUBARRAY_F] = DTPI_Subarray_f_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_CNT__VECTOR] = DTPI_Vector_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_CNT__HVECTOR] = DTPI_Hvector_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_CNT__INDEXED] = DTPI_Indexed_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_CNT__HINDEXED] = DTPI_Hindexed_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_CNT__BLOCK_INDEXED] = DTPI_Block_indexed_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_CNT__BLOCK_HINDEXED] = DTPI_Block_hindexed_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_CNT__SUBARRAY_C] = DTPI_Subarray_c_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_CNT__SUBARRAY_F] = DTPI_Subarray_f_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_BLK_STRD__VECTOR] = DTPI_Vector_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_BLK_STRD__HVECTOR] = DTPI_Hvector_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_BLK_STRD__INDEXED] = DTPI_Indexed_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_BLK_STRD__HINDEXED] = DTPI_Hindexed_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_BLK_STRD__BLOCK_INDEXED] = DTPI_Block_indexed_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_BLK_STRD__BLOCK_HINDEXED] = DTPI_Block_hindexed_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_BLK_STRD__SUBARRAY_C] = DTPI_Subarray_c_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_BLK_STRD__SUBARRAY_F] = DTPI_Subarray_f_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_CNT_STRD__VECTOR] = DTPI_Vector_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_CNT_STRD__HVECTOR] = DTPI_Hvector_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_CNT_STRD__INDEXED] = DTPI_Indexed_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_CNT_STRD__HINDEXED] = DTPI_Hindexed_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_CNT_STRD__BLOCK_INDEXED] = DTPI_Block_indexed_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_CNT_STRD__BLOCK_HINDEXED] = DTPI_Block_hindexed_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_CNT_STRD__SUBARRAY_C] = DTPI_Subarray_c_create;
Packit Service c5cf8c
    creators[DTPI_OBJ_LAYOUT_LARGE_CNT_STRD__SUBARRAY_F] = DTPI_Subarray_f_create;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
static void DTPI_Type_init_buf(struct DTPI_Par *par, MPI_Datatype basic_type, void *buf)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int i, j, k;
Packit Service c5cf8c
    int count;
Packit Service c5cf8c
    char *buf_ptr;
Packit Service c5cf8c
    union DTPI_Cast_ptr ptrs;
Packit Service c5cf8c
Packit Service c5cf8c
    FPRINTF(stdout, "init type_displ=%li\n", par->core.type_displ);
Packit Service c5cf8c
    FPRINTF(stdout, "init type_totlen=%li\n", par->core.type_totlen);
Packit Service c5cf8c
    FPRINTF(stdout, "init type_stride=%li\n", par->core.type_stride);
Packit Service c5cf8c
    FPRINTF(stdout, "init type_blklen=%li\n", par->core.type_blklen);
Packit Service c5cf8c
    FPRINTF(stdout, "init user count=%d\n", par->user.val_count);
Packit Service c5cf8c
Packit Service c5cf8c
    if (par->user.val_count <= 0) {
Packit Service c5cf8c
        return;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    count = par->user.val_count;
Packit Service c5cf8c
Packit Service c5cf8c
    buf_ptr = (char *) buf + par->core.type_displ;
Packit Service c5cf8c
    if (basic_type == MPI_CHAR || basic_type == MPI_BYTE) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(char, ptrs.char_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_WCHAR) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(wchar_t, ptrs.wchar_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_SHORT) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(short int, ptrs.short_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_INT) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(int, ptrs.int_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_LONG) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(long int, ptrs.long_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_LONG_LONG_INT) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(long long int, ptrs.long_long_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_UNSIGNED_CHAR) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(unsigned char, ptrs.uchar_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_UNSIGNED_SHORT) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(unsigned short int, ptrs.ushort_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_UNSIGNED) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(unsigned int, ptrs.uint_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_UNSIGNED_LONG) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(unsigned long int, ptrs.ulong_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_UNSIGNED_LONG_LONG) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(unsigned long long int, ptrs.ulong_long_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_FLOAT) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(float, ptrs.float_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_DOUBLE) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(double, ptrs.double_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_LONG_DOUBLE) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(long double, ptrs.long_double_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_INT8_T) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(int8_t, ptrs.int8_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_INT16_T) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(int16_t, ptrs.int16_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_INT32_T) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(int32_t, ptrs.int32_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_INT64_T) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(int64_t, ptrs.int64_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_UINT8_T) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(uint8_t, ptrs.uint8_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_UINT16_T) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(uint16_t, ptrs.uint16_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_UINT32_T) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(uint32_t, ptrs.uint32_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_UINT64_T) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_BUF(uint64_t, ptrs.uint64_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_C_COMPLEX) {   /* composite types */
Packit Service c5cf8c
        DTPI_OBJ_INIT_COMP_BUF(dtp_c_complex, float, float, ptrs.c_complex_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_C_FLOAT_COMPLEX) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_COMP_BUF(dtp_c_float_complex, float, float, ptrs.c_float_complex_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_C_DOUBLE_COMPLEX) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_COMP_BUF(dtp_c_double_complex, double, double, ptrs.c_double_complex_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_C_LONG_DOUBLE_COMPLEX) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_COMP_BUF(dtp_c_long_double_complex, long double, long double,
Packit Service c5cf8c
                               ptrs.c_long_double_complex_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_FLOAT_INT) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_COMP_BUF(dtp_float_int, float, int, ptrs.float_int_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_DOUBLE_INT) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_COMP_BUF(dtp_double_int, double, int, ptrs.double_int_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_LONG_INT) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_COMP_BUF(dtp_long_int, long, int, ptrs.long_int_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_2INT) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_COMP_BUF(dtp_2int, int, int, ptrs.int_int_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_SHORT_INT) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_COMP_BUF(dtp_short_int, short, int, ptrs.short_int_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_LONG_DOUBLE_INT) {
Packit Service c5cf8c
        DTPI_OBJ_INIT_COMP_BUF(dtp_long_double_int, long double, int, ptrs.long_double_int_ptr);
Packit Service c5cf8c
    }
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
static int DTPI_Type_check_buf(struct DTPI_Par *par, MPI_Datatype basic_type, void *buf)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int i, j, k, err = DTP_SUCCESS;
Packit Service c5cf8c
    int count;
Packit Service c5cf8c
    char *buf_ptr;
Packit Service c5cf8c
    union DTPI_Cast_ptr ptrs;
Packit Service c5cf8c
Packit Service c5cf8c
    FPRINTF(stdout, "check type_displ=%li\n", par->core.type_displ);
Packit Service c5cf8c
    FPRINTF(stdout, "check type_totlen=%li\n", par->core.type_totlen);
Packit Service c5cf8c
    FPRINTF(stdout, "check type_stride=%li\n", par->core.type_stride);
Packit Service c5cf8c
    FPRINTF(stdout, "check type_blklen=%li\n", par->core.type_blklen);
Packit Service c5cf8c
    FPRINTF(stdout, "check user count=%d\n", par->user.val_count);
Packit Service c5cf8c
Packit Service c5cf8c
    count = par->user.val_count;
Packit Service c5cf8c
Packit Service c5cf8c
    buf_ptr = (char *) buf + par->core.type_displ;
Packit Service c5cf8c
    if (basic_type == MPI_CHAR || basic_type == MPI_BYTE) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(char, ptrs.char_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_WCHAR) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(wchar_t, ptrs.wchar_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_SHORT) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(short int, ptrs.short_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_INT) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(int, ptrs.int_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_LONG) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(long int, ptrs.long_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_LONG_LONG_INT) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(long long int, ptrs.long_long_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_UNSIGNED_CHAR) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(unsigned char, ptrs.uchar_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_UNSIGNED_SHORT) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(unsigned short int, ptrs.ushort_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_UNSIGNED) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(unsigned int, ptrs.uint_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_UNSIGNED_LONG) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(unsigned long int, ptrs.ulong_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_UNSIGNED_LONG_LONG) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(unsigned long long int, ptrs.ulong_long_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_FLOAT) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(float, ptrs.float_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_DOUBLE) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(double, ptrs.double_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_LONG_DOUBLE) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(long double, ptrs.long_double_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_INT8_T) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(int8_t, ptrs.int8_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_INT16_T) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(int16_t, ptrs.int16_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_INT32_T) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(int32_t, ptrs.int32_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_INT64_T) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(int64_t, ptrs.int64_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_UINT8_T) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(uint8_t, ptrs.uint8_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_UINT16_T) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(uint16_t, ptrs.uint16_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_UINT32_T) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(uint32_t, ptrs.uint32_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_UINT64_T) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_BUF_AND_JUMP(uint64_t, ptrs.uint64_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_C_COMPLEX) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(dtp_c_complex, float, float, ptrs.c_complex_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_C_FLOAT_COMPLEX) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(dtp_c_float_complex, float, float,
Packit Service c5cf8c
                                         ptrs.c_float_complex_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_C_DOUBLE_COMPLEX) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(dtp_c_double_complex, double, double,
Packit Service c5cf8c
                                         ptrs.c_double_complex_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_C_LONG_DOUBLE_COMPLEX) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(dtp_c_long_double_complex, long double, long double,
Packit Service c5cf8c
                                         ptrs.c_long_double_complex_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_FLOAT_INT) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(dtp_float_int, float, int, ptrs.float_int_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_DOUBLE_INT) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(dtp_double_int, double, int, ptrs.double_int_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_LONG_INT) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(dtp_long_int, long, int, ptrs.long_int_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_2INT) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(dtp_2int, int, int, ptrs.int_int_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_SHORT_INT) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(dtp_short_int, short, int, ptrs.short_int_ptr);
Packit Service c5cf8c
    } else if (basic_type == MPI_LONG_DOUBLE_INT) {
Packit Service c5cf8c
        DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(dtp_long_double_int, long double, int,
Packit Service c5cf8c
                                         ptrs.long_double_int_ptr);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
  fn_exit:
Packit Service c5cf8c
    return err;
Packit Service c5cf8c
Packit Service c5cf8c
  fn_fail:
Packit Service c5cf8c
    err = DTP_ERR_OTHER;
Packit Service c5cf8c
    goto fn_exit;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
/* --------------------------------------------------------- */
Packit Service c5cf8c
/* Datatype Pool Object Create Functions                     */
Packit Service c5cf8c
/* --------------------------------------------------------- */
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Struct_create(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int i;
Packit Service c5cf8c
    int err = DTP_SUCCESS;
Packit Service c5cf8c
    int num_types = 0;
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    int *basic_type_counts;
Packit Service c5cf8c
    MPI_Aint *basic_type_sizes = NULL;
Packit Service c5cf8c
    MPI_Aint lb, extent;
Packit Service c5cf8c
    MPI_Aint displs = 0;
Packit Service c5cf8c
    MPI_Aint *basic_type_displs = NULL;
Packit Service c5cf8c
    MPI_Datatype *basic_types;
Packit Service c5cf8c
    void *buf = NULL;
Packit Service c5cf8c
    DTPI_t *dtpi = NULL;
Packit Service c5cf8c
    char type_name[TYPE_NAME_MAXLEN] = { 0 };
Packit Service c5cf8c
Packit Service c5cf8c
    /* get object index */
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
Packit Service c5cf8c
    num_types = dtp->DTP_type_signature.DTP_pool_struct.DTP_num_types;
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(basic_type_sizes, sizeof(*basic_type_sizes) * num_types);
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(basic_type_displs, sizeof(*basic_type_displs) * num_types);
Packit Service c5cf8c
Packit Service c5cf8c
    /* compute struct size */
Packit Service c5cf8c
    basic_types = dtp->DTP_type_signature.DTP_pool_struct.DTP_basic_type;
Packit Service c5cf8c
    basic_type_counts = dtp->DTP_type_signature.DTP_pool_struct.DTP_basic_type_count;
Packit Service c5cf8c
    for (i = 0; i < num_types; i++) {
Packit Service c5cf8c
        err = MPI_Type_get_extent(basic_types[i], &lb, &basic_type_sizes[i]);
Packit Service c5cf8c
        if (err) {
Packit Service c5cf8c
            DTPI_Print_error(err);
Packit Service c5cf8c
            goto fn_fail;
Packit Service c5cf8c
        }
Packit Service c5cf8c
        basic_type_displs[i] = displs;
Packit Service c5cf8c
        displs += (basic_type_sizes[i] * basic_type_counts[i]);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* create struct datatype */
Packit Service c5cf8c
    err =
Packit Service c5cf8c
        MPI_Type_create_struct(num_types, basic_type_counts, basic_type_displs, basic_types,
Packit Service c5cf8c
                               &dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_commit(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_count = 1;
Packit Service c5cf8c
Packit Service c5cf8c
    /* get type extent */
Packit Service c5cf8c
    err = MPI_Type_get_extent(dtp->DTP_obj_array[obj_idx].DTP_obj_type, &lb, &extent);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate buffer */
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(buf, lb + extent);
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize every elem in struct separately */
Packit Service c5cf8c
    for (i = 0; i < num_types; i++) {
Packit Service c5cf8c
        /* user count is ignored */
Packit Service c5cf8c
        par->user.val_count = basic_type_counts[i];
Packit Service c5cf8c
Packit Service c5cf8c
        /* contiguous arrays */
Packit Service c5cf8c
        par->core.type_stride = 1;
Packit Service c5cf8c
        par->core.type_blklen = 1;
Packit Service c5cf8c
        par->core.type_totlen = (MPI_Aint) basic_type_counts[i];
Packit Service c5cf8c
        par->core.type_displ = basic_type_displs[i];
Packit Service c5cf8c
        DTPI_Type_init_buf(par, basic_types[i], buf);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate space for private datatype info */
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize private datatype info data */
Packit Service c5cf8c
    dtpi->obj_type = DTPI_OBJ_TYPE__STRUCT;
Packit Service c5cf8c
    dtpi->type_extent = extent;
Packit Service c5cf8c
    dtpi->type_lb = lb;
Packit Service c5cf8c
    dtpi->type_ub = lb + extent;
Packit Service c5cf8c
    dtpi->u.structure.displs = basic_type_displs;       /* freed in DTP_obj_free() */
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].private_info = dtpi;
Packit Service c5cf8c
Packit Service c5cf8c
    /* set type name for debug information */
Packit Service c5cf8c
    memset(type_name, 0, sizeof(type_name));
Packit Service c5cf8c
    sprintf(type_name, "%s (%d elements)", "struct", num_types);
Packit Service c5cf8c
    err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
  fn_exit:
Packit Service c5cf8c
    if (basic_type_sizes) {
Packit Service c5cf8c
        free(basic_type_sizes);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    return err;
Packit Service c5cf8c
Packit Service c5cf8c
  fn_fail:
Packit Service c5cf8c
    /* cleanup datatype */
Packit Service c5cf8c
    if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
Packit Service c5cf8c
        MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* cleanup buffers */
Packit Service c5cf8c
    if (basic_type_displs) {
Packit Service c5cf8c
        free(basic_type_displs);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    if (dtpi) {
Packit Service c5cf8c
        free(dtpi);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    if (buf) {
Packit Service c5cf8c
        free(buf);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    goto fn_exit;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Basic_create(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int err = DTP_SUCCESS;
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    int len;
Packit Service c5cf8c
    MPI_Aint lb, basic_type_size, basic_type_count;
Packit Service c5cf8c
    MPI_Datatype basic_type;
Packit Service c5cf8c
    void *buf = NULL;
Packit Service c5cf8c
    DTPI_t *dtpi = NULL;
Packit Service c5cf8c
    char type_name[TYPE_NAME_MAXLEN] = { 0 };
Packit Service c5cf8c
    char basic_type_name[BASIC_TYPE_NAME_MAXLEN] = { 0 };
Packit Service c5cf8c
Packit Service c5cf8c
    /* get type signature for pool */
Packit Service c5cf8c
    basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
Packit Service c5cf8c
    basic_type_count = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type_count;
Packit Service c5cf8c
Packit Service c5cf8c
    /* get object index in the pool */
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_get_extent(basic_type, &lb, &basic_type_size);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* make a copy of the basic datatype passed by the user */
Packit Service c5cf8c
    err = MPI_Type_dup(basic_type, &dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_count = basic_type_count;
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate buffer */
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(buf, basic_type_size * basic_type_count);
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize totlen and displ for buf init */
Packit Service c5cf8c
    par->core.type_totlen = basic_type_count;
Packit Service c5cf8c
    par->core.type_displ = 0;
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize buffer with requested DTPI_Par */
Packit Service c5cf8c
    DTPI_Type_init_buf(par, basic_type, buf);
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate space for private datatype info */
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize private datatype info data */
Packit Service c5cf8c
    dtpi->obj_type = DTPI_OBJ_TYPE__BASIC;
Packit Service c5cf8c
    dtpi->type_basic_size = basic_type_size;
Packit Service c5cf8c
    dtpi->type_extent = basic_type_size;
Packit Service c5cf8c
    dtpi->type_lb = 0;
Packit Service c5cf8c
    dtpi->type_ub = basic_type_size;
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].private_info = dtpi;
Packit Service c5cf8c
Packit Service c5cf8c
    /* set type name for debug information */
Packit Service c5cf8c
    err = MPI_Type_get_name(basic_type, basic_type_name, &len;;
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    sprintf(type_name, "%s (%s basic_type %li count)", "basic", basic_type_name, basic_type_count);
Packit Service c5cf8c
    err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
  fn_exit:
Packit Service c5cf8c
    return err;
Packit Service c5cf8c
Packit Service c5cf8c
  fn_fail:
Packit Service c5cf8c
    /* cleanup datatype */
Packit Service c5cf8c
    if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
Packit Service c5cf8c
        MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* cleanup buffers */
Packit Service c5cf8c
    if (dtpi) {
Packit Service c5cf8c
        free(dtpi);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    if (buf) {
Packit Service c5cf8c
        free(buf);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    goto fn_exit;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Contig_create(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int err = DTP_SUCCESS;
Packit Service c5cf8c
    int len;
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    MPI_Aint basic_type_count;
Packit Service c5cf8c
    MPI_Aint lb, extent, basic_type_size;
Packit Service c5cf8c
    MPI_Datatype basic_type;
Packit Service c5cf8c
    void *buf = NULL;
Packit Service c5cf8c
    DTPI_t *dtpi = NULL;
Packit Service c5cf8c
    char type_name[TYPE_NAME_MAXLEN] = { 0 };
Packit Service c5cf8c
    char basic_type_name[BASIC_TYPE_NAME_MAXLEN] = { 0 };
Packit Service c5cf8c
Packit Service c5cf8c
    /* get type signature for pool */
Packit Service c5cf8c
    basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
Packit Service c5cf8c
    basic_type_count = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type_count;
Packit Service c5cf8c
Packit Service c5cf8c
    /* get object index in the pool */
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_get_extent(basic_type, &lb, &basic_type_size);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* create contiguous datatype */
Packit Service c5cf8c
    err = MPI_Type_contiguous(basic_type_count, basic_type,
Packit Service c5cf8c
                              &dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_commit(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_count = 1;
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_get_extent(dtp->DTP_obj_array[obj_idx].DTP_obj_type, &lb, &extent);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate buffer */
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(buf, lb + extent);
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize totlen and displ for buf init */
Packit Service c5cf8c
    /* NOTE: rounding to ceiling is needed for composed types */
Packit Service c5cf8c
    par->core.type_totlen = (extent + basic_type_size - 1) / basic_type_size;
Packit Service c5cf8c
    par->core.type_displ = 0;
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize buffer with requested DTPI_Par */
Packit Service c5cf8c
    DTPI_Type_init_buf(par, basic_type, buf);
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate space for private datatype info */
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize private datatype info data */
Packit Service c5cf8c
    dtpi->obj_type = DTPI_OBJ_TYPE__CONTIG;
Packit Service c5cf8c
    dtpi->type_basic_size = basic_type_size;
Packit Service c5cf8c
    dtpi->type_extent = extent;
Packit Service c5cf8c
    dtpi->type_lb = lb;
Packit Service c5cf8c
    dtpi->type_ub = lb + extent;
Packit Service c5cf8c
    dtpi->u.contig.stride = par->core.type_stride;
Packit Service c5cf8c
    dtpi->u.contig.blklen = par->core.type_blklen;
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].private_info = dtpi;
Packit Service c5cf8c
Packit Service c5cf8c
    /* set type name for debug information */
Packit Service c5cf8c
    err = MPI_Type_get_name(basic_type, basic_type_name, &len;;
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    sprintf(type_name, "%s (%s basic_type %li count)", "contig", basic_type_name, basic_type_count);
Packit Service c5cf8c
    err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
  fn_exit:
Packit Service c5cf8c
    return err;
Packit Service c5cf8c
Packit Service c5cf8c
  fn_fail:
Packit Service c5cf8c
    /* cleanup datatype */
Packit Service c5cf8c
    if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
Packit Service c5cf8c
        MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* cleanup buffers */
Packit Service c5cf8c
    if (dtpi) {
Packit Service c5cf8c
        free(dtpi);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    if (buf) {
Packit Service c5cf8c
        free(buf);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    goto fn_exit;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Vector_create(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int err = DTP_SUCCESS;
Packit Service c5cf8c
    int len;
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    MPI_Aint lb, extent, basic_type_size;
Packit Service c5cf8c
    MPI_Datatype basic_type;
Packit Service c5cf8c
    void *buf = NULL;
Packit Service c5cf8c
    DTPI_t *dtpi = NULL;
Packit Service c5cf8c
    char type_name[TYPE_NAME_MAXLEN] = { 0 };
Packit Service c5cf8c
    char basic_type_name[BASIC_TYPE_NAME_MAXLEN] = { 0 };
Packit Service c5cf8c
Packit Service c5cf8c
    /* get basic type for pool */
Packit Service c5cf8c
    basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
Packit Service c5cf8c
Packit Service c5cf8c
    /* get object index in the pool */
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_get_extent(basic_type, &lb, &basic_type_size);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* create vector datatype */
Packit Service c5cf8c
    err =
Packit Service c5cf8c
        MPI_Type_vector(par->core.type_count, par->core.type_blklen,
Packit Service c5cf8c
                        par->core.type_stride, basic_type,
Packit Service c5cf8c
                        &dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_commit(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_count = 1;
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_get_extent(dtp->DTP_obj_array[obj_idx].DTP_obj_type, &lb, &extent);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate buffer */
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(buf, lb + extent);
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize totlen and displ for buf init */
Packit Service c5cf8c
    par->core.type_totlen = (extent + basic_type_size - 1) / basic_type_size;
Packit Service c5cf8c
    par->core.type_displ = 0;
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize buffer with requested DTPI_Par */
Packit Service c5cf8c
    DTPI_Type_init_buf(par, basic_type, buf);
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate space for private datatype info */
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize private datatype info data */
Packit Service c5cf8c
    dtpi->obj_type = DTPI_OBJ_TYPE__VECTOR;
Packit Service c5cf8c
    dtpi->type_basic_size = basic_type_size;
Packit Service c5cf8c
    dtpi->type_extent = extent;
Packit Service c5cf8c
    dtpi->type_lb = lb;
Packit Service c5cf8c
    dtpi->type_ub = lb + extent;
Packit Service c5cf8c
    dtpi->u.vector.stride = par->core.type_stride;
Packit Service c5cf8c
    dtpi->u.vector.blklen = par->core.type_blklen;
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].private_info = dtpi;
Packit Service c5cf8c
Packit Service c5cf8c
    /* set type name for debug information */
Packit Service c5cf8c
    err = MPI_Type_get_name(basic_type, basic_type_name, &len;;
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    sprintf(type_name, "%s (%s basic_type %li count %li blocklen %li stride)", "vector",
Packit Service c5cf8c
            basic_type_name, par->core.type_count, par->core.type_blklen, par->core.type_stride);
Packit Service c5cf8c
    err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
  fn_exit:
Packit Service c5cf8c
    return err;
Packit Service c5cf8c
Packit Service c5cf8c
  fn_fail:
Packit Service c5cf8c
    /* cleanup datatype */
Packit Service c5cf8c
    if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
Packit Service c5cf8c
        MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* clean up buffers */
Packit Service c5cf8c
    if (dtpi) {
Packit Service c5cf8c
        free(dtpi);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    if (buf) {
Packit Service c5cf8c
        free(buf);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    goto fn_exit;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Hvector_create(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int err = DTP_SUCCESS;
Packit Service c5cf8c
    int len;
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    MPI_Aint lb, extent, basic_type_size;
Packit Service c5cf8c
    MPI_Datatype basic_type;
Packit Service c5cf8c
    void *buf = NULL;
Packit Service c5cf8c
    DTPI_t *dtpi = NULL;
Packit Service c5cf8c
    char type_name[TYPE_NAME_MAXLEN] = { 0 };
Packit Service c5cf8c
    char basic_type_name[BASIC_TYPE_NAME_MAXLEN] = { 0 };
Packit Service c5cf8c
Packit Service c5cf8c
    /* get basic type for pool */
Packit Service c5cf8c
    basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
Packit Service c5cf8c
Packit Service c5cf8c
    /* get object index in the pool */
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_get_extent(basic_type, &lb, &basic_type_size);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* create hvector datatype */
Packit Service c5cf8c
    err =
Packit Service c5cf8c
        MPI_Type_create_hvector(par->core.type_count, par->core.type_blklen,
Packit Service c5cf8c
                                par->core.type_stride * basic_type_size, basic_type,
Packit Service c5cf8c
                                &dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_commit(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_count = 1;
Packit Service c5cf8c
Packit Service c5cf8c
    /* get type true extent */
Packit Service c5cf8c
    err = MPI_Type_get_true_extent(dtp->DTP_obj_array[obj_idx].DTP_obj_type, &lb, &extent);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate buffer */
Packit Service c5cf8c
    FPRINTF(stdout, "hvector basic type size = %ld", basic_type_size);
Packit Service c5cf8c
    FPRINTF(stdout, "hvector extent = %ld\n", extent);
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(buf, lb + extent);
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize totlen and displ for buf init */
Packit Service c5cf8c
    par->core.type_totlen = (extent + basic_type_size - 1) / basic_type_size;
Packit Service c5cf8c
    par->core.type_displ = 0;
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize buffer with requested DTPI_Par */
Packit Service c5cf8c
    DTPI_Type_init_buf(par, basic_type, buf);
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate space for private datatype info */
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize private datatype info data */
Packit Service c5cf8c
    dtpi->obj_type = DTPI_OBJ_TYPE__HVECTOR;
Packit Service c5cf8c
    dtpi->type_basic_size = basic_type_size;
Packit Service c5cf8c
    dtpi->type_extent = extent;
Packit Service c5cf8c
    dtpi->type_lb = lb;
Packit Service c5cf8c
    dtpi->type_ub = lb + extent;
Packit Service c5cf8c
    dtpi->u.hvector.stride = par->core.type_stride * basic_type_size;
Packit Service c5cf8c
    dtpi->u.hvector.blklen = par->core.type_blklen;
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].private_info = dtpi;
Packit Service c5cf8c
Packit Service c5cf8c
    /* set type name for debug information */
Packit Service c5cf8c
    err = MPI_Type_get_name(basic_type, basic_type_name, &len;;
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    sprintf(type_name, "%s (%s basic_type %li count %li blocklen %li stride)", "hvector",
Packit Service c5cf8c
            basic_type_name, par->core.type_count, par->core.type_blklen, par->core.type_stride);
Packit Service c5cf8c
    err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
  fn_exit:
Packit Service c5cf8c
    return err;
Packit Service c5cf8c
Packit Service c5cf8c
  fn_fail:
Packit Service c5cf8c
    /* cleanup datatype */
Packit Service c5cf8c
    if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
Packit Service c5cf8c
        MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* clean up buffers */
Packit Service c5cf8c
    if (dtpi) {
Packit Service c5cf8c
        free(dtpi);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    if (buf) {
Packit Service c5cf8c
        free(buf);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    goto fn_exit;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Indexed_create(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int i;
Packit Service c5cf8c
    int err = DTP_SUCCESS;
Packit Service c5cf8c
    int len;
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    int *type_displs = NULL, *type_blklens = NULL;
Packit Service c5cf8c
    MPI_Aint lb, extent, basic_type_size;
Packit Service c5cf8c
    MPI_Datatype basic_type;
Packit Service c5cf8c
    void *buf = NULL;
Packit Service c5cf8c
    DTPI_t *dtpi = NULL;
Packit Service c5cf8c
    char type_name[TYPE_NAME_MAXLEN] = { 0 };
Packit Service c5cf8c
    char basic_type_name[BASIC_TYPE_NAME_MAXLEN] = { 0 };
Packit Service c5cf8c
Packit Service c5cf8c
    /* get basic type for pool */
Packit Service c5cf8c
    basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
Packit Service c5cf8c
Packit Service c5cf8c
    /* get object index in the pool */
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(type_displs, sizeof(*type_displs) * par->core.type_count);
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(type_blklens, sizeof(*type_blklens) * par->core.type_count);
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_get_extent(basic_type, &lb, &basic_type_size);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    for (i = 0; i < par->core.type_count; i++) {
Packit Service c5cf8c
        type_blklens[i] = par->core.type_blklen;
Packit Service c5cf8c
        type_displs[i] = par->core.type_stride * i;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* create indexed datatype */
Packit Service c5cf8c
    err =
Packit Service c5cf8c
        MPI_Type_indexed(par->core.type_count, type_blklens, type_displs, basic_type,
Packit Service c5cf8c
                         &dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_commit(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_count = 1;
Packit Service c5cf8c
Packit Service c5cf8c
    /* get type extent */
Packit Service c5cf8c
    err = MPI_Type_get_extent(dtp->DTP_obj_array[obj_idx].DTP_obj_type, &lb, &extent);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate buffer */
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(buf, lb + extent);
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize totlen and displ for buf init */
Packit Service c5cf8c
    par->core.type_totlen = (extent + basic_type_size - 1) / basic_type_size;
Packit Service c5cf8c
    par->core.type_displ = 0;
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize buffer with requested DTPI_Par */
Packit Service c5cf8c
    DTPI_Type_init_buf(par, basic_type, buf);
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate space for private datatype info */
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize private datatype info data */
Packit Service c5cf8c
    dtpi->obj_type = DTPI_OBJ_TYPE__INDEXED;
Packit Service c5cf8c
    dtpi->type_basic_size = basic_type_size;
Packit Service c5cf8c
    dtpi->type_extent = extent;
Packit Service c5cf8c
    dtpi->type_lb = lb;
Packit Service c5cf8c
    dtpi->type_ub = lb + extent;
Packit Service c5cf8c
    dtpi->u.indexed.stride = par->core.type_stride;
Packit Service c5cf8c
    dtpi->u.indexed.blklen = par->core.type_blklen;
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].private_info = dtpi;
Packit Service c5cf8c
Packit Service c5cf8c
    /* set type name for debug information */
Packit Service c5cf8c
    err = MPI_Type_get_name(basic_type, basic_type_name, &len;;
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    sprintf(type_name, "%s (%s basic_type %li count %li blocklen %li stride)", "indexed",
Packit Service c5cf8c
            basic_type_name, par->core.type_count, par->core.type_blklen, par->core.type_stride);
Packit Service c5cf8c
    err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
  fn_exit:
Packit Service c5cf8c
    if (type_displs) {
Packit Service c5cf8c
        free(type_displs);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    if (type_blklens) {
Packit Service c5cf8c
        free(type_blklens);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    return err;
Packit Service c5cf8c
Packit Service c5cf8c
  fn_fail:
Packit Service c5cf8c
    /* cleanup datatype */
Packit Service c5cf8c
    if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
Packit Service c5cf8c
        MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* cleanup buffers */
Packit Service c5cf8c
    if (dtpi) {
Packit Service c5cf8c
        free(dtpi);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    if (buf) {
Packit Service c5cf8c
        free(buf);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    goto fn_exit;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Hindexed_create(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int i;
Packit Service c5cf8c
    int err = DTP_SUCCESS;
Packit Service c5cf8c
    int len;
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    int *type_blklens = NULL;
Packit Service c5cf8c
    MPI_Aint *type_displs = NULL;
Packit Service c5cf8c
    MPI_Aint lb, extent, basic_type_size;
Packit Service c5cf8c
    MPI_Datatype basic_type;
Packit Service c5cf8c
    void *buf = NULL;
Packit Service c5cf8c
    DTPI_t *dtpi = NULL;
Packit Service c5cf8c
    char type_name[TYPE_NAME_MAXLEN] = { 0 };
Packit Service c5cf8c
    char basic_type_name[BASIC_TYPE_NAME_MAXLEN] = { 0 };
Packit Service c5cf8c
Packit Service c5cf8c
    /* get basic type for pool */
Packit Service c5cf8c
    basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
Packit Service c5cf8c
Packit Service c5cf8c
    /* get object index in the pool */
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(type_displs, sizeof(*type_displs) * par->core.type_count);
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(type_blklens, sizeof(*type_blklens) * par->core.type_count);
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_get_extent(basic_type, &lb, &basic_type_size);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    for (i = 0; i < par->core.type_count; i++) {
Packit Service c5cf8c
        type_blklens[i] = par->core.type_blklen;
Packit Service c5cf8c
        type_displs[i] = par->core.type_stride * basic_type_size * i;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* create indexed datatype */
Packit Service c5cf8c
    err =
Packit Service c5cf8c
        MPI_Type_create_hindexed(par->core.type_count, type_blklens, type_displs,
Packit Service c5cf8c
                                 basic_type, &dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_commit(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_count = 1;
Packit Service c5cf8c
Packit Service c5cf8c
    /* get type extent */
Packit Service c5cf8c
    err = MPI_Type_get_extent(dtp->DTP_obj_array[obj_idx].DTP_obj_type, &lb, &extent);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate buffer */
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(buf, lb + extent);
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize totlen and displ for buf init */
Packit Service c5cf8c
    par->core.type_totlen = (extent + basic_type_size - 1) / basic_type_size;
Packit Service c5cf8c
    par->core.type_displ = 0;
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize buffer with requested DTPI_Par */
Packit Service c5cf8c
    DTPI_Type_init_buf(par, basic_type, buf);
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate space for private datatype info */
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize private datatype info data */
Packit Service c5cf8c
    dtpi->obj_type = DTPI_OBJ_TYPE__HINDEXED;
Packit Service c5cf8c
    dtpi->type_basic_size = basic_type_size;
Packit Service c5cf8c
    dtpi->type_extent = extent;
Packit Service c5cf8c
    dtpi->type_lb = lb;
Packit Service c5cf8c
    dtpi->type_ub = lb + extent;
Packit Service c5cf8c
    dtpi->u.hindexed.stride = par->core.type_stride * basic_type_size;
Packit Service c5cf8c
    dtpi->u.hindexed.blklen = par->core.type_blklen;
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].private_info = dtpi;
Packit Service c5cf8c
Packit Service c5cf8c
    /* set type name for debug information */
Packit Service c5cf8c
    err = MPI_Type_get_name(basic_type, basic_type_name, &len;;
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    sprintf(type_name, "%s (%s basic_type %li count %li blocklen %li stride)", "hindexed",
Packit Service c5cf8c
            basic_type_name, par->core.type_count, par->core.type_blklen, par->core.type_stride);
Packit Service c5cf8c
    err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
  fn_exit:
Packit Service c5cf8c
    if (type_displs) {
Packit Service c5cf8c
        free(type_displs);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    if (type_blklens) {
Packit Service c5cf8c
        free(type_blklens);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    return err;
Packit Service c5cf8c
Packit Service c5cf8c
  fn_fail:
Packit Service c5cf8c
    /* cleanup datatype */
Packit Service c5cf8c
    if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
Packit Service c5cf8c
        MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* cleanup buffers */
Packit Service c5cf8c
    if (dtpi) {
Packit Service c5cf8c
        free(dtpi);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    if (buf) {
Packit Service c5cf8c
        free(buf);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    goto fn_exit;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Block_indexed_create(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int i;
Packit Service c5cf8c
    int err = DTP_SUCCESS;
Packit Service c5cf8c
    int len;
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    int *type_displs = NULL;
Packit Service c5cf8c
    MPI_Aint lb, extent, basic_type_size;
Packit Service c5cf8c
    MPI_Datatype basic_type;
Packit Service c5cf8c
    void *buf = NULL;
Packit Service c5cf8c
    DTPI_t *dtpi = NULL;
Packit Service c5cf8c
    char type_name[TYPE_NAME_MAXLEN] = { 0 };
Packit Service c5cf8c
    char basic_type_name[BASIC_TYPE_NAME_MAXLEN] = { 0 };
Packit Service c5cf8c
Packit Service c5cf8c
    /* get type signature for pool */
Packit Service c5cf8c
    basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
Packit Service c5cf8c
Packit Service c5cf8c
    /* get object index in the pool */
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(type_displs, sizeof(*type_displs) * par->core.type_count);
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_get_extent(basic_type, &lb, &basic_type_size);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    for (i = 0; i < par->core.type_count; i++) {
Packit Service c5cf8c
        type_displs[i] = par->core.type_stride * i;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* create block indexed datatype */
Packit Service c5cf8c
    err =
Packit Service c5cf8c
        MPI_Type_create_indexed_block(par->core.type_count, par->core.type_blklen, type_displs,
Packit Service c5cf8c
                                      basic_type, &dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_commit(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_count = 1;
Packit Service c5cf8c
Packit Service c5cf8c
    /* get type extent */
Packit Service c5cf8c
    err = MPI_Type_get_extent(dtp->DTP_obj_array[obj_idx].DTP_obj_type, &lb, &extent);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate buffer */
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(buf, lb + extent);
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize totlen and displ for buf init */
Packit Service c5cf8c
    par->core.type_totlen = (extent + basic_type_size - 1) / basic_type_size;
Packit Service c5cf8c
    par->core.type_displ = 0;
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize buffer with requested DTPI_Par */
Packit Service c5cf8c
    DTPI_Type_init_buf(par, basic_type, buf);
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate space for private datatype info */
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize private datatype info data */
Packit Service c5cf8c
    dtpi->obj_type = DTPI_OBJ_TYPE__BLOCK_INDEXED;
Packit Service c5cf8c
    dtpi->type_basic_size = basic_type_size;
Packit Service c5cf8c
    dtpi->type_extent = extent;
Packit Service c5cf8c
    dtpi->type_lb = lb;
Packit Service c5cf8c
    dtpi->type_ub = lb + extent;
Packit Service c5cf8c
    dtpi->u.block_indexed.stride = par->core.type_stride;
Packit Service c5cf8c
    dtpi->u.block_indexed.blklen = par->core.type_blklen;
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].private_info = dtpi;
Packit Service c5cf8c
Packit Service c5cf8c
    /* set type name for debug information */
Packit Service c5cf8c
    err = MPI_Type_get_name(basic_type, basic_type_name, &len;;
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    sprintf(type_name, "%s (%s basic_type %li count %li blocklen %li stride)",
Packit Service c5cf8c
            "block_indexed", basic_type_name, par->core.type_count,
Packit Service c5cf8c
            par->core.type_blklen, par->core.type_stride);
Packit Service c5cf8c
    err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
  fn_exit:
Packit Service c5cf8c
    if (type_displs) {
Packit Service c5cf8c
        free(type_displs);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    return err;
Packit Service c5cf8c
Packit Service c5cf8c
  fn_fail:
Packit Service c5cf8c
    /* cleanup datatype */
Packit Service c5cf8c
    if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
Packit Service c5cf8c
        MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* cleanup buffers */
Packit Service c5cf8c
    if (dtpi) {
Packit Service c5cf8c
        free(dtpi);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    if (buf) {
Packit Service c5cf8c
        free(buf);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    goto fn_exit;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Block_hindexed_create(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int i;
Packit Service c5cf8c
    int err = DTP_SUCCESS;
Packit Service c5cf8c
    int len;
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    MPI_Aint *type_displs = NULL;
Packit Service c5cf8c
    MPI_Aint lb, extent, basic_type_size;
Packit Service c5cf8c
    MPI_Datatype basic_type;
Packit Service c5cf8c
    void *buf = NULL;
Packit Service c5cf8c
    DTPI_t *dtpi = NULL;
Packit Service c5cf8c
    char type_name[TYPE_NAME_MAXLEN] = { 0 };
Packit Service c5cf8c
    char basic_type_name[BASIC_TYPE_NAME_MAXLEN] = { 0 };
Packit Service c5cf8c
Packit Service c5cf8c
    /* get type signature for pool */
Packit Service c5cf8c
    basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
Packit Service c5cf8c
Packit Service c5cf8c
    /* get object index in the pool */
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(type_displs, sizeof(*type_displs) * par->core.type_count);
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_get_extent(basic_type, &lb, &basic_type_size);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    for (i = 0; i < par->core.type_count; i++) {
Packit Service c5cf8c
        type_displs[i] = par->core.type_stride * basic_type_size * i;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* create block indexed datatype */
Packit Service c5cf8c
    err =
Packit Service c5cf8c
        MPI_Type_create_hindexed_block(par->core.type_count, par->core.type_blklen, type_displs,
Packit Service c5cf8c
                                       basic_type, &dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_commit(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_count = 1;
Packit Service c5cf8c
Packit Service c5cf8c
    /* get type extent */
Packit Service c5cf8c
    err = MPI_Type_get_extent(dtp->DTP_obj_array[obj_idx].DTP_obj_type, &lb, &extent);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate buffer */
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(buf, lb + extent);
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize totlen and displ for buf init */
Packit Service c5cf8c
    par->core.type_totlen = (extent + basic_type_size - 1) / basic_type_size;
Packit Service c5cf8c
    par->core.type_displ = 0;
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize buffer with requested DTPI_Par */
Packit Service c5cf8c
    DTPI_Type_init_buf(par, basic_type, buf);
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate space for private datatype info */
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize private datatype info data */
Packit Service c5cf8c
    dtpi->obj_type = DTPI_OBJ_TYPE__BLOCK_HINDEXED;
Packit Service c5cf8c
    dtpi->type_basic_size = basic_type_size;
Packit Service c5cf8c
    dtpi->type_extent = extent;
Packit Service c5cf8c
    dtpi->type_lb = lb;
Packit Service c5cf8c
    dtpi->type_ub = lb + extent;
Packit Service c5cf8c
    dtpi->u.block_hindexed.stride = par->core.type_stride * basic_type_size;
Packit Service c5cf8c
    dtpi->u.block_hindexed.blklen = par->core.type_blklen;
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].private_info = dtpi;
Packit Service c5cf8c
Packit Service c5cf8c
    /* set type name for debug information */
Packit Service c5cf8c
    err = MPI_Type_get_name(basic_type, basic_type_name, &len;;
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    sprintf(type_name, "%s (%s basic_type %li count %li blocklen %li stride)",
Packit Service c5cf8c
            "block_hindexed", basic_type_name, par->core.type_count,
Packit Service c5cf8c
            par->core.type_blklen, par->core.type_stride);
Packit Service c5cf8c
    err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
  fn_exit:
Packit Service c5cf8c
    if (type_displs) {
Packit Service c5cf8c
        free(type_displs);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    return err;
Packit Service c5cf8c
Packit Service c5cf8c
  fn_fail:
Packit Service c5cf8c
    /* cleanup datatype */
Packit Service c5cf8c
    if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
Packit Service c5cf8c
        MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* cleanup buffers */
Packit Service c5cf8c
    if (dtpi) {
Packit Service c5cf8c
        free(dtpi);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    if (buf) {
Packit Service c5cf8c
        free(buf);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    goto fn_exit;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Subarray_c_create(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int err = DTP_SUCCESS;
Packit Service c5cf8c
    int len;
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    MPI_Aint lb, extent, basic_type_size;
Packit Service c5cf8c
    MPI_Datatype basic_type;
Packit Service c5cf8c
    void *buf = NULL;
Packit Service c5cf8c
    char type_name[TYPE_NAME_MAXLEN] = { 0 };
Packit Service c5cf8c
    char basic_type_name[BASIC_TYPE_NAME_MAXLEN] = { 0 };
Packit Service c5cf8c
    DTPI_t *dtpi = NULL;
Packit Service c5cf8c
Packit Service c5cf8c
    /* get type signature for pool */
Packit Service c5cf8c
    basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
Packit Service c5cf8c
Packit Service c5cf8c
    /* get object index in the pool */
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_get_extent(basic_type, &lb, &basic_type_size);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate space for private datatype info */
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
Packit Service c5cf8c
Packit Service c5cf8c
    dtpi->u.subarray.arr_starts[0] = par->core.type_count / 8;  /* use fix offset along x */
Packit Service c5cf8c
    dtpi->u.subarray.arr_starts[1] = par->core.type_stride - par->core.type_blklen;
Packit Service c5cf8c
    dtpi->u.subarray.arr_sizes[0] = par->core.type_count + dtpi->u.subarray.arr_starts[0];
Packit Service c5cf8c
    dtpi->u.subarray.arr_sizes[1] = par->core.type_stride;
Packit Service c5cf8c
    dtpi->u.subarray.arr_subsizes[0] = par->core.type_count;
Packit Service c5cf8c
    dtpi->u.subarray.arr_subsizes[1] = par->core.type_blklen;
Packit Service c5cf8c
    dtpi->u.subarray.order = MPI_ORDER_C;
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_create_subarray(2,
Packit Service c5cf8c
                                   dtpi->u.subarray.arr_sizes,
Packit Service c5cf8c
                                   dtpi->u.subarray.arr_subsizes,
Packit Service c5cf8c
                                   dtpi->u.subarray.arr_starts,
Packit Service c5cf8c
                                   dtpi->u.subarray.order,
Packit Service c5cf8c
                                   basic_type, &dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_commit(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_count = 1;
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_get_extent(dtp->DTP_obj_array[obj_idx].DTP_obj_type, &lb, &extent);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate buffer */
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(buf, lb + extent);
Packit Service c5cf8c
Packit Service c5cf8c
    /* recompute stride and displacement info for buffer initialization */
Packit Service c5cf8c
    par->core.type_displ =
Packit Service c5cf8c
        ((dtpi->u.subarray.arr_sizes[1] * dtpi->u.subarray.arr_starts[0]) +
Packit Service c5cf8c
         dtpi->u.subarray.arr_starts[1]) * basic_type_size;
Packit Service c5cf8c
    par->core.type_totlen = (extent - par->core.type_displ) / basic_type_size;
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize buffer with requested DTPI_Par */
Packit Service c5cf8c
    DTPI_Type_init_buf(par, basic_type, buf);
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize private datatype info data */
Packit Service c5cf8c
    dtpi->obj_type = DTPI_OBJ_TYPE__SUBARRAY_C;
Packit Service c5cf8c
    dtpi->type_basic_size = basic_type_size;
Packit Service c5cf8c
    dtpi->type_extent = extent;
Packit Service c5cf8c
    dtpi->type_lb = lb;
Packit Service c5cf8c
    dtpi->type_ub = lb + extent;
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].private_info = dtpi;
Packit Service c5cf8c
Packit Service c5cf8c
    /* set type name for debug information */
Packit Service c5cf8c
    err = MPI_Type_get_name(basic_type, basic_type_name, &len;;
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    sprintf(type_name, "%s (%s basic_type full{%d,%d} sub{%d,%d} start{%d,%d})",
Packit Service c5cf8c
            "subarray-c", basic_type_name, dtpi->u.subarray.arr_sizes[0],
Packit Service c5cf8c
            dtpi->u.subarray.arr_sizes[1], dtpi->u.subarray.arr_subsizes[0],
Packit Service c5cf8c
            dtpi->u.subarray.arr_subsizes[1], dtpi->u.subarray.arr_starts[0],
Packit Service c5cf8c
            dtpi->u.subarray.arr_starts[1]);
Packit Service c5cf8c
    err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
  fn_exit:
Packit Service c5cf8c
    return err;
Packit Service c5cf8c
Packit Service c5cf8c
  fn_fail:
Packit Service c5cf8c
    /* cleanup datatype */
Packit Service c5cf8c
    if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
Packit Service c5cf8c
        MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* cleanup buffers */
Packit Service c5cf8c
    if (dtpi) {
Packit Service c5cf8c
        free(dtpi);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    if (buf) {
Packit Service c5cf8c
        free(buf);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    goto fn_exit;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Subarray_f_create(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int err = DTP_SUCCESS;
Packit Service c5cf8c
    int len;
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    MPI_Aint lb, extent, basic_type_size;
Packit Service c5cf8c
    MPI_Datatype basic_type;
Packit Service c5cf8c
    void *buf = NULL;
Packit Service c5cf8c
    char type_name[TYPE_NAME_MAXLEN] = { 0 };
Packit Service c5cf8c
    char basic_type_name[BASIC_TYPE_NAME_MAXLEN] = { 0 };
Packit Service c5cf8c
    DTPI_t *dtpi = NULL;
Packit Service c5cf8c
Packit Service c5cf8c
    /* get type signature for pool */
Packit Service c5cf8c
    basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
Packit Service c5cf8c
Packit Service c5cf8c
    /* get object index in the pool */
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_get_extent(basic_type, &lb, &basic_type_size);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate space for private datatype info */
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
Packit Service c5cf8c
Packit Service c5cf8c
    dtpi->u.subarray.arr_starts[0] = par->core.type_count / 8;  /* use fix offset along x */
Packit Service c5cf8c
    dtpi->u.subarray.arr_starts[1] = par->core.type_stride - par->core.type_blklen;
Packit Service c5cf8c
    dtpi->u.subarray.arr_sizes[0] = par->core.type_count + dtpi->u.subarray.arr_starts[0];
Packit Service c5cf8c
    dtpi->u.subarray.arr_sizes[1] = par->core.type_stride;
Packit Service c5cf8c
    dtpi->u.subarray.arr_subsizes[0] = par->core.type_count;
Packit Service c5cf8c
    dtpi->u.subarray.arr_subsizes[1] = par->core.type_blklen;
Packit Service c5cf8c
    dtpi->u.subarray.order = MPI_ORDER_FORTRAN;
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_create_subarray(2,
Packit Service c5cf8c
                                   dtpi->u.subarray.arr_sizes,
Packit Service c5cf8c
                                   dtpi->u.subarray.arr_subsizes,
Packit Service c5cf8c
                                   dtpi->u.subarray.arr_starts,
Packit Service c5cf8c
                                   dtpi->u.subarray.order,
Packit Service c5cf8c
                                   basic_type, &dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_commit(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_count = 1;
Packit Service c5cf8c
Packit Service c5cf8c
    err = MPI_Type_get_extent(dtp->DTP_obj_array[obj_idx].DTP_obj_type, &lb, &extent);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* allocate buffer */
Packit Service c5cf8c
    DTPI_OBJ_ALLOC_OR_FAIL(buf, lb + extent);
Packit Service c5cf8c
Packit Service c5cf8c
    /* recompute stride and displacement info for buffer initialization */
Packit Service c5cf8c
    par->core.type_displ =
Packit Service c5cf8c
        ((dtpi->u.subarray.arr_sizes[0] * dtpi->u.subarray.arr_starts[1]) +
Packit Service c5cf8c
         dtpi->u.subarray.arr_starts[0]) * basic_type_size;
Packit Service c5cf8c
    par->core.type_stride = dtpi->u.subarray.arr_sizes[0];
Packit Service c5cf8c
    par->core.type_blklen = dtpi->u.subarray.arr_subsizes[0];
Packit Service c5cf8c
    par->core.type_totlen = (extent - par->core.type_displ) / basic_type_size;
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize buffer with requested DTPI_Par */
Packit Service c5cf8c
    DTPI_Type_init_buf(par, basic_type, buf);
Packit Service c5cf8c
Packit Service c5cf8c
    /* initialize private datatype info data */
Packit Service c5cf8c
    dtpi->obj_type = DTPI_OBJ_TYPE__SUBARRAY_F;
Packit Service c5cf8c
    dtpi->type_basic_size = basic_type_size;
Packit Service c5cf8c
    dtpi->type_extent = extent;
Packit Service c5cf8c
    dtpi->type_lb = lb;
Packit Service c5cf8c
    dtpi->type_ub = lb + extent;
Packit Service c5cf8c
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
Packit Service c5cf8c
    dtp->DTP_obj_array[obj_idx].private_info = dtpi;
Packit Service c5cf8c
Packit Service c5cf8c
    /* set type name for debug information */
Packit Service c5cf8c
    err = MPI_Type_get_name(basic_type, basic_type_name, &len;;
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    sprintf(type_name, "%s (%s basic_type full{%d,%d} sub{%d,%d} start{%d,%d})",
Packit Service c5cf8c
            "subarray-f", basic_type_name, dtpi->u.subarray.arr_sizes[0],
Packit Service c5cf8c
            dtpi->u.subarray.arr_sizes[1], dtpi->u.subarray.arr_subsizes[0],
Packit Service c5cf8c
            dtpi->u.subarray.arr_subsizes[1], dtpi->u.subarray.arr_starts[0],
Packit Service c5cf8c
            dtpi->u.subarray.arr_starts[1]);
Packit Service c5cf8c
    err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
Packit Service c5cf8c
    if (err) {
Packit Service c5cf8c
        DTPI_Print_error(err);
Packit Service c5cf8c
        goto fn_fail;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
  fn_exit:
Packit Service c5cf8c
    return err;
Packit Service c5cf8c
Packit Service c5cf8c
  fn_fail:
Packit Service c5cf8c
    /* cleanup datatype */
Packit Service c5cf8c
    if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
Packit Service c5cf8c
        MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* cleanup buffers */
Packit Service c5cf8c
    if (dtpi) {
Packit Service c5cf8c
        free(dtpi);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    if (buf) {
Packit Service c5cf8c
        free(buf);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    goto fn_exit;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
Packit Service c5cf8c
/* --------------------------------------------------------- */
Packit Service c5cf8c
/* Datatype Pool Buffer Check Functions                      */
Packit Service c5cf8c
/* --------------------------------------------------------- */
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Struct_check_buf(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int i, err = DTP_SUCCESS;
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    int num_types;
Packit Service c5cf8c
    int *basic_type_counts;
Packit Service c5cf8c
    MPI_Aint *basic_type_displs;
Packit Service c5cf8c
    MPI_Datatype *basic_types;
Packit Service c5cf8c
    void *buf;
Packit Service c5cf8c
    DTPI_t *dtpi;
Packit Service c5cf8c
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
    buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
Packit Service c5cf8c
    num_types = dtp->DTP_type_signature.DTP_pool_struct.DTP_num_types;
Packit Service c5cf8c
    basic_types = dtp->DTP_type_signature.DTP_pool_struct.DTP_basic_type;
Packit Service c5cf8c
    basic_type_counts = dtp->DTP_type_signature.DTP_pool_struct.DTP_basic_type_count;
Packit Service c5cf8c
Packit Service c5cf8c
    dtpi = (DTPI_t *) dtp->DTP_obj_array[obj_idx].private_info;
Packit Service c5cf8c
    basic_type_displs = dtpi->u.structure.displs;
Packit Service c5cf8c
Packit Service c5cf8c
    /* check every elem in struct separately */
Packit Service c5cf8c
    for (i = 0; i < num_types; i++) {
Packit Service c5cf8c
        /* user count is ignored */
Packit Service c5cf8c
        par->user.val_count = basic_type_counts[i];
Packit Service c5cf8c
Packit Service c5cf8c
        /* contiguous arrays */
Packit Service c5cf8c
        par->core.type_stride = 1;
Packit Service c5cf8c
        par->core.type_blklen = 1;
Packit Service c5cf8c
        par->core.type_totlen = (MPI_Aint) basic_type_counts[i];
Packit Service c5cf8c
        par->core.type_displ = basic_type_displs[i];
Packit Service c5cf8c
        err = DTPI_Type_check_buf(par, basic_types[i], buf);
Packit Service c5cf8c
        if (err != DTP_SUCCESS) {
Packit Service c5cf8c
            break;
Packit Service c5cf8c
        }
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    return err;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Basic_check_buf(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    int basic_type_count;
Packit Service c5cf8c
    MPI_Datatype basic_type;
Packit Service c5cf8c
    void *buf;
Packit Service c5cf8c
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
    buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
Packit Service c5cf8c
    basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
Packit Service c5cf8c
    basic_type_count = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type_count;
Packit Service c5cf8c
Packit Service c5cf8c
    par->core.type_stride = 1;
Packit Service c5cf8c
    par->core.type_blklen = 1;
Packit Service c5cf8c
    par->core.type_totlen = basic_type_count;
Packit Service c5cf8c
    par->core.type_displ = 0;
Packit Service c5cf8c
Packit Service c5cf8c
    return DTPI_Type_check_buf(par, basic_type, buf);
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Contig_check_buf(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    MPI_Datatype basic_type;
Packit Service c5cf8c
    void *buf;
Packit Service c5cf8c
    DTPI_t *dtpi;
Packit Service c5cf8c
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
    buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
Packit Service c5cf8c
    basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
Packit Service c5cf8c
Packit Service c5cf8c
    dtpi = (DTPI_t *) dtp->DTP_obj_array[obj_idx].private_info;
Packit Service c5cf8c
    par->core.type_stride = dtpi->u.contig.stride;
Packit Service c5cf8c
    par->core.type_blklen = dtpi->u.contig.blklen;
Packit Service c5cf8c
    par->core.type_totlen = dtpi->type_extent / dtpi->type_basic_size;
Packit Service c5cf8c
    par->core.type_displ = 0;
Packit Service c5cf8c
Packit Service c5cf8c
    return DTPI_Type_check_buf(par, basic_type, buf);
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Vector_check_buf(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    MPI_Datatype basic_type;
Packit Service c5cf8c
    void *buf;
Packit Service c5cf8c
    DTPI_t *dtpi;
Packit Service c5cf8c
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
    buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
Packit Service c5cf8c
    basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
Packit Service c5cf8c
Packit Service c5cf8c
    dtpi = (DTPI_t *) dtp->DTP_obj_array[obj_idx].private_info;
Packit Service c5cf8c
    par->core.type_stride = dtpi->u.vector.stride;
Packit Service c5cf8c
    par->core.type_blklen = dtpi->u.vector.blklen;
Packit Service c5cf8c
    par->core.type_totlen = dtpi->type_extent / dtpi->type_basic_size;
Packit Service c5cf8c
    par->core.type_displ = 0;
Packit Service c5cf8c
Packit Service c5cf8c
    return DTPI_Type_check_buf(par, basic_type, buf);
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Hvector_check_buf(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    MPI_Datatype basic_type;
Packit Service c5cf8c
    void *buf;
Packit Service c5cf8c
    DTPI_t *dtpi;
Packit Service c5cf8c
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
    buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
Packit Service c5cf8c
    basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
Packit Service c5cf8c
Packit Service c5cf8c
    dtpi = (DTPI_t *) dtp->DTP_obj_array[obj_idx].private_info;
Packit Service c5cf8c
    par->core.type_stride = dtpi->u.hvector.stride / dtpi->type_basic_size;
Packit Service c5cf8c
    par->core.type_blklen = dtpi->u.hvector.blklen;
Packit Service c5cf8c
    par->core.type_totlen = dtpi->type_extent / dtpi->type_basic_size;
Packit Service c5cf8c
    par->core.type_displ = 0;
Packit Service c5cf8c
Packit Service c5cf8c
    return DTPI_Type_check_buf(par, basic_type, buf);
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Indexed_check_buf(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    MPI_Datatype basic_type;
Packit Service c5cf8c
    void *buf;
Packit Service c5cf8c
    DTPI_t *dtpi;
Packit Service c5cf8c
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
    buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
Packit Service c5cf8c
    basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
Packit Service c5cf8c
Packit Service c5cf8c
    dtpi = (DTPI_t *) dtp->DTP_obj_array[obj_idx].private_info;
Packit Service c5cf8c
    par->core.type_stride = dtpi->u.indexed.stride;
Packit Service c5cf8c
    par->core.type_blklen = dtpi->u.indexed.blklen;
Packit Service c5cf8c
    par->core.type_totlen = dtpi->type_extent / dtpi->type_basic_size;
Packit Service c5cf8c
    par->core.type_displ = 0;
Packit Service c5cf8c
Packit Service c5cf8c
    return DTPI_Type_check_buf(par, basic_type, buf);
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Hindexed_check_buf(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    MPI_Datatype basic_type;
Packit Service c5cf8c
    void *buf;
Packit Service c5cf8c
    DTPI_t *dtpi;
Packit Service c5cf8c
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
    buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
Packit Service c5cf8c
    basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
Packit Service c5cf8c
Packit Service c5cf8c
    dtpi = (DTPI_t *) dtp->DTP_obj_array[obj_idx].private_info;
Packit Service c5cf8c
    par->core.type_stride = dtpi->u.hindexed.stride / dtpi->type_basic_size;
Packit Service c5cf8c
    par->core.type_blklen = dtpi->u.hindexed.blklen;
Packit Service c5cf8c
    par->core.type_totlen = dtpi->type_extent / dtpi->type_basic_size;
Packit Service c5cf8c
    par->core.type_displ = 0;
Packit Service c5cf8c
Packit Service c5cf8c
    return DTPI_Type_check_buf(par, basic_type, buf);
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Block_indexed_check_buf(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    MPI_Datatype basic_type;
Packit Service c5cf8c
    void *buf;
Packit Service c5cf8c
    DTPI_t *dtpi;
Packit Service c5cf8c
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
    buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
Packit Service c5cf8c
    basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
Packit Service c5cf8c
Packit Service c5cf8c
    dtpi = (DTPI_t *) dtp->DTP_obj_array[obj_idx].private_info;
Packit Service c5cf8c
    par->core.type_stride = dtpi->u.block_indexed.stride;
Packit Service c5cf8c
    par->core.type_blklen = dtpi->u.block_indexed.blklen;
Packit Service c5cf8c
    par->core.type_totlen = dtpi->type_extent / dtpi->type_basic_size;
Packit Service c5cf8c
    par->core.type_displ = 0;
Packit Service c5cf8c
Packit Service c5cf8c
    return DTPI_Type_check_buf(par, basic_type, buf);
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Block_hindexed_check_buf(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    MPI_Datatype basic_type;
Packit Service c5cf8c
    void *buf;
Packit Service c5cf8c
    DTPI_t *dtpi;
Packit Service c5cf8c
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
    buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
Packit Service c5cf8c
    basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
Packit Service c5cf8c
Packit Service c5cf8c
    dtpi = (DTPI_t *) dtp->DTP_obj_array[obj_idx].private_info;
Packit Service c5cf8c
    par->core.type_stride = dtpi->u.block_hindexed.stride / dtpi->type_basic_size;
Packit Service c5cf8c
    par->core.type_blklen = dtpi->u.block_hindexed.blklen;
Packit Service c5cf8c
    par->core.type_totlen = dtpi->type_extent / dtpi->type_basic_size;
Packit Service c5cf8c
    par->core.type_displ = 0;
Packit Service c5cf8c
Packit Service c5cf8c
    return DTPI_Type_check_buf(par, basic_type, buf);
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Subarray_c_check_buf(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    MPI_Datatype basic_type;
Packit Service c5cf8c
    void *buf;
Packit Service c5cf8c
    DTPI_t *dtpi;
Packit Service c5cf8c
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
    buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
Packit Service c5cf8c
    basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
Packit Service c5cf8c
Packit Service c5cf8c
    dtpi = (DTPI_t *) dtp->DTP_obj_array[obj_idx].private_info;
Packit Service c5cf8c
    par->core.type_displ =
Packit Service c5cf8c
        ((dtpi->u.subarray.arr_sizes[1] * dtpi->u.subarray.arr_starts[0]) +
Packit Service c5cf8c
         dtpi->u.subarray.arr_starts[1]) * dtpi->type_basic_size;
Packit Service c5cf8c
    par->core.type_totlen = (dtpi->type_extent - par->core.type_displ) / dtpi->type_basic_size;
Packit Service c5cf8c
    par->core.type_stride = dtpi->u.subarray.arr_sizes[1];
Packit Service c5cf8c
    par->core.type_blklen = dtpi->u.subarray.arr_subsizes[1];
Packit Service c5cf8c
Packit Service c5cf8c
    return DTPI_Type_check_buf(par, basic_type, buf);
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
int DTPI_Subarray_f_check_buf(struct DTPI_Par *par, DTP_t dtp)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int obj_idx;
Packit Service c5cf8c
    MPI_Datatype basic_type;
Packit Service c5cf8c
    void *buf;
Packit Service c5cf8c
    DTPI_t *dtpi;
Packit Service c5cf8c
Packit Service c5cf8c
    obj_idx = par->user.obj_idx;
Packit Service c5cf8c
    buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
Packit Service c5cf8c
    basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
Packit Service c5cf8c
Packit Service c5cf8c
    dtpi = (DTPI_t *) dtp->DTP_obj_array[obj_idx].private_info;
Packit Service c5cf8c
    par->core.type_displ =
Packit Service c5cf8c
        ((dtpi->u.subarray.arr_sizes[0] * dtpi->u.subarray.arr_starts[1]) +
Packit Service c5cf8c
         dtpi->u.subarray.arr_starts[0]) * dtpi->type_basic_size;
Packit Service c5cf8c
    par->core.type_totlen = (dtpi->type_extent - par->core.type_displ) / dtpi->type_basic_size;
Packit Service c5cf8c
    par->core.type_stride = dtpi->u.subarray.arr_sizes[0];
Packit Service c5cf8c
    par->core.type_blklen = dtpi->u.subarray.arr_subsizes[0];
Packit Service c5cf8c
Packit Service c5cf8c
    return DTPI_Type_check_buf(par, basic_type, buf);
Packit Service c5cf8c
}