X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/d20f024dba9ff1e9c8822237caaf963b9e913889..15935515f1a4c577e1fb0aeec4bb0f3cc4f3dcab:/src/smpi/bindings/smpi_pmpi_type.cpp diff --git a/src/smpi/bindings/smpi_pmpi_type.cpp b/src/smpi/bindings/smpi_pmpi_type.cpp index ec5cc1baa7..7687c4031c 100644 --- a/src/smpi/bindings/smpi_pmpi_type.cpp +++ b/src/smpi/bindings/smpi_pmpi_type.cpp @@ -238,6 +238,27 @@ int PMPI_Type_create_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Da return PMPI_Type_struct(count, blocklens, indices, old_types, new_type); } + +int PMPI_Type_create_subarray(int ndims, int* array_of_sizes, + int* array_of_subsizes, int* array_of_starts, + int order, MPI_Datatype oldtype, MPI_Datatype *newtype) { + if (ndims<0){ + return MPI_ERR_COUNT; + } else if (ndims==0){ + *newtype = MPI_DATATYPE_NULL; + return MPI_SUCCESS; + } else if (ndims==1){ + simgrid::smpi::Datatype::create_contiguous( array_of_subsizes[0], oldtype, array_of_starts[0]*oldtype->get_extent(), newtype); + return MPI_SUCCESS; + } else if (oldtype == MPI_DATATYPE_NULL || not oldtype->is_valid() ) { + return MPI_ERR_TYPE; + } else if (order != MPI_ORDER_FORTRAN && order != MPI_ORDER_C){ + return MPI_ERR_ARG; + } else { + return simgrid::smpi::Datatype::create_subarray(ndims, array_of_sizes, array_of_subsizes, array_of_starts, order, oldtype, newtype); + } +} + int PMPI_Type_create_resized(MPI_Datatype oldtype,MPI_Aint lb, MPI_Aint extent, MPI_Datatype *newtype){ if (oldtype == MPI_DATATYPE_NULL) { return MPI_ERR_TYPE; @@ -338,7 +359,7 @@ int PMPI_Pack(void* inbuf, int incount, MPI_Datatype type, void* outbuf, int out return MPI_ERR_TYPE; if(comm==MPI_COMM_NULL) return MPI_ERR_COMM; - return type->pack(inbuf, incount, outbuf,outcount,position, comm); + return type->pack(inbuf == MPI_BOTTOM ? nullptr : inbuf, incount, outbuf, outcount, position, comm); } int PMPI_Pack_size(int incount, MPI_Datatype datatype, MPI_Comm comm, int* size) {