diff --git a/mpi/docs/zz-user-defined-datatypes.md b/mpi/docs/zz-user-defined-datatypes.md index 9d2c20dec..952132fa6 100644 --- a/mpi/docs/zz-user-defined-datatypes.md +++ b/mpi/docs/zz-user-defined-datatypes.md @@ -385,168 +385,3 @@ MPI_Send(particle, 1000*sizeof(particle[0]), MPI_BYTE, ...); - Ensuring the correct extent of the derived data type is important - MPI provides constructors for several specific types - -# User-defined datatypes: other datatype constructors {.section} - -# MPI_TYPE_CONTIGUOUS - -MPI_Type_contiguous(`count`{.input}, `oldtype`{.input}, `newtype`{.output}) - : `count`{.input} - : number of oldtypes - : `oldtype`{.input} - : old type - : `newtype`{.output} - : new datatype - -- Usage mainly for programming convenience - - derived types in all communication calls - - -
-```fortranfree -! Using derived type -call mpi_send(buf, 1, conttype, ...) -``` -
-
-```fortranfree -! Equivalent call with count and basic type -call mpi_send(buf, count, MPI_REAL, ...) -``` -
-
- - -# MPI_TYPE_INDEXED {.split-def-3} - -- Creates a new type from blocks comprising identical elements - - The size and displacements of the blocks may vary - -MPI_Type_indexed(`count`{.input}, `blocklens`{.input}, `displs`{.input}, `oldtype`{.input}, `newtype`{.output}) - : `count`{.input} - : number of blocks - - `blocklens`{.input} - : lengths of the blocks (array) - - `displs`{.input} - : displacements (array) in extent of oldtypes - - `oldtype`{.input} - : original type - - `newtype`{.output} - : new type - - `-`{.ghost} - : `-`{.ghost} - -

-![](img/type_indexed.png){.center width=100%} - -# Example: an upper triangular matrix - -

-```c -/* Upper triangular matrix */ -double a[100][100]; -int disp[100], blocklen[100], int i; -MPI_Datatype upper; -/* compute start and size of rows */ -for (i=0; i<100; i++) { - disp[i] = 100*i+i; - blocklen[i] = 100-­i; -} -/* create a datatype for upper tr matrix */ -MPI_Type_indexed(100,blocklen,disp, - MPI_DOUBLE,&upper); -MPI_Type_commit(&upper); -/* ... send it ... */ -MPI_Send(a,1,upper,dest, tag, MPI_COMM_WORLD); -MPI_Type_free(&upper); -``` -
- -
-![](img/triangle.png){.center width=65%} -
- -# Subarray - -
-- Subarray datatype describes a N-dimensional subarray within a -N-dimensional array -- Array can have either C (row major) or Fortran (column major) -ordering in memory -
- -
-![](img/subarray.png){.center width=60%} -
- - -# MPI_TYPE_CREATE_SUBARRAY {.split-def-3} - - -MPI_Type_create_subarray(`ndims`{.input}, `sizes`{.input}, `subsizes`{.input}, `offsets`{.input}, `order`{.input}, `oldtype`{.input}, `newtype`{.output}) - : `ndims`{.input} - : number of array dimensions - - `sizes`{.input} - : number of array elements in each dimension (array) - - `subsizes`{.input} - : number of subarray elements in each dimension (array) - - `offsets`{.input} - : starting point of subarray in each dimension (array) - - `order`{.input} - : storage order of the array. Either `MPI_ORDER_C` or - `MPI_ORDER_FORTRAN` - - `oldtype`{.input} - : oldtype - - `newtype`{.output} - : resulting type - - `-`{.ghost} - : `-`{.ghost} - -# Example: subarray - -
- -```c -int a_size[2] = {5,5}; -int sub_size[2] = {2,3}; -int sub_start[2] = {1,2}; -MPI_Datatype sub_type; -double array[5][5]; - -for(i = 0; i < a_size[0]; i++) - for(j = 0; j < a_size[1]; j++) - array[i][j] = rank; - -MPI_Type_create_subarray(2, a_size, sub_size, - sub_start, MPI_ORDER_C, MPI_DOUBLE, &sub_type); - -MPI_Type_commit(&sub_type); - -if (rank==0) - MPI_Recv(array[0], 1, sub_type, 1, 123, - MPI_COMM_WORLD, MPI_STATUS_IGNORE); -if (rank==1) - MPI_Send(array[0], 1, sub_type, 0, 123, - MPI_COMM_WORLD); - -MPI_Type_free(&sub_type); - -``` - -
-
-![](img/type_array.png){.center width=100%} -