inline MPI_Request MyMPI_IRecv (FlatArray<T, BASE> s, int dest)
 {
   MPI_Request request;
   MPI_Irecv( &s.First(), s.Size(), MyGetMPIType<T>(), dest, 1, MPI_COMM_WORLD, &request);
   return request;
   // MPI_Request_free (&request);
 }
 inline void MyMPI_Recv ( FlatArray<T, BASE> s, int src, int tag)
 {
   MPI_Status status;
   MPI_Recv( &s.First(), s.Size(), MyGetMPIType<T>(), src, tag, MPI_COMM_WORLD, &status);
 }
 inline void MyMPI_Send (FlatArray<T, BASE> s, int dest, int tag)
 {
   MPI_Send( &s.First(), s.Size(), MyGetMPIType<T>(), dest, tag, MPI_COMM_WORLD);
 }
 inline MPI_Request MyMPI_IRecv (FlatArray<T, BASE> s, int dest, int tag, MPI_Comm comm = MPI_COMM_WORLD)
 {
   MPI_Request request;
   MPI_Irecv( &s.First(), s.Size(), MyGetMPIType<T>(), dest, tag, comm, &request);
   return request;
 }
 inline void MyMPI_IRecvTag (FlatArray<T, BASE> s, int dest, int tag, MPI_Request & request)
 {
   MPI_Irecv( &s.First(), s.Size(), MyGetMPIType<T>(), dest, tag, MPI_COMM_WORLD, & request);
 }
 inline void MyMPI_ISend (FlatArray<T, BASE> s, int dest, MPI_Request & request)
 {
   MPI_Isend( &s.First(), s.Size(), MyGetMPIType<T>(), dest, 1, MPI_COMM_WORLD, & request);
 }