X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/77bbf3027c4240a2e833209a3a3f186589da8577..87e5cfdacaaaafd46c8b8d62fbc8089409468fbc:/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 69b7eaa86b..861394190c 100644 --- a/src/smpi/bindings/smpi_pmpi_type.cpp +++ b/src/smpi/bindings/smpi_pmpi_type.cpp @@ -238,18 +238,32 @@ 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; } - int blocks[3] = {1, 1, 1}; - MPI_Aint disps[3] = {lb, 0, lb + extent}; - MPI_Datatype types[3] = {MPI_LB, oldtype, MPI_UB}; - - *newtype = new simgrid::smpi::Type_Struct(oldtype->size(), lb, lb + extent, DT_FLAG_DERIVED, 3, blocks, disps, types); - - (*newtype)->addflag(~DT_FLAG_COMMITED); - return MPI_SUCCESS; + return simgrid::smpi::Datatype::create_resized(oldtype, lb, extent, newtype); }