/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. */ #include "mpioimpl.h" #ifdef HAVE_WEAK_SYMBOLS #if defined(HAVE_PRAGMA_WEAK) #pragma weak MPI_Type_create_darray = PMPI_Type_create_darray #elif defined(HAVE_PRAGMA_HP_SEC_DEF) #pragma _HP_SECONDARY_DEF PMPI_Type_create_darray MPI_Type_create_darray #elif defined(HAVE_PRAGMA_CRI_DUP) #pragma _CRI duplicate MPI_Type_create_darray as PMPI_Type_create_darray /* end of weak pragmas */ #endif /* Include mapping from MPI->PMPI */ #define MPIO_BUILD_PROFILING #include "mpioprof.h" #endif /*@ MPI_Type_create_darray - Creates a datatype corresponding to a distributed, multidimensional array Input Parameters: . size - size of process group (positive integer) . rank - rank in process group (nonnegative integer) . ndims - number of array dimensions as well as process grid dimensions (positive integer) . array_of_gsizes - number of elements of type oldtype in each dimension of global array (array of positive integers) . array_of_distribs - distribution of array in each dimension (array of state) . array_of_dargs - distribution argument in each dimension (array of positive integers) . array_of_psizes - size of process grid in each dimension (array of positive integers) . order - array storage order flag (state) . oldtype - old datatype (handle) Output Parameters: . newtype - new datatype (handle) .N fortran @*/ int MPI_Type_create_darray(int size, int rank, int ndims, int *array_of_gsizes, int *array_of_distribs, int *array_of_dargs, int *array_of_psizes, int order, MPI_Datatype oldtype, MPI_Datatype *newtype) { int err, error_code; int i; MPI_Aint orig_extent, size_with_aint; MPI_Offset size_with_offset; static char myname[] = "MPI_TYPE_CREATE_DARRAY"; /* --BEGIN ERROR HANDLING-- */ if (size <= 0) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "Invalid size argument", 0); return MPIO_Err_return_comm(MPI_COMM_SELF, error_code); } if (rank < 0) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "Invalid rank argument", 0); return MPIO_Err_return_comm(MPI_COMM_SELF, error_code); } if (ndims <= 0) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "Invalid ndoms argument", 0); return MPIO_Err_return_comm(MPI_COMM_SELF, error_code); } if (array_of_gsizes <= (int *) 0) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "Invalid array_of_gsizes argument", 0); return MPIO_Err_return_comm(MPI_COMM_SELF, error_code); } if (array_of_distribs <= (int *) 0) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "Invalid array_of_distribs argument", 0); return MPIO_Err_return_comm(MPI_COMM_SELF, error_code); } if (array_of_dargs <= (int *) 0) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "Invalid array_of_dargs argument", 0); return MPIO_Err_return_comm(MPI_COMM_SELF, error_code); } if (array_of_psizes <= (int *) 0) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "Invalid array_of_psizes argument", 0); return MPIO_Err_return_comm(MPI_COMM_SELF, error_code); } for (i=0; i