17 IMPLICIT NONE
18 INTEGER BLOCK_SIZE, NPROW, NPCOL, LOCAL_M, LOCAL_N, N, COMM
19 INTEGER MYROW, MYCOL, MYID
20 REAL BUF( BLOCK_SIZE * BLOCK_SIZE )
21 REAL A( LOCAL_M, LOCAL_N )
22 INTEGER NBLOCK, IBLOCK, JBLOCK, IBLOCK_SIZE, JBLOCK_SIZE
23 INTEGER ROW_SOURCE, ROW_DEST, COL_SOURCE, COL_DEST
24 INTEGER IGLOB, JGLOB
25 INTEGER IROW_LOC_SOURCE, JCOL_LOC_SOURCE
26 INTEGER IROW_LOC_DEST, JCOL_LOC_DEST
27 INTEGER PROC_SOURCE, PROC_DEST
28 nblock = ( n - 1 ) / block_size + 1
29 DO iblock = 1, nblock
30 IF ( iblock .NE. nblock
31 & ) THEN
32 iblock_size = block_size
33 ELSE
34 iblock_size = n - ( nblock - 1 ) * block_size
35 END IF
36 row_source = mod( iblock - 1, nprow )
37 col_dest = mod( iblock - 1, npcol )
38 iglob = ( iblock - 1 ) * block_size + 1
39 irow_loc_source = block_size *
40 & ( ( iglob - 1 ) / (block_size*nprow) )
41 & + mod( iglob - 1, block_size ) + 1
42 jcol_loc_dest = block_size *
43 & ( ( iglob - 1 ) / (block_size*npcol) )
44 & + mod( iglob - 1, block_size ) + 1
45 DO jblock = 1, iblock
46 IF ( jblock .NE. nblock
47 & ) THEN
48 jblock_size = block_size
49 ELSE
50 jblock_size = n - ( nblock - 1 ) * block_size
51 END IF
52 col_source = mod( jblock - 1, npcol )
53 row_dest = mod( jblock - 1, nprow )
54 proc_source = row_source * npcol + col_source
55 proc_dest = row_dest * npcol + col_dest
56 IF ( proc_source .eq. proc_dest ) THEN
57 IF ( myid .eq. proc_dest ) THEN
58 jglob = ( jblock - 1 ) * block_size + 1
59 jcol_loc_source = block_size *
60 & ( ( jglob - 1 ) / (block_size*npcol) )
61 & + mod( jglob - 1, block_size ) + 1
62 irow_loc_dest = block_size *
63 & ( ( jglob - 1 ) / (block_size*nprow) )
64 & + mod( jglob - 1, block_size ) + 1
65 IF ( iblock .eq. jblock ) THEN
66 IF ( iblock_size .ne. jblock_size ) THEN
67 WRITE(*,*) myid,': Error in calling transdiag:unsym'
69 END IF
71 & jcol_loc_source),
72 & iblock_size, local_m )
73 ELSE
75 & a( irow_loc_source, jcol_loc_source ),
76 & a( irow_loc_dest, jcol_loc_dest ),
77 & iblock_size, jblock_size, local_m )
78 END IF
79 END IF
80 ELSE IF ( myrow .eq. row_source
81 & .AND. mycol .eq. col_source ) THEN
82 jglob = ( jblock - 1 ) * block_size + 1
83 jcol_loc_source = block_size *
84 & ( ( jglob - 1 ) / (block_size*npcol) )
85 & + mod( jglob - 1, block_size ) + 1
87 & a( irow_loc_source, jcol_loc_source ), local_m,
88 & iblock_size, jblock_size, comm, proc_dest )
89 ELSE IF ( myrow .eq. row_dest
90 & .AND. mycol .eq. col_dest ) THEN
91 jglob = ( jblock - 1 ) * block_size + 1
92 irow_loc_dest = block_size *
93 & ( ( jglob - 1 ) / (block_size*nprow) )
94 & + mod( jglob - 1, block_size ) + 1
96 & a( irow_loc_dest, jcol_loc_dest ), local_m,
97 & jblock_size, iblock_size, comm, proc_source )
98 END IF
99 END DO
100 END DO
101 RETURN
subroutine smumps_send_block(buf, a, lda, m, n, comm, dest)
subroutine smumps_transpo(a1, a2, m, n, ld)
subroutine smumps_trans_diag(a, n, lda)
subroutine smumps_recv_block(buf, a, lda, m, n, comm, source)