Sending and receiving staggered blocks out of a 2-dim array
_____________________________________________________________
!. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .|
|a . . . . . . . . b b . . . . . . . . c c . . . . . . . . a|
|a a . . . . . . b b b b . . . . . . c c c c . . . . . . a a|
|a a a . . . . b b b b b b . . . . c c c c c c . . . . a a a|
|a a a a . . b b b b b b b b . . c c c c c c c c . . a a a a|
|a a a a a b b b b b b b b b b c c c c c c c c c c a a a a a|
|a a a a A A b b b b b b b b B B c c c c c c c c C C a a a a|
|a a a A A A A b b b b b b B B B B c c c c c c C C C C a a a|
|a a A A A A A A b b b b B B B B B B c c c c C C C C C C a a|
|a A A A A A A A A b b B B B B B B B B c c C C C C C C C C a|
|A A A A A A A A A A B B B B B B B B B B C C C C C C C C C C|
|. A A A A A A A A . . B B B B B B B B . . C C C C C C C C .|
|. . A A A A A A . . . . B B B B B B . . . . C C C C C C . .|
|. . . A A A A . . . . . . B B B B . . . . . . C C C C . . .|
|. . . . A A . . . . . . . . B B . . . . . . . . C C . . . .|
-------------------------------------------------------------

_____________________________________________________________
!. . . .|. . . . + + * * . . . .|. . . . . . . . . . . . . .|
|a . . .|. . . + + b b * * . . .|. . . c c . . . . . . . . a|
|a a . .|. . + + b b b b * * . .|. . c c c c . . . . . . a a|
|a a a .|. + + b b b b b b * * .|. c c c c c c . . . . a a a|
|a a a a|+ + b b b b b b b b * *|c c c c c c c c . . a a a a|
|a a a a|a b b b b b b b b b b c|c c c c c c c c c a a a a a|
|a a a a|A A b b b b b b b b B B|c c c c c c c c C C a a a a|
|a a a A|A A A b b b b b b B B B|B c c c c c c C C C C a a a|
|a a A A|A A A A b b b b B B B B|B B c c c c C C C C C C a a|
|a A A A|A A A A A b b B B B B B|B B B c c C C C C C C C C a|
|A A A A-A-A-A-A-A-A-B-B-B-B-B-B-B B B B C C C C C C C C C C|
|. A A A A A A A A . . B B B B B B B B . . C C C C C C C C .|
|. . A A A A A A . . . . B B B B B B . . . . C C C C C C . .|
|. . . A A A A . . . . . . B B B B . . . . . . C C C C . . .|
|. . . . A A . . . . . . . . B B . . . . . . . . C C . . . .|
|. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .|

_____________________________________________________________
!. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .|
|a . . . . . . . . b b . . . . . . . . c c . . . . . . . . a|
|a a . . . . . . b b b b . . . . . . c c c c . . . . . . a a|
|a a a . . . . b b b b b b . . . . c c c c c c . . . . a a a|
|a a a a . . b b b_b_b_b_b_b_._._c_c_c_c_c_c c c . . a a a a|
|a a a a a b b b b|b b b b b b c c c c c c|c c c c a a a a a|
|a a a a A A b b b|b b b b b B B c c c c c|c c c C C a a a a|
|a a a A A A A b b|b b b b B B B B c c c c|c c C C C C a a a|
|a a A A A A A A b|b b b B B B B B B c c c|c C C C C C C a a|
|a A A A A A A A A|b b B B B B B B B B c c|C C C C C C C C a|
|A A A A A A A A A|A B B B B B B B B B B C|C C C C C C C C C|
|. A A A A A A A A|. . B B B B B B B B . .|C C C C C C C C .|
|. . A A A A A A .|. . . B B B B B B . . .|. C C C C C C . .|
|. . . A A A A . .|. . . . B B B B . . . .|. . C C C C . . .|
|. . . . A A . . .|. . . . . B B . . . . .|. . . C C . . . .|
|. . . . . . . . .-------------------------. . . . . . . . .|

MPI_Type_vector( int count, 
		 int blocklen,
		 int stride. 
		 MPI_Datatype element_type, 
		 MPI_Datatype* new_type)

N is 30, p is 3, m = N/p is 10

// preparation for next step
int A[12][10];
MPI_Datatype Staggered_pairs);
MPI_Type_vector(5, 2, 13, MPI_INT, &Staggered_pairs);
MPI_Type_commit(&Staggered_pairs);
MPI_Send(&(A[5][1]), 1, Staggered_pairs, left_nbr, 0, MPI_COMM_WORLD);
MPI_Recv(&(A[0][6]), 1, Staggered_pairs, right_nb	, 0, MPI_COMM_WORLD);
for (int i = 0; i < m/2; ++i)
{
   A[i][j-i] = A[i+k][j-i+k];  A[i][j-i+1] = A[i+k][j-i+k+1];
}
   // [0][5] <-- [5][9],  [0][6] <-- [5][10]
   // [1][4] <-- [6][8],  [1][4] <-- [6][9]
   // [2][3] <-- [7][7],  [2][3] <-- [7][8]
   // ...
   // j is k is m/2

Scattering a section of an array to each process:

When send array size is N, with p processes
=> counts are N/p, recvbuf must have N/p space.

...When p doesn't evenly divide N ? 

MPI_Scatter(void* sendbuf, // buffer of size sendcount*p.
 	    int sendcount, // (wierdly) same as recvcount.
	    MPI_Datatype sendtype, // generally same as recvtype
	    // the above 3 send parameters signify for root only.
            void* recvbuf, // r-th block of recvcount items go here.
	    int recvcount,  // note that all recv a block, including root.
	    MPI_Datatype recvtype,
	    int root, // the rank of the sender (scatterer)
	    MPI_Comm comm)

