15 & MYROW, MYCOL, NPROW, NPCOL,
16 & A, LOCAL_M, LOCAL_N, N, MYID, COMM )
18 INTEGER BLOCK_SIZE, NPROW, NPCOL, LOCAL_M, LOCAL_N, N, COMM
19 INTEGER MYROW, MYCOL, MYID
20 DOUBLE PRECISION BUF( BLOCK_SIZE * BLOCK_SIZE )
21 DOUBLE PRECISION A( LOCAL_M, LOCAL_N )
22 INTEGER NBLOCK, IBLOCK, JBLOCK, IBLOCK_SIZE, JBLOCK_SIZE
23 INTEGER ROW_SOURCE, ROW_DEST, COL_SOURCE, COL_DEST
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
30 IF ( iblock .NE. nblock
32 iblock_size = block_size
34 iblock_size = n - ( nblock - 1 ) * block_size
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
46 IF ( jblock .NE. nblock
48 jblock_size = block_size
50 jblock_size = n - ( nblock - 1 ) * block_size
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'
72 & iblock_size, local_m )
75 & a( irow_loc_source, jcol_loc_source ),
76 & a( irow_loc_dest, jcol_loc_dest ),
77 & iblock_size, jblock_size, local_m )
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 )
124 INTEGER LDA, M, N, COMM, SOURCE
125 DOUBLE PRECISION BUF(*), A( LDA, *)
126 INTEGER I, IBUF, IERR
128 include
'mumps_tags.h'
129 INTEGER :: STATUS(MPI_STATUS_SIZE)
130 CALL mpi_recv( buf(1), m * n, mpi_double_precision, source,
131 & symmetrize, comm, status, ierr )
134 CALL dcopy( n, buf(ibuf), 1, a(i,1), lda )