/*
** MPI_Type_get_extent and MPI_Type_create_resized example
** Copyright Rolf Riesen 2008
**
*/
#include <stdio.h>
#include <stdlib.h>     /* For malloc() */
#include <string.h>     /* For memset() */
#include <mpi.h>



int
main(int argc, char *argv[])
{

int my_rank, nproc;
int n;
int count;
int blocklength;
int stride;
MPI_Datatype column_t, row_t;
MPI_Aint lb_int, extent_int;
MPI_Aint lb_double, extent_double;
MPI_Aint lb_row, extent_row;
MPI_Aint lb_column, extent_column;
int size_int;
int size_double;
int size_row;
int size_column;



    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &nproc);
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);


    /* Create a data type describing a row of our array */
    n= 8;
    MPI_Type_contiguous(n, MPI_CHAR, &row_t);
    MPI_Type_commit(&row_t);


    /*
    ** Create a data type that consists of ONE column
    ** of an array of size n * n
    */
    count= n;
    blocklength= 1;
    stride= n;
    MPI_Type_vector(count, blocklength, stride, MPI_CHAR, &column_t);



    /* Print some info about the type we created */
    MPI_Type_get_extent(MPI_INT, &lb_int, &extent_int);
    MPI_Type_size(MPI_INT, &size_int);
    MPI_Type_get_extent(MPI_DOUBLE, &lb_double, &extent_double);
    MPI_Type_size(MPI_DOUBLE, &size_double);
    MPI_Type_get_extent(row_t, &lb_row, &extent_row);
    MPI_Type_size(row_t, &size_row);
    MPI_Type_get_extent(column_t, &lb_column, &extent_column);
    MPI_Type_size(column_t, &size_column);



    printf("Type         LB   Extent   Size\n");
    printf("-----------+----+--------+-----\n");
    printf("MPI_INT      %2lld     %3lld    %3lld\n",
	    (long long)lb_int, (long long)extent_int,
	    (long long)size_int);
    printf("MPI_DOUBLE   %2lld     %3lld    %3lld\n",
	    (long long)lb_double, (long long)extent_double,
	    (long long)size_double);
    printf("row_t        %2lld     %3lld    %3lld\n",
	    (long long)lb_row, (long long)extent_row,
	    (long long)size_row);
    printf("column_t     %2lld     %3lld    %3lld\n",
	    (long long)lb_column, (long long)extent_column,
	    (long long)size_column);


    MPI_Finalize();
    return 0;

}  /* end of main() */
