92
    CALL MPI_TYPE_HVECTOR(9, 1, 100*sizeofreal, oneslice, twoslice,  ierr) 
!   создает тип данных для секции в целом 
    CALL MPI_TYPE_HVECTOR( 9, 1, 100*100*sizeofreal, twoslice, threeslice, ierr) 
    CALL MPI_TYPE_COMMIT( threeslice, ierr) 
    CALL MPI_SENDRECV(a(1,3,2), 1, threeslice, myrank, 0,e, 9*9*9, REAL, 
                                               myrank, 0,MPI_COMM_WORLD, status, ierr) 
Пример 3.22. Копирование  нижней треугольной части матрицы 
    REAL a(100,100), b(100,100) 
    INTEGER  disp(100), blocklen(100), ltype, myrank, ierr 
    INTEGER status(MPI_STATUS_SIZE) 
!    копирует нижнюю треугольную часть массива a  в нижнюю  
!    треугольную часть массива b 
    CALL MPI_COMM_RANK(MPI_COMM_WORLD, myrank) 
!    вычисляет начало и размер каждого столбца 
   
 DO i=1, 100 
           disp(i) = 100*(i-1) + i 
           block(i) = 100-i 
    END DO 
!   создает тип данных для нижней треугольной части 
    CALL MPI_TYPE_INDEXED(100,block, disp, MPI_REAL, ltype, ierr) 
    CALL MPI_TYPE_COMMIT(ltype, ierr) 
    CALL MPI_SENDRECV(a, 1, ltype, myrank, 0, b, 1, ltype, myrank, 0, 
                                               MPI_COMM_WORLD,status, ierr) 
Пример 3.23. Транспонирование матрицы. 
    REAL a(100,100), b(100,100) 
    INTEGER row, xpose, sizeofreal, myrank, ierr 
    INTEGER status(MPI_STATUS_SIZE) 
!   транспонирование матрицы  a в матрицу b 
    CALL MPI_COMM_RANK(MPI_COMM_WORLD, myrank) 
    CALL MPI_TYPE_EXTENT( MPI_REAL, sizeofreal, ierr) 
!   создание типа данных для одной строки 
    CALL MPI_TYPE_VECTOR( 100, 1, 100, MPI_REAL, row, ierr) 
!    создание типа данных для матрицы с расположением по строкам
    CALL MPI_TYPE_HVECTOR( 100, 1, sizeofreal, row, xpose, ierr) 
    CALL MPI_TYPE_COMMIT( xpose, ierr) 
!   посылка матрицы с расположением по строкам 
!   и получение матрицы с расположением по столбцам 
    CALL MPI_SENDRECV( a, 1, xpose, myrank, 0, b, 100*100,              
                                    MPI_REAL, myrank, 0, MPI_COMM_WORLD, status,ierr) 
Пример 3.24.  Другой способ транспонирования матрицы.