1 SUBROUTINE pzoptee( ICTXT, NOUT, SUBPTR, SCODE, SNAME )
9 INTEGER ICTXT, NOUT, SCODE
156 IF( scode.EQ.21 )
THEN
161 CALL pzchkopt( ictxt, nout, subptr, scode, sname,
'A', apos )
163 ELSE IF( scode.EQ.22 .OR. scode.EQ.25 .OR. scode.EQ.26 .OR.
169 CALL pzchkopt( ictxt, nout, subptr, scode, sname,
'U', apos )
171 ELSE IF( scode.EQ.23 )
THEN
176 CALL pzchkopt( ictxt, nout, subptr, scode, sname,
'U', apos )
181 CALL pzchkopt( ictxt, nout, subptr, scode, sname,
'A', apos )
186 CALL pzchkopt( ictxt, nout, subptr, scode, sname,
'D', apos )
190 ELSE IF( scode.EQ.31 )
THEN
195 CALL pzchkopt( ictxt, nout, subptr, scode, sname,
'A', apos )
200 CALL pzchkopt( ictxt, nout, subptr, scode, sname,
'B', apos )
202 ELSE IF( scode.EQ.32 )
THEN
207 CALL pzchkopt( ictxt, nout, subptr, scode, sname,
'S', apos )
212 CALL pzchkopt( ictxt, nout, subptr, scode, sname,
'U', apos )
214 ELSE IF( scode.EQ.33 .OR. scode.EQ.34 .OR. scode.EQ.35 .OR.
215 $ scode.EQ.36 .OR. scode.EQ.40 )
THEN
220 CALL pzchkopt( ictxt, nout, subptr, scode, sname,
'U', apos )
225 CALL pzchkopt( ictxt, nout, subptr, scode, sname,
'A', apos )
227 ELSE IF( scode.EQ.38 )
THEN
232 CALL pzchkopt( ictxt, nout, subptr, scode, sname,
'S', apos )
237 CALL pzchkopt( ictxt, nout, subptr, scode, sname,
'U', apos )
242 CALL pzchkopt( ictxt, nout, subptr, scode, sname,
'A', apos )
247 CALL pzchkopt( ictxt, nout, subptr, scode, sname,
'D', apos )
250 ELSE IF( scode.EQ.39 )
THEN
255 CALL pzchkopt( ictxt, nout, subptr, scode, sname,
'A', apos )
264 SUBROUTINE pzchkopt( ICTXT, NOUT, SUBPTR, SCODE, SNAME, ARGNAM,
274 INTEGER ARGPOS, ICTXT, NOUT, SCODE
399 CHARACTER DIAG, SIDE, TRANSA, TRANSB, UPLO
400 COMMON /pblasc/diag, side, transa, transb, uplo
408 IF( lsame( argnam,
'D' ) )
THEN
414 ELSE IF( lsame( argnam,
'S' ) )
THEN
420 ELSE IF( lsame( argnam,
'A' ) )
THEN
426 ELSE IF( lsame( argnam,
'B' ) )
THEN
432 ELSE IF( lsame( argnam,
'U' ) )
THEN
447 CALL pchkpbe( ictxt, nout, sname, infot )
454 SUBROUTINE pzdimee( ICTXT, NOUT, SUBPTR, SCODE, SNAME )
462 INTEGER ICTXT, NOUT, SCODE
609 IF( scode.EQ.11 .OR. scode.EQ.12 .OR. scode.EQ.13 .OR.
610 $ scode.EQ.14 .OR. scode.EQ.15 )
THEN
615 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
619 ELSE IF( scode.EQ.21 )
THEN
624 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'M', apos )
629 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
631 ELSE IF( scode.EQ.22 .OR. scode.EQ.25 .OR. scode.EQ.26 .OR.
637 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
639 ELSE IF( scode.EQ.23 )
THEN
644 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
646 ELSE IF( scode.EQ.24 )
THEN
651 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'M', apos )
656 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
660 ELSE IF( scode.EQ.31 )
THEN
665 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'M', apos )
670 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
675 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'K', apos )
677 ELSE IF( scode.EQ.32 )
THEN
682 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'M', apos )
687 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
689 ELSE IF( scode.EQ.33 .OR. scode.EQ.34 .OR. scode.EQ.35 .OR.
695 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
700 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'K', apos )
702 ELSE IF( scode.EQ.37 )
THEN
707 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'M', apos )
712 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
714 ELSE IF( scode.EQ.38 )
THEN
719 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'M', apos )
724 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
726 ELSE IF( scode.EQ.39 )
THEN
731 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'M', apos )
736 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
738 ELSE IF( scode.EQ.40 )
THEN
743 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'M', apos )
748 CALL pzchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
757 SUBROUTINE pzchkdim( ICTXT, NOUT, SUBPTR, SCODE, SNAME, ARGNAM,
767 INTEGER ARGPOS, ICTXT, NOUT, SCODE
892 INTEGER KDIM, MDIM, NDIM
893 COMMON /PBLASN/KDIM, MDIM, NDIM
901 IF( lsame( argnam,
'M' ) )
THEN
907 ELSE IF( lsame( argnam,
'N' ) )
THEN
928 CALL pchkpbe( ictxt, nout, sname, infot )
935 SUBROUTINE pzvecee( ICTXT, NOUT, SUBPTR, SCODE, SNAME )
943 INTEGER ICTXT, NOUT, SCODE
1092 IF( scode.EQ.11 )
THEN
1097 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'X', apos )
1102 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'Y', apos )
1104 ELSE IF( scode.EQ.12 .OR. scode.EQ.15 )
THEN
1109 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'X', apos )
1111 ELSE IF( scode.EQ.13 )
THEN
1116 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'X', apos )
1121 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'Y', apos )
1123 ELSE IF( scode.EQ.14 )
THEN
1128 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'X', apos )
1132 ELSE IF( scode.EQ.21 )
THEN
1137 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'X', apos )
1142 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'Y', apos )
1144 ELSE IF( scode.EQ.22 )
THEN
1149 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'X', apos )
1154 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'Y', apos )
1156 ELSE IF( scode.EQ.23 )
THEN
1161 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'X', apos )
1163 ELSE IF( scode.EQ.24 .OR. scode.EQ.27 )
THEN
1168 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'X', apos )
1173 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'Y', apos )
1175 ELSE IF( scode.EQ.26 .OR. scode.EQ.27 )
THEN
1180 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'X', apos )
1189 SUBROUTINE pzmatee( ICTXT, NOUT, SUBPTR, SCODE, SNAME )
1197 INTEGER ICTXT, NOUT, SCODE
1346 IF( scode.EQ.21 .OR. scode.EQ.23 )
THEN
1351 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1353 ELSE IF( scode.EQ.22 )
THEN
1358 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1360 ELSE IF( scode.EQ.24 .OR. scode.EQ.27 )
THEN
1365 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1367 ELSE IF( scode.EQ.25 .OR. scode.EQ.26 )
THEN
1372 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1376 ELSE IF( scode.EQ.31 )
THEN
1381 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1386 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'B', apos )
1391 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'C', apos )
1393 ELSE IF( scode.EQ.32 .OR. scode.EQ.35 .OR. scode.EQ.36 )
THEN
1398 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1403 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'B', apos )
1408 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'C', apos )
1410 ELSE IF( scode.EQ.33 .OR. scode.EQ.34 )
THEN
1415 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1420 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'C', apos )
1422 ELSE IF( scode.EQ.37 )
THEN
1427 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1432 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'C', apos )
1434 ELSE IF( scode.EQ.38 )
THEN
1439 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1444 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'B', apos )
1446 ELSE IF( scode.EQ.39 )
THEN
1451 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1456 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'C', apos )
1458 ELSE IF( scode.EQ.40 )
THEN
1463 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1468 CALL pzchkmat( ictxt, nout, subptr, scode, sname,
'C', apos )
1570 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
1571 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
1573 parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
1574 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
1575 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
1576 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
1577 DOUBLE PRECISION RONE
1579 parameter( one = ( 1.0d+0, 0.0d+0 ),
1586 CHARACTER*1 DIAG, SIDE, TRANSA, TRANSB, UPLO
1587 INTEGER IA, IB, IC, INCX, INCY, ISCLR, IX, IY, JA, JB,
1588 $ jc, jx, jy, kdim, mdim, ndim
1589 DOUBLE PRECISION USCLR
1591 INTEGER DESCA( DLEN_ ), DESCB( DLEN_ ), DESCC( DLEN_ ),
1592 $ descx( dlen_ ), descy( dlen_ )
1593 COMPLEX*16 A( 2, 2 ), B( 2, 2 ), C( 2, 2 ), X( 2 ), Y( 2 )
1594 COMMON /PBLASC/DIAG, SIDE, TRANSA, TRANSB, UPLO
1595 COMMON /pblasd/desca, descb, descc, descx, descy
1596 COMMON /pblasi/ia, ib, ic, incx, incy, isclr, ix, iy,
1597 $ ja, jb, jc, jx, jy
1598 COMMON /pblasm/a, b, c
1599 COMMON /pblasn/kdim, mdim, ndim
1600 COMMON /pblass/sclr, usclr
1630 CALL pb_descset2( desca, 2, 2, 1, 1, 1, 1, 0, 0, ictxt, 2 )
1640 CALL pb_descset2( descb, 2, 2, 1, 1, 1, 1, 0, 0, ictxt, 2 )
1650 CALL pb_descset2( descc, 2, 2, 1, 1, 1, 1, 0, 0, ictxt, 2 )
1658 CALL pb_descset2( descx, 2, 1, 1, 1, 1, 1, 0, 0, ictxt, 2 )
1667 CALL pb_descset2( descy, 2, 1, 1, 1, 1, 1, 0, 0, ictxt, 2 )
1675 SUBROUTINE pzchkmat( ICTXT, NOUT, SUBPTR, SCODE, SNAME, ARGNAM,
1685 INTEGER ARGPOS, ICTXT, NOUT, SCODE
1801 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
1802 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
1804 parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
1805 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
1806 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
1807 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
1809 PARAMETER ( DESCMULT = 100 )
1812 INTEGER I, INFOT, NPROW, NPCOL, MYROW, MYCOL
1822 INTEGER IA, IB, IC, INCX, INCY, ISCLR, IX, IY, JA, JB,
1824 INTEGER DESCA( DLEN_ ), DESCB( DLEN_ ), DESCC( DLEN_ ),
1825 $ descx( dlen_ ), descy( dlen_ )
1826 COMMON /pblasd/desca, descb, descc, descx, descy
1827 COMMON /pblasi/ia, ib, ic, incx, incy, isclr, ix, iy,
1828 $ ja, jb, jc, jx, jy
1832 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
1834 IF( lsame( argnam,
'A' ) )
THEN
1842 CALL pchkpbe( ictxt, nout, sname, infot )
1850 CALL pchkpbe( ictxt, nout, sname, infot )
1860 infot = ( ( argpos + 3 ) * descmult ) + i
1862 CALL pchkpbe( ictxt, nout, sname, infot )
1866 IF( ( i.EQ.rsrc_ ) .OR. ( i.EQ.csrc_ ) .OR.
1867 $ ( i.EQ.lld_ ) )
THEN
1874 $ desca( i ) = nprow
1879 $ desca( i ) = npcol
1883 IF( i.EQ.lld_ )
THEN
1884 IF( myrow.EQ.0 .AND.mycol.EQ.0 )
THEN
1891 infot = ( ( argpos + 3 ) * descmult ) + i
1893 CALL pchkpbe( ictxt, nout, sname, infot )
1899 ELSE IF( lsame( argnam,
'B' ) )
THEN
1907 CALL pchkpbe( ictxt, nout, sname, infot )
1915 CALL pchkpbe( ictxt, nout, sname, infot )
1925 infot = ( ( argpos + 3 ) * descmult ) + i
1927 CALL pchkpbe( ictxt, nout, sname, infot )
1931 IF( ( i.EQ.rsrc_ ) .OR. ( i.EQ.csrc_ ) .OR.
1932 $ ( i.EQ.lld_ ) )
THEN
1939 $ descb( i ) = nprow
1944 $ descb( i ) = npcol
1948 IF( i.EQ.lld_ )
THEN
1949 IF( myrow.EQ.0 .AND.mycol.EQ.0 )
THEN
1956 infot = ( ( argpos + 3 ) * descmult ) + i
1958 CALL pchkpbe( ictxt, nout, sname, infot )
1964 ELSE IF( lsame( argnam,
'C' ) )
THEN
1972 CALL pchkpbe( ictxt, nout, sname, infot )
1980 CALL pchkpbe( ictxt, nout, sname, infot )
1990 infot = ( ( argpos + 3 ) * descmult ) + i
1992 CALL pchkpbe( ictxt, nout, sname, infot )
1996 IF( ( i.EQ.rsrc_ ) .OR. ( i.EQ.csrc_ ) .OR.
1997 $ ( i.EQ.lld_ ) )
THEN
2004 $ descc( i ) = nprow
2009 $ descc( i ) = npcol
2013 IF( i.EQ.lld_ )
THEN
2014 IF( myrow.EQ.0 .AND.mycol.EQ.0 )
THEN
2021 infot = ( ( argpos + 3 ) * descmult ) + i
2023 CALL pchkpbe( ictxt, nout, sname, infot )
2029 ELSE IF( lsame( argnam,
'X' ) )
THEN
2037 CALL pchkpbe( ictxt, nout, sname, infot )
2045 CALL pchkpbe( ictxt, nout, sname, infot )
2055 infot = ( ( argpos + 3 ) * descmult ) + i
2057 CALL pchkpbe( ictxt, nout, sname, infot )
2061 IF( ( i.EQ.rsrc_ ) .OR. ( i.EQ.csrc_ ) .OR.
2062 $ ( i.EQ.lld_ ) )
THEN
2069 $ descx( i ) = nprow
2074 $ descx( i ) = npcol
2078 IF( i.EQ.lld_ )
THEN
2079 IF( myrow.EQ.0 .AND.mycol.EQ.0 )
THEN
2086 infot = ( ( argpos + 3 ) * descmult ) + i
2088 CALL pchkpbe( ictxt, nout, sname, infot )
2100 CALL pchkpbe( ictxt, nout, sname, infot )
2110 CALL pchkpbe( ictxt, nout, sname, infot )
2118 CALL pchkpbe( ictxt, nout, sname, infot )
2128 infot = ( ( argpos + 3 ) * descmult ) + i
2130 CALL pchkpbe( ictxt, nout, sname, infot )
2134 IF( ( i.EQ.rsrc_ ) .OR. ( i.EQ.csrc_ ) .OR.
2135 $ ( i.EQ.lld_ ) )
THEN
2142 $ descy( i ) = nprow
2147 $ descy( i ) = npcol
2151 IF( i.EQ.lld_ )
THEN
2152 IF( myrow.EQ.0 .AND.mycol.EQ.0 )
THEN
2159 infot = ( ( argpos + 3 ) * descmult ) + i
2161 CALL pchkpbe( ictxt, nout, sname, infot )
2173 CALL pchkpbe( ictxt, nout, sname, infot )
2311 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
2312 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
2314 parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
2315 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
2316 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
2317 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
2320 CHARACTER*1 DIAG, SIDE, TRANSA, TRANSB, UPLO
2321 INTEGER IA, IB, IC, INCX, INCY, ISCLR, IX, IY, JA, JB,
2322 $ JC, JX, JY, KDIM, MDIM, NDIM
2323 DOUBLE PRECISION USCLR
2325 INTEGER DESCA( DLEN_ ), DESCB( DLEN_ ), DESCC( DLEN_ ),
2326 $ descx( dlen_ ), descy( dlen_ )
2327 COMPLEX*16 A( 2, 2 ), B( 2, 2 ), C( 2, 2 ), X( 2 ), Y( 2 )
2328 COMMON /pblasc/diag, side, transa, transb, uplo
2329 COMMON /pblasd/desca, descb, descc, descx, descy
2330 COMMON /pblasi/ia, ib, ic, incx, incy, isclr, ix, iy,
2331 $ ja, jb, jc, jx, jy
2332 COMMON /pblasm/a, b, c
2333 COMMON /pblasn/kdim, mdim, ndim
2334 COMMON /pblass/sclr, usclr
2341 IF( scode.EQ.11 )
THEN
2343 CALL subptr( ndim, x, ix, jx, descx, incx, y, iy, jy, descy,
2346 ELSE IF( scode.EQ.12 )
THEN
2348 CALL subptr( ndim, sclr, x, ix, jx, descx, incx )
2350 ELSE IF( scode.EQ.13 )
THEN
2352 CALL subptr( ndim, sclr, x, ix, jx, descx, incx, y, iy, jy,
2355 ELSE IF( scode.EQ.14 )
THEN
2357 CALL subptr( ndim, sclr, isclr, x, ix, jx, descx, incx )
2359 ELSE IF( scode.EQ.15 )
THEN
2361 CALL subptr( ndim, usclr, x, ix, jx, descx, incx )
2365 ELSE IF( scode.EQ.21 )
THEN
2367 CALL subptr( transa, mdim, ndim, sclr, a, ia, ja, desca, x, ix,
2368 $ jx, descx, incx, sclr, y, iy, jy, descy, incy )
2370 ELSE IF( scode.EQ.22 )
THEN
2372 CALL subptr( uplo, ndim, sclr, a, ia, ja, desca, x, ix, jx,
2373 $ descx, incx, sclr, y, iy, jy, descy, incy )
2375 ELSE IF( scode.EQ.23 )
THEN
2377 CALL subptr( uplo, transa, diag, ndim, a, ia, ja, desca, x, ix,
2380 ELSE IF( scode.EQ.24 )
THEN
2382 CALL subptr( mdim, ndim, sclr, x, ix, jx, descx, incx, y, iy,
2383 $ jy, descy, incy, a, ia, ja, desca )
2385 ELSE IF( scode.EQ.25 )
THEN
2387 CALL subptr( uplo, ndim, sclr, x, ix, jx, descx, incx, a, ia,
2390 ELSE IF( scode.EQ.26 )
THEN
2392 CALL subptr( uplo, ndim, usclr, x, ix, jx, descx, incx, a, ia,
2395 ELSE IF( scode.EQ.27 )
THEN
2397 CALL subptr( uplo, ndim, sclr, x, ix, jx, descx, incx, y, iy,
2398 $ jy, descy, incy, a, ia, ja, desca )
2402 ELSE IF( scode.EQ.31 )
THEN
2404 CALL subptr( transa, transb, mdim, ndim, kdim, sclr, a, ia, ja,
2405 $ desca, b, ib, jb, descb, sclr, c, ic, jc, descc )
2407 ELSE IF( scode.EQ.32 )
THEN
2409 CALL subptr( side, uplo, mdim, ndim, sclr, a, ia, ja, desca, b,
2410 $ ib, jb, descb, sclr, c, ic, jc, descc )
2412 ELSE IF( scode.EQ.33 )
THEN
2414 CALL subptr( uplo, transa, ndim, kdim, sclr, a, ia, ja, desca,
2415 $ sclr, c, ic, jc, descc )
2417 ELSE IF( scode.EQ.34 )
THEN
2419 CALL subptr( uplo, transa, ndim, kdim, usclr, a, ia, ja, desca,
2420 $ usclr, c, ic, jc, descc )
2422 ELSE IF( scode.EQ.35 )
THEN
2424 CALL subptr( uplo, transa, ndim, kdim, sclr, a, ia, ja, desca,
2425 $ b, ib, jb, descb, sclr, c, ic, jc, descc )
2427 ELSE IF( scode.EQ.36 )
THEN
2429 CALL subptr( uplo, transa, ndim, kdim, sclr, a, ia, ja, desca,
2430 $ b, ib, jb, descb, usclr, c, ic, jc, descc )
2432 ELSE IF( scode.EQ.37 )
THEN
2434 CALL subptr( mdim, ndim, sclr, a, ia, ja, desca, sclr, c, ic,
2437 ELSE IF( scode.EQ.38 )
THEN
2439 CALL subptr( side, uplo, transa, diag, mdim, ndim, sclr, a, ia,
2440 $ ja, desca, b, ib, jb, descb )
2442 ELSE IF( scode.EQ.39 )
THEN
2444 CALL subptr( transa, mdim, ndim, sclr, a, ia, ja, desca, sclr,
2445 $ c, ic, jc, descc )
2447 ELSE IF( scode.EQ.40 )
THEN
2449 CALL subptr( uplo, transa, mdim, ndim, sclr, a, ia, ja, desca,
2450 $ sclr, c, ic, jc, descc )
2467 DOUBLE PRECISION ERR, ERRMAX
2562 DOUBLE PRECISION PDDIFF
2566 INTRINSIC abs, dble, dimag,
max
2570 err = abs( pddiff( dble( xtrue ), dble( x ) ) )
2571 err =
max( err, abs( pddiff( dimag( xtrue ), dimag( x ) ) ) )
2573 errmax =
max( errmax, err )
2580 SUBROUTINE pzchkvin( ERRMAX, N, X, PX, IX, JX, DESCX, INCX,
2589 INTEGER INCX, INFO, IX, JX, N
2590 DOUBLE PRECISION ERRMAX
2594 COMPLEX*16 PX( * ), X( * )
2718 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
2719 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
2721 PARAMETER ( BLOCK_CYCLIC_2D_INB = 2, dlen_ = 11,
2722 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
2723 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
2724 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
2725 DOUBLE PRECISION ZERO
2726 PARAMETER ( ZERO = 0.0d+0 )
2729 LOGICAL COLREP, ROWREP
2730 INTEGER I, IB, ICTXT, ICURCOL, ICURROW, IIX, IN, IXCOL,
2731 $ IXROW, J, JB, JJX, JN, KK, LDPX, LDX, LL,
2732 $ MYCOL, MYROW, NPCOL, NPROW
2733 DOUBLE PRECISION ERR, EPS
2739 DOUBLE PRECISION PDLAMCH
2743 INTRINSIC abs, dble, dimag,
max,
min, mod
2755 ictxt = descx( ctxt_ )
2756 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
2758 eps = pdlamch( ictxt,
'eps' )
2760 CALL pb_infog2l( ix, jx, descx, nprow, npcol, myrow, mycol, iix,
2761 $ jjx, ixrow, ixcol )
2764 ldpx = descx( lld_ )
2765 rowrep = ( ixrow.EQ.-1 )
2766 colrep = ( ixcol.EQ.-1 )
2770 IF( ( myrow.EQ.ixrow .OR. rowrep ) .AND.
2771 $ ( mycol.EQ.ixcol .OR. colrep ) )
2772 $
CALL pzerrset( err, errmax, x( ix+(jx-1)*ldx ),
2773 $ px( iix+(jjx-1)*ldpx ) )
2775 ELSE IF( incx.EQ.descx( m_ ) )
THEN
2779 jb = descx( inb_ ) - jx + 1
2781 $ jb = ( ( -jb ) / descx( nb_ ) + 1 ) * descx( nb_ ) + jb
2785 IF( myrow.EQ.ixrow .OR. rowrep )
THEN
2788 IF( mycol.EQ.icurcol .OR. colrep )
THEN
2790 CALL pzerrset( err, errmax, x( ix+(j-1)*ldx ),
2791 $ px( iix+(jjx-1)*ldpx ) )
2795 icurcol = mod( icurcol+1, npcol )
2797 DO 30 j = jn+1, jx+n-1, descx( nb_ )
2798 jb =
min( jx+n-j, descx( nb_ ) )
2800 IF( mycol.EQ.icurcol .OR. colrep )
THEN
2803 CALL pzerrset( err, errmax, x( ix+(j+kk-1)*ldx ),
2804 $ px( iix+(jjx+kk-1)*ldpx ) )
2811 icurcol = mod( icurcol+1, npcol )
2821 ib = descx( imb_ ) - ix + 1
2823 $ ib = ( ( -ib ) / descx( mb_ ) + 1 ) * descx( mb_ ) + ib
2827 IF( mycol.EQ.ixcol .OR. colrep )
THEN
2830 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
2832 CALL pzerrset( err, errmax, x( i+(jx-1)*ldx ),
2833 $ px( iix+(jjx-1)*ldpx ) )
2837 icurrow = mod( icurrow+1, nprow )
2839 DO 60 i = in+1, ix+n-1, descx( mb_ )
2840 ib =
min( ix+n-i, descx( mb_ ) )
2842 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
2845 CALL pzerrset( err, errmax, x( i+kk+(jx-1)*ldx ),
2846 $ px( iix+kk+(jjx-1)*ldpx ) )
2853 icurrow = mod( icurrow+1, nprow )
2861 CALL dgamx2d( ictxt,
'All',
' ', 1, 1, errmax, 1, kk, ll, -1,
2864 IF( errmax.GT.zero .AND. errmax.LE.eps )
THEN
2866 ELSE IF( errmax.GT.eps )
THEN
2883 INTEGER INCX, INFO, IX, JX, N
2887 COMPLEX*16 PX( * ), X( * )
3007 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
3008 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
3010 PARAMETER ( BLOCK_CYCLIC_2D_INB = 2, dlen_ = 11,
3011 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
3012 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
3013 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
3014 DOUBLE PRECISION ZERO
3015 PARAMETER ( ZERO = 0.0d+0 )
3018 LOGICAL COLREP, ROWREP
3019 INTEGER I, IB, ICTXT, ICURCOL, ICURROW, II, IMBX, INBX,
3020 $ J, JB, JJ, KK, LDPX, LDX, LL, MBX, MPALL,
3021 $ MYCOL, MYCOLDIST, MYROW, MYROWDIST, NBX, NPCOL,
3023 DOUBLE PRECISION EPS, ERR, ERRMAX
3026 EXTERNAL BLACS_GRIDINFO, DGAMX2D, PZERRSET
3030 DOUBLE PRECISION PDLAMCH
3031 EXTERNAL PDLAMCH, PB_NUMROC
3034 INTRINSIC abs, dble, dimag,
max,
min, mod
3043 IF( ( descx( m_ ).LE.0 ).OR.( descx( n_ ).LE.0 ) )
3048 ictxt = descx( ctxt_ )
3049 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
3051 eps = pdlamch( ictxt,
'eps' )
3053 mpall = pb_numroc( descx( m_ ), 1, descx( imb_ ), descx( mb_ ),
3054 $ myrow, descx( rsrc_ ), nprow )
3055 nqall = pb_numroc( descx( n_ ), 1, descx( inb_ ), descx( nb_ ),
3056 $ mycol, descx( csrc_ ), npcol )
3061 ldpx = descx( lld_ )
3062 icurrow = descx( rsrc_ )
3063 icurcol = descx( csrc_ )
3064 rowrep = ( icurrow.EQ.-1 )
3065 colrep = ( icurcol.EQ.-1 )
3066 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
3067 imbx = descx( imb_ )
3071 IF( mycol.EQ.icurcol .OR. colrep )
THEN
3072 inbx = descx( inb_ )
3079 myrowdist = mod( myrow - icurrow + nprow, nprow )
3084 mycoldist = mod( mycol - icurcol + npcol, npcol )
3089 IF( incx.EQ.descx( m_ ) )
THEN
3093 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
3096 IF( mycoldist.EQ.0 )
THEN
3099 j = descx( inb_ ) + ( mycoldist - 1 ) * nbx + 1
3101 jb =
min(
max( 0, descx( n_ ) - j + 1 ), inbx )
3102 ib =
min( descx( m_ ), descx( imb_ ) )
3106 IF( i+ll.NE.ix .OR. j+kk.LT.jx .OR. j+kk.GT.jx+n-1 )
3107 $
CALL pzerrset( err, errmax,
3108 $ x( i+ll+(j+kk-1)*ldx ),
3109 $ px( ii+ll+(jj+kk-1)*ldpx ) )
3115 j = j + inbx + ( npcol - 1 ) * nbx
3118 DO 50 jj = inbx+1, nqall, nbx
3119 jb =
min( nqall-jj+1, nbx )
3123 IF( i+ll.NE.ix .OR. j+kk.LT.jx .OR.
3125 $
CALL pzerrset( err, errmax,
3126 $ x( i+ll+(j+kk-1)*ldx ),
3127 $ px( ii+ll+(jj+kk-1)*ldpx ) )
3143 icurrow = mod( icurrow + 1, nprow )
3145 DO 110 i = descx( imb_ ) + 1, descx( m_ ), mbx
3146 ib =
min( descx( m_ ) - i + 1, mbx )
3148 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
3150 IF( mycoldist.EQ.0 )
THEN
3153 j = descx( inb_ ) + ( mycoldist - 1 ) * nbx + 1
3157 jb =
min(
max( 0, descx( n_ ) - j + 1 ), inbx )
3160 IF( i+ll.NE.ix .OR. j+kk.LT.jx .OR.
3162 $
CALL pzerrset( err, errmax,
3163 $ x( i+ll+(j+kk-1)*ldx ),
3164 $ px( ii+ll+(jj+kk-1)*ldpx ) )
3170 j = j + inbx + ( npcol - 1 ) * nbx
3173 DO 100 jj = inbx+1, nqall, nbx
3174 jb =
min( nqall-jj+1, nbx )
3178 IF( i+ll.NE.ix .OR. j+kk.LT.jx .OR.
3180 $
CALL pzerrset( err, errmax,
3181 $ x( i+ll+(j+kk-1)*ldx ),
3182 $ px( ii+ll+(jj+kk-1)*ldpx ) )
3198 icurrow = mod( icurrow + 1, nprow )
3206 IF( mycol.EQ.icurcol .OR. colrep )
THEN
3209 IF( myrowdist.EQ.0 )
THEN
3212 i = descx( imb_ ) + ( myrowdist - 1 ) * mbx + 1
3214 ib =
min(
max( 0, descx( m_ ) - i + 1 ), imbx )
3215 jb =
min( descx( n_ ), descx( inb_ ) )
3219 IF( j+kk.NE.jx .OR. i+ll.LT.ix .OR. i+ll.GT.ix+n-1 )
3220 $
CALL pzerrset( err, errmax,
3221 $ x( i+ll+(j+kk-1)*ldx ),
3222 $ px( ii+ll+(jj+kk-1)*ldpx ) )
3228 i = i + imbx + ( nprow - 1 ) * mbx
3231 DO 160 ii = imbx+1, mpall, mbx
3232 ib =
min( mpall-ii+1, mbx )
3236 IF( j+kk.NE.jx .OR. i+ll.LT.ix .OR.
3238 $
CALL pzerrset( err, errmax,
3239 $ x( i+ll+(j+kk-1)*ldx ),
3240 $ px( ii+ll+(jj+kk-1)*ldpx ) )
3256 icurcol = mod( icurcol + 1, npcol )
3258 DO 220 j = descx( inb_ ) + 1, descx( n_ ), nbx
3259 jb =
min( descx( n_ ) - j + 1, nbx )
3261 IF( mycol.EQ.icurcol .OR. colrep )
THEN
3263 IF( myrowdist.EQ.0 )
THEN
3266 i = descx( imb_ ) + ( myrowdist - 1 ) * mbx + 1
3270 ib =
min(
max( 0, descx( m_ ) - i + 1 ), imbx )
3273 IF( j+kk.NE.jx .OR. i+ll.LT.ix .OR.
3275 $
CALL pzerrset( err, errmax,
3276 $ x( i+ll+(j+kk-1)*ldx ),
3277 $ px( ii+ll+(jj+kk-1)*ldpx ) )
3283 i = i + imbx + ( nprow - 1 ) * mbx
3286 DO 210 ii = imbx+1, mpall, mbx
3287 ib =
min( mpall-ii+1, mbx )
3291 IF( j+kk.NE.jx .OR. i+ll.LT.ix .OR.
3293 $
CALL pzerrset( err, errmax,
3294 $ x( i+ll+(j+kk-1)*ldx ),
3295 $ px( ii+ll+(jj+kk-1)*ldpx ) )
3311 icurcol = mod( icurcol + 1, npcol )
3317 CALL dgamx2d( ictxt,
'All',
' ', 1, 1, errmax, 1, kk, ll, -1,
3320 IF( errmax.GT.zero .AND. errmax.LE.eps )
THEN
3322 ELSE IF( errmax.GT.eps )
THEN
3331 SUBROUTINE pzchkmin( ERRMAX, M, N, A, PA, IA, JA, DESCA, INFO )
3339 INTEGER IA, INFO, JA, M, N
3340 DOUBLE PRECISION ERRMAX
3344 COMPLEX*16 PA( * ), A( * )
3467 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
3468 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
3470 PARAMETER ( BLOCK_CYCLIC_2D_INB = 2, dlen_ = 11,
3471 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
3472 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
3473 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
3474 DOUBLE PRECISION ZERO
3475 PARAMETER ( ZERO = 0.0d+0 )
3478 LOGICAL COLREP, ROWREP
3479 INTEGER H, I, IACOL, IAROW, IB, ICTXT, ICURCOL,
3480 $ ICURROW, II, IIA, IN, J, JB, JJ, JJA, JN, K,
3481 $ KK, LDA, LDPA, LL, MYCOL, MYROW, NPCOL, NPROW
3482 DOUBLE PRECISION ERR, EPS
3488 DOUBLE PRECISION PDLAMCH
3492 INTRINSIC abs, dble, dimag,
max,
min, mod
3501 IF( ( m.EQ.0 ).OR.( n.EQ.0 ) )
3506 ictxt = desca( ctxt_ )
3507 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
3509 eps = pdlamch( ictxt,
'eps' )
3511 CALL pb_infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia,
3512 $ jja, iarow, iacol )
3517 ldpa = desca( lld_ )
3520 rowrep = ( iarow.EQ.-1 )
3521 colrep = ( iacol.EQ.-1 )
3525 jb = desca( inb_ ) - ja + 1
3527 $ jb = ( ( -jb ) / desca( nb_ ) + 1 ) * desca( nb_ ) + jb
3531 IF( mycol.EQ.icurcol .OR. colrep )
THEN
3534 ib = desca( imb_ ) - ia + 1
3536 $ ib = ( ( -ib ) / desca( mb_ ) + 1 ) * desca( mb_ ) + ib
3539 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
3541 CALL pzerrset( err, errmax, a( ia+k+(ja+h-1)*lda ),
3542 $ pa( ii+k+(jj+h-1)*ldpa ) )
3546 icurrow = mod( icurrow+1, nprow )
3550 DO 30 i = in+1, ia+m-1, desca( mb_ )
3551 ib =
min( desca( mb_ ), ia+m-i )
3552 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
3554 CALL pzerrset( err, errmax, a( i+k+(ja+h-1)*lda ),
3555 $ pa( ii+k+(jj+h-1)*ldpa ) )
3559 icurrow = mod( icurrow+1, nprow )
3570 icurcol = mod( icurcol+1, npcol )
3574 DO 90 j = jn+1, ja+n-1, desca( nb_ )
3575 jb =
min( desca( nb_ ), ja+n-j )
3576 IF( mycol.EQ.icurcol .OR. colrep )
THEN
3578 ib = desca( imb_ ) - ia + 1
3580 $ ib = ( ( -ib ) / desca( mb_ ) + 1 )*desca( mb_ ) + ib
3583 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
3585 CALL pzerrset( err, errmax, a( ia+k+(j+h-1)*lda ),
3586 $ pa( ii+k+(jj+h-1)*ldpa ) )
3590 icurrow = mod( icurrow+1, nprow )
3594 DO 70 i = in+1, ia+m-1, desca( mb_ )
3595 ib =
min( desca( mb_ ), ia+m-i )
3596 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
3599 $ a( i+k+(j+h-1)*lda ),
3600 $ pa( ii+k+(jj+h-1)*ldpa ) )
3604 icurrow = mod( icurrow+1, nprow )
3614 icurcol = mod( icurcol+1, npcol )
3618 CALL dgamx2d( ictxt,
'All',
' ', 1, 1, errmax, 1, kk, ll, -1,
3621 IF( errmax.GT.zero .AND. errmax.LE.eps )
THEN
3623 ELSE IF( errmax.GT.eps )
THEN
3640 INTEGER IA, INFO, JA, M, N
3644 COMPLEX*16 A( * ), PA( * )
3763 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
3764 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
3766 PARAMETER ( BLOCK_CYCLIC_2D_INB = 2, dlen_ = 11,
3767 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
3768 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
3769 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
3770 DOUBLE PRECISION ZERO
3771 PARAMETER ( ZERO = 0.0d+0 )
3774 LOGICAL COLREP, ROWREP
3775 INTEGER I, IB, ICTXT, ICURCOL, II, IMBA, J, JB, JJ, KK,
3776 $ LDA, LDPA, LL, MPALL, MYCOL, MYROW, MYROWDIST,
3778 DOUBLE PRECISION EPS, ERR, ERRMAX
3781 EXTERNAL blacs_gridinfo, dgamx2d,
pzerrset
3785 DOUBLE PRECISION PDLAMCH
3786 EXTERNAL PDLAMCH, PB_NUMROC
3798 IF( ( desca( m_ ).LE.0 ).OR.( desca( n_ ).LE.0 ) )
3803 ictxt = desca( ctxt_ )
3804 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
3806 eps = pdlamch( ictxt,
'eps' )
3808 mpall = pb_numroc( desca( m_ ), 1, desca( imb_ ), desca( mb_ ),
3809 $ myrow, desca( rsrc_ ), nprow )
3812 ldpa = desca( lld_ )
3816 rowrep = ( desca( rsrc_ ).EQ.-1 )
3817 colrep = ( desca( csrc_ ).EQ.-1 )
3818 icurcol = desca( csrc_ )
3819 IF( myrow.EQ.desca( rsrc_ ) .OR. rowrep )
THEN
3820 imba = desca( imb_ )
3827 myrowdist = mod( myrow - desca( rsrc_ ) + nprow, nprow )
3830 IF( mycol.EQ.icurcol .OR. colrep )
THEN
3833 IF( myrowdist.EQ.0 )
THEN
3836 i = desca( imb_ ) + ( myrowdist - 1 ) * desca( mb_ ) + 1
3838 ib =
min(
max( 0, desca( m_ ) - i + 1 ), imba )
3839 jb =
min( desca( n_ ), desca( inb_ ) )
3843 IF( i+ll.LT.ia .OR. i+ll.GT.ia+m-1 .OR.
3844 $ j+kk.LT.ja .OR. j+kk.GT.ja+n-1 )
3845 $
CALL pzerrset( err, errmax, a( i+ll+(j+kk-1)*lda ),
3846 $ pa( ii+ll+(jj+kk-1)*ldpa ) )
3852 i = i + imba + ( nprow - 1 ) * desca( mb_ )
3855 DO 50 ii = imba + 1, mpall, desca( mb_ )
3856 ib =
min( mpall-ii+1, desca( mb_ ) )
3860 IF( i+ll.LT.ia .OR. i+ll.GT.ia+m-1 .OR.
3861 $ j+kk.LT.ja .OR. j+kk.GT.ja+n-1 )
3863 $ a( i+ll+(j+kk-1)*lda ),
3864 $ pa( ii+ll+(jj+kk-1)*ldpa ) )
3869 i = i + desca( mb_ )
3871 i = i + nprow * desca( mb_ )
3880 icurcol = mod( icurcol + 1, npcol )
3882 DO 110 j = desca( inb_ ) + 1, desca( n_ ), desca( nb_ )
3883 jb =
min( desca( n_ ) - j + 1, desca( nb_ ) )
3885 IF( mycol.EQ.icurcol .OR. colrep )
THEN
3887 IF( myrowdist.EQ.0 )
THEN
3890 i = desca( imb_ ) + ( myrowdist - 1 ) * desca( mb_ ) + 1
3894 ib =
min(
max( 0, desca( m_ ) - i + 1 ), imba )
3897 IF( i+ll.LT.ia .OR. i+ll.GT.ia+m-1 .OR.
3898 $ j+kk.LT.ja .OR. j+kk.GT.ja+n-1 )
3900 $ a( i+ll+(j+kk-1)*lda ),
3901 $ pa( ii+ll+(jj+kk-1)*ldpa ) )
3907 i = i + imba + ( nprow - 1 ) * desca( mb_ )
3910 DO 100 ii = imba+1, mpall, desca( mb_ )
3911 ib =
min( mpall-ii+1, desca( mb_ ) )
3915 IF( i+ll.LT.ia .OR. i+ll.GT.ia+m-1 .OR.
3916 $ j+kk.LT.ja .OR. j+kk.GT.ja+n-1 )
3918 $ a( i+ll+(j+kk-1)*lda ),
3919 $ pa( ii+ll+(jj+kk-1)*ldpa ) )
3924 i = i + desca( mb_ )
3926 i = i + nprow * desca( mb_ )
3935 icurcol = mod( icurcol + 1, npcol )
3939 CALL dgamx2d( ictxt,
'All',
' ', 1, 1, errmax, 1, kk, ll, -1,
3942 IF( errmax.GT.zero .AND. errmax.LE.eps )
THEN
3944 ELSE IF( errmax.GT.eps )
THEN
3953 SUBROUTINE pzmprnt( ICTXT, NOUT, M, N, A, LDA, IRPRNT, ICPRNT,
3962 INTEGER ICPRNT, ICTXT, IRPRNT, LDA, M, N, NOUT
3965 CHARACTER*(*) CMATNM
3966 COMPLEX*16 A( LDA, * )
4022 INTEGER I, J, MYCOL, MYROW, NPCOL, NPROW
4025 EXTERNAL BLACS_GRIDINFO
4028 INTRINSIC dble, dimag
4034 IF( ( m.LE.0 ).OR.( n.LE.0 ) )
4039 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
4041 IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt )
THEN
4043 WRITE( nout, fmt = * )
4048 WRITE( nout, fmt = 9999 ) cmatnm, i, j,
4049 $ dble( a( i, j ) ), dimag( a( i, j ) )
4057 9999
FORMAT( 1x, a,
'(', i6,
',', i6,
')=', d30.18,
'+i*(',
4065 SUBROUTINE pzvprnt( ICTXT, NOUT, N, X, INCX, IRPRNT, ICPRNT,
4074 INTEGER ICPRNT, ICTXT, INCX, IRPRNT, N, NOUT
4077 CHARACTER*(*) CVECNM
4131 INTEGER I, MYCOL, MYROW, NPCOL, NPROW
4134 EXTERNAL BLACS_GRIDINFO
4137 INTRINSIC dble, dimag
4148 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
4150 IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt )
THEN
4152 WRITE( nout, fmt = * )
4153 DO 10 i = 1, 1 + ( n-1 )*incx, incx
4155 WRITE( nout, fmt = 9999 ) cvecnm, i, dble( x( i ) ),
4162 9999
FORMAT( 1x, a,
'(', i6,
')=', d30.18,
'+i*(', d30.18,
')' )
4169 SUBROUTINE pzmvch( ICTXT, TRANS, M, N, ALPHA, A, IA, JA, DESCA,
4170 $ X, IX, JX, DESCX, INCX, BETA, Y, PY, IY, JY,
4171 $ DESCY, INCY, G, ERR, INFO )
4180 INTEGER IA, ICTXT, INCX, INCY, INFO, IX, IY, JA, JX,
4182 DOUBLE PRECISION ERR
4183 COMPLEX*16 ALPHA, BETA
4186 INTEGER DESCA( * ), DESCX( * ), DESCY( * )
4187 DOUBLE PRECISION G( * )
4188 COMPLEX*16 A( * ), PY( * ), X( * ), Y( * )
4369 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
4370 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
4372 PARAMETER ( BLOCK_CYCLIC_2D_INB = 2, dlen_ = 11,
4373 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
4374 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
4375 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
4376 DOUBLE PRECISION RZERO, RONE
4377 parameter( rzero = 0.0d+0, rone = 1.0d+0 )
4378 COMPLEX*16 ZERO, ONE
4379 PARAMETER ( ZERO = ( 0.0d+0, 0.0d+0 ),
4380 $ one = ( 1.0d+0, 0.0d+0 ) )
4383 LOGICAL COLREP, CTRAN, ROWREP, TRAN
4384 INTEGER I, IB, ICURCOL, ICURROW, IIY, IN, IOFFA, IOFFX,
4385 $ ioffy, iycol, iyrow, j, jb, jjy, jn, kk, lda,
4386 $ ldpy, ldx, ldy, ml, mycol, myrow, nl, npcol,
4388 DOUBLE PRECISION EPS, ERRI, GTMP
4389 COMPLEX*16 C, TBETA, YTMP
4392 EXTERNAL blacs_gridinfo, dgamx2d, igsum2d,
pb_infog2l
4396 DOUBLE PRECISION PDLAMCH
4397 EXTERNAL lsame, pdlamch
4400 INTRINSIC abs, dble, dconjg, dimag,
max,
min, mod, sqrt
4403 DOUBLE PRECISION ABS1
4404 abs1( c ) = abs( dble( c ) ) + abs( dimag( c ) )
4408 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
4410 eps = pdlamch( ictxt,
'eps' )
4412 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
4418 tran = lsame( trans,
'T' )
4419 ctran = lsame( trans,
'C' )
4420 IF( tran.OR.ctran )
THEN
4428 lda =
max( 1, desca( m_ ) )
4429 ldx =
max( 1, descx( m_ ) )
4430 ldy =
max( 1, descy( m_ ) )
4436 ioffy = iy + ( jy - 1 ) * ldy
4440 ioffx = ix + ( jx - 1 ) * ldx
4442 ioffa = ia + ( ja + i - 2 ) * lda
4444 ytmp = ytmp + a( ioffa ) * x( ioffx )
4445 gtmp = gtmp + abs1( a( ioffa ) ) * abs1( x( ioffx ) )
4447 ioffx = ioffx + incx
4449 ELSE IF( ctran )
THEN
4450 ioffa = ia + ( ja + i - 2 ) * lda
4452 ytmp = ytmp + dconjg( a( ioffa ) ) * x( ioffx )
4453 gtmp = gtmp + abs1( a( ioffa ) ) * abs1( x( ioffx ) )
4455 ioffx = ioffx + incx
4458 ioffa = ia + i - 1 + ( ja - 1 ) * lda
4460 ytmp = ytmp + a( ioffa ) * x( ioffx )
4461 gtmp = gtmp + abs1( a( ioffa ) ) * abs1( x( ioffx ) )
4463 ioffx = ioffx + incx
4466 g( i ) = abs1( alpha )*gtmp + abs1( tbeta )*abs1( y( ioffy ) )
4467 y( ioffy ) = alpha * ytmp + tbeta * y( ioffy )
4468 ioffy = ioffy + incy
4475 ldpy = descy( lld_ )
4476 ioffy = iy + ( jy - 1 ) * ldy
4477 CALL pb_infog2l( iy, jy, descy, nprow, npcol, myrow, mycol, iiy,
4478 $ jjy, iyrow, iycol )
4481 rowrep = ( iyrow.EQ.-1 )
4482 colrep = ( iycol.EQ.-1 )
4484 IF( incy.EQ.descy( m_ ) )
THEN
4488 jb = descy( inb_ ) - jy + 1
4490 $ jb = ( ( -jb ) / descy( nb_ ) + 1 ) * descy( nb_ ) + jb
4496 IF( ( myrow.EQ.icurrow .OR. rowrep ) .AND.
4497 $ ( mycol.EQ.icurcol .OR. colrep ) )
THEN
4498 erri = abs( py( iiy+(jjy-1)*ldpy ) - y( ioffy ) ) / eps
4499 IF( g( j-jy+1 ).NE.rzero )
4500 $ erri = erri / g( j-jy+1 )
4501 err =
max( err, erri )
4502 IF( err*sqrt( eps ).GE.rone )
4507 ioffy = ioffy + incy
4511 icurcol = mod( icurcol+1, npcol )
4513 DO 70 j = jn+1, jy+ml-1, descy( nb_ )
4514 jb =
min( jy+ml-j, descy( nb_ ) )
4518 IF( ( myrow.EQ.icurrow .OR. rowrep ) .AND.
4519 $ ( mycol.EQ.icurcol .OR. colrep ) )
THEN
4520 erri = abs( py( iiy+(jjy-1)*ldpy ) - y( ioffy ) )/eps
4521 IF( g( j+kk-jy+1 ).NE.rzero )
4522 $ erri = erri / g( j+kk-jy+1 )
4523 err =
max( err, erri )
4524 IF( err*sqrt( eps ).GE.rone )
4529 ioffy = ioffy + incy
4533 icurcol = mod( icurcol+1, npcol )
4541 ib = descy( imb_ ) - iy + 1
4543 $ ib = ( ( -ib ) / descy( mb_ ) + 1 ) * descy( mb_ ) + ib
4549 IF( ( myrow.EQ.icurrow .OR. rowrep ) .AND.
4550 $ ( mycol.EQ.icurcol .OR. colrep ) )
THEN
4551 erri = abs( py( iiy+(jjy-1)*ldpy ) - y( ioffy ) ) / eps
4552 IF( g( i-iy+1 ).NE.rzero )
4553 $ erri = erri / g( i-iy+1 )
4554 err =
max( err, erri )
4555 IF( err*sqrt( eps ).GE.rone )
4560 ioffy = ioffy + incy
4564 icurrow = mod( icurrow+1, nprow )
4566 DO 100 i = in+1, iy+ml-1, descy( mb_ )
4567 ib =
min( iy+ml-i, descy( mb_ ) )
4571 IF( ( myrow.EQ.icurrow .OR. rowrep ) .AND.
4572 $ ( mycol.EQ.icurcol .OR. colrep ) )
THEN
4573 erri = abs( py( iiy+(jjy-1)*ldpy ) - y( ioffy ) )/eps
4574 IF( g( i+kk-iy+1 ).NE.rzero )
4575 $ erri = erri / g( i+kk-iy+1 )
4576 err =
max( err, erri )
4577 IF( err*sqrt( eps ).GE.rone )
4582 ioffy = ioffy + incy
4586 icurrow = mod( icurrow+1, nprow )
4594 CALL igsum2d( ictxt,
'All',
' ', 1, 1, info, 1, -1, mycol )
4595 CALL dgamx2d( ictxt,
'All',
' ', 1, 1, err, 1, i, j, -1, -1,
4603 SUBROUTINE pzvmch( ICTXT, TRANS, UPLO, M, N, ALPHA, X, IX, JX,
4604 $ DESCX, INCX, Y, IY, JY, DESCY, INCY, A, PA,
4605 $ IA, JA, DESCA, G, ERR, INFO )
4613 CHARACTER*1 TRANS, UPLO
4614 INTEGER IA, ICTXT, INCX, INCY, INFO, IX, IY, JA, JX,
4616 DOUBLE PRECISION ERR
4620 INTEGER DESCA( * ), DESCX( * ), DESCY( * )
4621 DOUBLE PRECISION G( * )
4622 COMPLEX*16 A( * ), PA( * ), X( * ), Y( * )
4805 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
4806 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
4808 PARAMETER ( BLOCK_CYCLIC_2D_INB = 2, dlen_ = 11,
4809 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
4810 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
4811 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
4812 DOUBLE PRECISION ZERO, ONE
4813 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
4816 LOGICAL COLREP, CTRAN, LOWER, ROWREP, UPPER
4817 INTEGER I, IACOL, IAROW, IB, IBEG, ICURROW, IEND, IIA,
4818 $ in, ioffa, ioffx, ioffy, j, jja, kk, lda, ldpa,
4819 $ ldx, ldy, mycol, myrow, npcol, nprow
4820 DOUBLE PRECISION EPS, ERRI, GTMP
4824 EXTERNAL blacs_gridinfo, dgamx2d, igsum2d,
pb_infog2l
4828 DOUBLE PRECISION PDLAMCH
4829 EXTERNAL LSAME, PDLAMCH
4832 INTRINSIC abs, dble, dconjg, dimag,
max,
min, mod, sqrt
4835 DOUBLE PRECISION ABS1
4836 ABS1( C ) = abs( dble( c ) ) + abs( dimag( c ) )
4840 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
4842 eps = pdlamch( ictxt,
'eps' )
4844 ctran = lsame( trans,
'C' )
4845 upper = lsame( uplo,
'U' )
4846 lower = lsame( uplo,
'L' )
4848 lda =
max( 1, desca( m_ ) )
4849 ldx =
max( 1, descx( m_ ) )
4850 ldy =
max( 1, descy( m_ ) )
4858 ioffy = iy + ( jy - 1 ) * ldy + ( j - 1 ) * incy
4866 ELSE IF( upper )
THEN
4877 DO 30 i = ibeg, iend
4879 ioffx = ix + ( jx - 1 ) * ldx + ( i - 1 ) * incx
4880 ioffa = ia + i - 1 + ( ja + j - 2 ) * lda
4882 atmp = x( ioffx ) * dconjg( y( ioffy ) )
4884 atmp = x( ioffx ) * y( ioffy )
4886 gtmp = abs1( x( ioffx ) ) * abs1( y( ioffy ) )
4887 g( i ) = abs1( alpha ) * gtmp + abs1( a( ioffa ) )
4888 a( ioffa ) = alpha * atmp + a( ioffa )
4896 ldpa = desca( lld_ )
4897 ioffa = ia + ( ja + j - 2 ) * lda
4898 CALL pb_infog2l( ia, ja+j-1, desca, nprow, npcol, myrow, mycol,
4899 $ iia, jja, iarow, iacol )
4900 rowrep = ( iarow.EQ.-1 )
4901 colrep = ( iacol.EQ.-1 )
4903 IF( mycol.EQ.iacol .OR. colrep )
THEN
4906 ib = desca( imb_ ) - ia + 1
4908 $ ib = ( ( -ib ) / desca( mb_ ) + 1 ) * desca( mb_ ) + ib
4914 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
4915 erri = abs( pa( iia+(jja-1)*ldpa ) - a( ioffa ) )/eps
4916 IF( g( i-ia+1 ).NE.zero )
4917 $ erri = erri / g( i-ia+1 )
4918 err =
max( err, erri )
4919 IF( err*sqrt( eps ).GE.one )
4928 icurrow = mod( icurrow+1, nprow )
4930 DO 60 i = in+1, ia+m-1, desca( mb_ )
4931 ib =
min( ia+m-i, desca( mb_ ) )
4935 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
4936 erri = abs( pa( iia+(jja-1)*ldpa )-a( ioffa ) )/eps
4937 IF( g( i+kk-ia+1 ).NE.zero )
4938 $ erri = erri / g( i+kk-ia+1 )
4939 err =
max( err, erri )
4940 IF( err*sqrt( eps ).GE.one )
4949 icurrow = mod( icurrow+1, nprow )
4957 CALL igsum2d( ictxt,
'All',
' ', 1, 1, info, 1, -1, mycol )
4958 CALL dgamx2d( ictxt,
'All',
' ', 1, 1, err, 1, i, j, -1, -1,
4972 SUBROUTINE pzvmch2( ICTXT, UPLO, M, N, ALPHA, X, IX, JX, DESCX,
4973 $ INCX, Y, IY, JY, DESCY, INCY, A, PA, IA,
4974 $ JA, DESCA, G, ERR, INFO )
4983 INTEGER IA, ICTXT, INCX, INCY, INFO, IX, IY, JA, JX,
4985 DOUBLE PRECISION ERR
4989 INTEGER DESCA( * ), DESCX( * ), DESCY( * )
4990 DOUBLE PRECISION G( * )
4991 COMPLEX*16 A( * ), PA( * ), X( * ), Y( * )
5166 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
5167 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
5169 PARAMETER ( BLOCK_CYCLIC_2D_INB = 2, dlen_ = 11,
5170 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
5171 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
5172 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
5173 DOUBLE PRECISION ZERO, ONE
5174 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
5177 LOGICAL COLREP, LOWER, ROWREP, UPPER
5178 INTEGER I, IACOL, IAROW, IB, IBEG, ICURROW, IEND, IIA,
5179 $ IN, IOFFA, IOFFXI, IOFFXJ, IOFFYI, IOFFYJ, J,
5180 $ JJA, KK, LDA, LDPA, LDX, LDY, MYCOL, MYROW,
5182 DOUBLE PRECISION EPS, ERRI, GTMP
5186 EXTERNAL blacs_gridinfo, dgamx2d, igsum2d,
pb_infog2l
5190 DOUBLE PRECISION PDLAMCH
5191 EXTERNAL LSAME, PDLAMCH
5194 INTRINSIC abs, dble, dconjg, dimag,
max,
min, mod, sqrt
5197 DOUBLE PRECISION ABS1
5198 abs1( c ) = abs( dble( c ) ) + abs( dimag( c ) )
5202 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
5204 eps = pdlamch( ictxt,
'eps' )
5206 upper = lsame( uplo,
'U' )
5207 lower = lsame( uplo,
'L' )
5209 lda =
max( 1, desca( m_ ) )
5210 ldx =
max( 1, descx( m_ ) )
5211 ldy =
max( 1, descy( m_ ) )
5219 ioffxj = ix + ( jx - 1 ) * ldx + ( j - 1 ) * incx
5220 ioffyj = iy + ( jy - 1 ) * ldy + ( j - 1 ) * incy
5228 ELSE IF( upper )
THEN
5239 DO 30 i = ibeg, iend
5240 ioffa = ia + i - 1 + ( ja + j - 2 ) * lda
5241 ioffxi = ix + ( jx - 1 ) * ldx + ( i - 1 ) * incx
5242 ioffyi = iy + ( jy - 1 ) * ldy + ( i - 1 ) * incy
5243 atmp = alpha * x( ioffxi ) * dconjg( y( ioffyj ) )
5244 atmp = atmp + y( ioffyi ) * dconjg( alpha * x( ioffxj ) )
5245 gtmp = abs1( alpha * x( ioffxi ) ) * abs1( y( ioffyj ) )
5246 gtmp = gtmp + abs1( y( ioffyi ) ) *
5247 $ abs1( dconjg( alpha * x( ioffxj ) ) )
5248 g( i ) = gtmp + abs1( a( ioffa ) )
5249 a( ioffa ) = a( ioffa ) + atmp
5257 ldpa = desca( lld_ )
5258 ioffa = ia + ( ja + j - 2 ) * lda
5259 CALL pb_infog2l( ia, ja+j-1, desca, nprow, npcol, myrow, mycol,
5260 $ iia, jja, iarow, iacol )
5261 rowrep = ( iarow.EQ.-1 )
5262 colrep = ( iacol.EQ.-1 )
5264 IF( mycol.EQ.iacol .OR. colrep )
THEN
5267 ib = desca( imb_ ) - ia + 1
5269 $ ib = ( ( -ib ) / desca( mb_ ) + 1 ) * desca( mb_ ) + ib
5275 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
5276 erri = abs( pa( iia+(jja-1)*ldpa ) - a( ioffa ) )/eps
5277 IF( g( i-ia+1 ).NE.zero )
5278 $ erri = erri / g( i-ia+1 )
5279 err =
max( err, erri )
5280 IF( err*sqrt( eps ).GE.one )
5289 icurrow = mod( icurrow+1, nprow )
5291 DO 60 i = in+1, ia+m-1, desca( mb_ )
5292 ib =
min( ia+m-i, desca( mb_ ) )
5296 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
5297 erri = abs( pa( iia+(jja-1)*ldpa )-a( ioffa ) )/eps
5298 IF( g( i+kk-ia+1 ).NE.zero )
5299 $ erri = erri / g( i+kk-ia+1 )
5300 err =
max( err, erri )
5301 IF( err*sqrt( eps ).GE.one )
5310 icurrow = mod( icurrow+1, nprow )
5318 CALL igsum2d( ictxt,
'All',
' ', 1, 1, info, 1, -1, mycol )
5319 CALL dgamx2d( ictxt,
'All',
' ', 1, 1, err, 1, i, j, -1, -1,
5333 SUBROUTINE pzmmch( ICTXT, TRANSA, TRANSB, M, N, K, ALPHA, A, IA,
5334 $ JA, DESCA, B, IB, JB, DESCB, BETA, C, PC, IC,
5335 $ JC, DESCC, CT, G, ERR, INFO )
5343 CHARACTER*1 TRANSA, TRANSB
5344 INTEGER IA, IB, IC, ICTXT, INFO, JA, JB, JC, K, M, N
5345 DOUBLE PRECISION ERR
5346 COMPLEX*16 ALPHA, BETA
5349 INTEGER DESCA( * ), DESCB( * ), DESCC( * )
5350 DOUBLE PRECISION G( * )
5351 COMPLEX*16 A( * ), B( * ), C( * ), CT( * ), PC( * )
5527 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
5528 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
5530 PARAMETER ( BLOCK_CYCLIC_2D_INB = 2, dlen_ = 11,
5531 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
5532 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
5533 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
5534 DOUBLE PRECISION RZERO, RONE
5535 PARAMETER ( RZERO = 0.0d+0, rone = 1.0d+0 )
5537 PARAMETER ( ZERO = ( 0.0d+0, 0.0d+0 ) )
5540 LOGICAL COLREP, CTRANA, CTRANB, ROWREP, TRANA, TRANB
5541 INTEGER I, IBB, ICCOL, ICROW, ICURROW, IIC, IN, IOFFA,
5542 $ IOFFB, IOFFC, J, JJC, KK, LDA, LDB, LDC, LDPC,
5543 $ MYCOL, MYROW, NPCOL, NPROW
5544 DOUBLE PRECISION EPS, ERRI
5548 EXTERNAL blacs_gridinfo, dgamx2d, igsum2d,
pb_infog2l
5552 DOUBLE PRECISION PDLAMCH
5553 EXTERNAL LSAME, PDLAMCH
5556 INTRINSIC abs, dble, dconjg, dimag,
max,
min, mod, sqrt
5559 DOUBLE PRECISION ABS1
5560 ABS1( Z ) = abs( dble( z ) ) + abs( dimag( z ) )
5564 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
5566 eps = pdlamch( ictxt,
'eps' )
5568 trana = lsame( transa,
'T' ).OR.lsame( transa,
'C' )
5569 tranb = lsame( transb,
'T' ).OR.lsame( transb,
'C' )
5570 ctrana = lsame( transa,
'C' )
5571 ctranb = lsame( transb,
'C' )
5573 lda =
max( 1, desca( m_ ) )
5574 ldb =
max( 1, descb( m_ ) )
5575 ldc =
max( 1, descc( m_ ) )
5583 ioffc = ic + ( jc + j - 2 ) * ldc
5589 IF( .NOT.trana .AND. .NOT.tranb )
THEN
5591 ioffb = ib + kk - 1 + ( jb + j - 2 ) * ldb
5593 ioffa = ia + i - 1 + ( ja + kk - 2 ) * lda
5594 ct( i ) = ct( i ) + a( ioffa ) * b( ioffb )
5595 g( i ) = g( i ) + abs( a( ioffa ) ) *
5599 ELSE IF( trana .AND. .NOT.tranb )
THEN
5602 ioffb = ib + kk - 1 + ( jb + j - 2 ) * ldb
5604 ioffa = ia + kk - 1 + ( ja + i - 2 ) * lda
5605 ct( i ) = ct( i ) + dconjg( a( ioffa ) ) *
5607 g( i ) = g( i ) + abs1( a( ioffa ) ) *
5608 $ abs1( b( ioffb ) )
5613 ioffb = ib + kk - 1 + ( jb + j - 2 ) * ldb
5615 ioffa = ia + kk - 1 + ( ja + i - 2 ) * lda
5616 ct( i ) = ct( i ) + a( ioffa ) * b( ioffb )
5617 g( i ) = g( i ) + abs1( a( ioffa ) ) *
5618 $ abs1( b( ioffb ) )
5622 ELSE IF( .NOT.trana .AND. tranb )
THEN
5625 ioffb = ib + j - 1 + ( jb + kk - 2 ) * ldb
5627 ioffa = ia + i - 1 + ( ja + kk - 2 ) * lda
5628 ct( i ) = ct( i ) + a( ioffa ) *
5629 $ dconjg( b( ioffb ) )
5630 g( i ) = g( i ) + abs1( a( ioffa ) ) *
5631 $ abs1( b( ioffb ) )
5636 ioffb = ib + j - 1 + ( jb + kk - 2 ) * ldb
5638 ioffa = ia + i - 1 + ( ja + kk - 2 ) * lda
5639 ct( i ) = ct( i ) + a( ioffa ) * b( ioffb )
5640 g( i ) = g( i ) + abs1( a( ioffa ) ) *
5641 $ abs1( b( ioffb ) )
5645 ELSE IF( trana .AND. tranb )
THEN
5649 ioffb = ib + j - 1 + ( jb + kk - 2 ) * ldb
5651 ioffa = ia + kk - 1 + ( ja + i - 2 ) * lda
5652 ct( i ) = ct( i ) + dconjg( a( ioffa ) ) *
5653 $ dconjg( b( ioffb ) )
5654 g( i ) = g( i ) + abs1( a( ioffa ) ) *
5655 $ abs1( b( ioffb ) )
5660 ioffb = ib + j - 1 + ( jb + kk - 2 ) * ldb
5662 ioffa = ia + kk - 1 + ( ja + i - 2 ) * lda
5663 ct( i ) = ct( i ) + dconjg( a( ioffa ) ) *
5665 g( i ) = g( i ) + abs1( a( ioffa ) ) *
5666 $ abs1( b( ioffb ) )
5673 ioffb = ib + j - 1 + ( jb + kk - 2 ) * ldb
5675 ioffa = ia + kk - 1 + ( ja + i - 2 ) * lda
5676 ct( i ) = ct( i ) + a( ioffa ) *
5677 $ dconjg( b( ioffb ) )
5678 g( i ) = g( i ) + abs1( a( ioffa ) ) *
5679 $ abs1( b( ioffb ) )
5684 ioffb = ib + j - 1 + ( jb + kk - 2 ) * ldb
5686 ioffa = ia + kk - 1 + ( ja + i - 2 ) * lda
5687 ct( i ) = ct( i ) + a( ioffa ) * b( ioffb )
5688 g( i ) = g( i ) + abs1( a( ioffa ) ) *
5689 $ abs1( b( ioffb ) )
5697 ct( i ) = alpha*ct( i ) + beta * c( ioffc )
5698 g( i ) = abs1( alpha )*g( i ) +
5699 $ abs1( beta )*abs1( c( ioffc ) )
5700 c( ioffc ) = ct( i )
5708 ldpc = descc( lld_ )
5709 ioffc = ic + ( jc + j - 2 ) * ldc
5710 CALL pb_infog2l( ic, jc+j-1, descc, nprow, npcol, myrow, mycol,
5711 $ iic, jjc, icrow, iccol )
5713 rowrep = ( icrow.EQ.-1 )
5714 colrep = ( iccol.EQ.-1 )
5716 IF( mycol.EQ.iccol .OR. colrep )
THEN
5718 ibb = descc( imb_ ) - ic + 1
5720 $ ibb = ( ( -ibb ) / descc( mb_ ) + 1 )*descc( mb_ ) + ibb
5726 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
5727 erri = abs( pc( iic+(jjc-1)*ldpc ) -
5728 $ c( ioffc ) ) / eps
5729 IF( g( i-ic+1 ).NE.rzero )
5730 $ erri = erri / g( i-ic+1 )
5731 err =
max( err, erri )
5732 IF( err*sqrt( eps ).GE.rone )
5741 icurrow = mod( icurrow+1, nprow )
5743 DO 230 i = in+1, ic+m-1, descc( mb_ )
5744 ibb =
min( ic+m-i, descc( mb_ ) )
5746 DO 220 kk = 0, ibb-1
5748 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
5749 erri = abs( pc( iic+(jjc-1)*ldpc ) -
5751 IF( g( i+kk-ic+1 ).NE.rzero )
5752 $ erri = erri / g( i+kk-ic+1 )
5753 err =
max( err, erri )
5754 IF( err*sqrt( eps ).GE.rone )
5763 icurrow = mod( icurrow+1, nprow )
5771 CALL igsum2d( ictxt,
'All',
' ', 1, 1, info, 1, -1, mycol )
5772 CALL dgamx2d( ictxt,
'All',
' ', 1, 1, err, 1, i, j, -1, -1,
5786 SUBROUTINE pzmmch1( ICTXT, UPLO, TRANS, N, K, ALPHA, A, IA, JA,
5787 $ DESCA, BETA, C, PC, IC, JC, DESCC, CT, G,
5796 CHARACTER*1 TRANS, UPLO
5797 INTEGER IA, IC, ICTXT, INFO, JA, JC, K, N
5798 DOUBLE PRECISION ERR
5799 COMPLEX*16 ALPHA, BETA
5802 INTEGER DESCA( * ), DESCC( * )
5803 DOUBLE PRECISION G( * )
5804 COMPLEX*16 A( * ), C( * ), CT( * ), PC( * )
5962 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
5963 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
5965 PARAMETER ( BLOCK_CYCLIC_2D_INB = 2, dlen_ = 11,
5966 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
5967 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
5968 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
5969 DOUBLE PRECISION RZERO, RONE
5970 PARAMETER ( RZERO = 0.0d+0, rone = 1.0d+0 )
5972 PARAMETER ( ZERO = ( 0.0d+0, 0.0d+0 ) )
5975 LOGICAL COLREP, HTRAN, NOTRAN, ROWREP, TRAN, UPPER
5976 INTEGER I, IBB, IBEG, ICCOL, ICROW, ICURROW, IEND, IIC,
5977 $ IN, IOFFAK, IOFFAN, IOFFC, J, JJC, KK, LDA,
5978 $ ldc, ldpc, mycol, myrow, npcol, nprow
5979 DOUBLE PRECISION EPS, ERRI
5983 EXTERNAL blacs_gridinfo, dgamx2d, igsum2d,
pb_infog2l
5987 DOUBLE PRECISION PDLAMCH
5988 EXTERNAL lsame, pdlamch
5991 INTRINSIC abs, dble, dconjg, dimag,
max,
min, mod, sqrt
5994 DOUBLE PRECISION ABS1
5995 abs1( z ) = abs( dble( z ) ) + abs( dimag( z ) )
5999 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
6001 eps = pdlamch( ictxt,
'eps' )
6003 upper = lsame( uplo,
'U' )
6004 notran = lsame( trans,
'N' )
6005 tran = lsame( trans,
'T' )
6006 htran = lsame( trans,
'H' )
6008 lda =
max( 1, desca( m_ ) )
6009 ldc =
max( 1, descc( m_ ) )
6032 ioffak = ia + j - 1 + ( ja + kk - 2 ) * lda
6033 DO 20 i = ibeg, iend
6034 ioffan = ia + i - 1 + ( ja + kk - 2 ) * lda
6035 ct( i ) = ct( i ) + a( ioffak ) * a( ioffan )
6036 g( i ) = g( i ) + abs1( a( ioffak ) ) *
6037 $ abs1( a( ioffan ) )
6040 ELSE IF( tran )
THEN
6042 ioffak = ia + kk - 1 + ( ja + j - 2 ) * lda
6043 DO 40 i = ibeg, iend
6044 ioffan = ia + kk - 1 + ( ja + i - 2 ) * lda
6045 ct( i ) = ct( i ) + a( ioffak ) * a( ioffan )
6046 g( i ) = g( i ) + abs1( a( ioffak ) ) *
6047 $ abs1( a( ioffan ) )
6050 ELSE IF( htran )
THEN
6052 ioffak = ia + j - 1 + ( ja + kk - 2 ) * lda
6053 DO 60 i = ibeg, iend
6054 ioffan = ia + i - 1 + ( ja + kk - 2 ) * lda
6055 ct( i ) = ct( i ) + a( ioffan ) *
6056 $ dconjg( a( ioffak ) )
6057 g( i ) = g( i ) + abs1( a( ioffak ) ) *
6058 $ abs1( a( ioffan ) )
6063 ioffak = ia + kk - 1 + ( ja + j - 2 ) * lda
6064 DO 80 i = ibeg, iend
6065 ioffan = ia + kk - 1 + ( ja + i - 2 ) * lda
6066 ct( i ) = ct( i ) + dconjg( a( ioffan ) ) *
6068 g( i ) = g( i ) + abs1( dconjg( a( ioffan ) ) ) *
6069 $ abs1( a( ioffak ) )
6074 ioffc = ic + ibeg - 1 + ( jc + j - 2 ) * ldc
6076 DO 100 i = ibeg, iend
6077 ct( i ) = alpha*ct( i ) + beta * c( ioffc )
6078 g( i ) = abs1( alpha )*g( i ) +
6079 $ abs1( beta )*abs1( c( ioffc ) )
6080 c( ioffc ) = ct( i )
6088 ldpc = descc( lld_ )
6089 ioffc = ic + ( jc + j - 2 ) * ldc
6090 CALL pb_infog2l( ic, jc+j-1, descc, nprow, npcol, myrow, mycol,
6091 $ iic, jjc, icrow, iccol )
6093 rowrep = ( icrow.EQ.-1 )
6094 colrep = ( iccol.EQ.-1 )
6096 IF( mycol.EQ.iccol .OR. colrep )
THEN
6098 ibb = descc( imb_ ) - ic + 1
6100 $ ibb = ( ( -ibb ) / descc( mb_ ) + 1 )*descc( mb_ ) + ibb
6106 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
6107 erri = abs( pc( iic+(jjc-1)*ldpc ) -
6108 $ c( ioffc ) ) / eps
6109 IF( g( i-ic+1 ).NE.rzero )
6110 $ erri = erri / g( i-ic+1 )
6111 err =
max( err, erri )
6112 IF( err*sqrt( eps ).GE.rone )
6121 icurrow = mod( icurrow+1, nprow )
6123 DO 130 i = in+1, ic+n-1, descc( mb_ )
6124 ibb =
min( ic+n-i, descc( mb_ ) )
6126 DO 120 kk = 0, ibb-1
6128 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
6129 erri = abs( pc( iic+(jjc-1)*ldpc ) -
6131 IF( g( i+kk-ic+1 ).NE.rzero )
6132 $ erri = erri / g( i+kk-ic+1 )
6133 err =
max( err, erri )
6134 IF( err*sqrt( eps ).GE.rone )
6143 icurrow = mod( icurrow+1, nprow )
6151 CALL igsum2d( ictxt,
'All',
' ', 1, 1, info, 1, -1, mycol )
6152 CALL dgamx2d( ictxt,
'All',
' ', 1, 1, err, 1, i, j, -1, -1,
6166 SUBROUTINE pzmmch2( ICTXT, UPLO, TRANS, N, K, ALPHA, A, IA, JA,
6167 $ DESCA, B, IB, JB, DESCB, BETA, C, PC, IC,
6168 $ JC, DESCC, CT, G, ERR, INFO )
6176 CHARACTER*1 TRANS, UPLO
6177 INTEGER IA, IB, IC, ICTXT, INFO, JA, JB, JC, K, N
6178 DOUBLE PRECISION ERR
6179 COMPLEX*16 ALPHA, BETA
6182 INTEGER DESCA( * ), DESCB( * ), DESCC( * )
6183 DOUBLE PRECISION G( * )
6184 COMPLEX*16 A( * ), B( * ), C( * ), CT( * ),
6360 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
6361 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
6363 PARAMETER ( BLOCK_CYCLIC_2D_INB = 2, dlen_ = 11,
6364 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
6365 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
6366 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
6367 DOUBLE PRECISION RZERO, RONE
6368 PARAMETER ( RZERO = 0.0d+0, rone = 1.0d+0 )
6370 PARAMETER ( ZERO = ( 0.0d+0, 0.0d+0 ) )
6373 LOGICAL COLREP, HTRAN, NOTRAN, ROWREP, TRAN, UPPER
6374 INTEGER I, IBB, IBEG, ICCOL, ICROW, ICURROW, IEND, IIC,
6375 $ IN, IOFFAK, IOFFAN, IOFFBK, IOFFBN, IOFFC, J,
6376 $ JJC, KK, LDA, LDB, LDC, LDPC, MYCOL, MYROW,
6378 DOUBLE PRECISION EPS, ERRI
6382 EXTERNAL blacs_gridinfo, dgamx2d, igsum2d,
pb_infog2l
6386 DOUBLE PRECISION PDLAMCH
6387 EXTERNAL lsame, pdlamch
6390 INTRINSIC abs, dble, dconjg, dimag,
max,
min, mod, sqrt
6393 DOUBLE PRECISION ABS1
6394 ABS1( Z ) = abs( dble( z ) ) + abs( dimag( z ) )
6398 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
6400 eps = pdlamch( ictxt,
'eps' )
6402 upper = lsame( uplo,
'U' )
6403 htran = lsame( trans,
'H' )
6404 notran = lsame( trans,
'N' )
6405 tran = lsame( trans,
'T' )
6407 lda =
max( 1, desca( m_ ) )
6408 ldb =
max( 1, descb( m_ ) )
6409 ldc =
max( 1, descc( m_ ) )
6432 ioffak = ia + j - 1 + ( ja + kk - 2 ) * lda
6433 ioffbk = ib + j - 1 + ( jb + kk - 2 ) * ldb
6434 DO 20 i = ibeg, iend
6435 ioffan = ia + i - 1 + ( ja + kk - 2 ) * lda
6436 ioffbn = ib + i - 1 + ( jb + kk - 2 ) * ldb
6437 ct( i ) = ct( i ) + alpha * (
6438 $ a( ioffan ) * b( ioffbk ) +
6439 $ b( ioffbn ) * a( ioffak ) )
6440 g( i ) = g( i ) + abs( alpha ) * (
6441 $ abs1( a( ioffan ) ) * abs1( b( ioffbk ) ) +
6442 $ abs1( b( ioffbn ) ) * abs1( a( ioffak ) ) )
6445 ELSE IF( tran )
THEN
6447 ioffak = ia + kk - 1 + ( ja + j - 2 ) * lda
6448 ioffbk = ib + kk - 1 + ( jb + j - 2 ) * ldb
6449 DO 40 i = ibeg, iend
6450 ioffan = ia + kk - 1 + ( ja + i - 2 ) * lda
6451 ioffbn = ib + kk - 1 + ( jb + i - 2 ) * ldb
6452 ct( i ) = ct( i ) + alpha * (
6453 $ a( ioffan ) * b( ioffbk ) +
6454 $ b( ioffbn ) * a( ioffak ) )
6455 g( i ) = g( i ) + abs( alpha ) * (
6456 $ abs1( a( ioffan ) ) * abs1( b( ioffbk ) ) +
6457 $ abs1( b( ioffbn ) ) * abs1( a( ioffak ) ) )
6460 ELSE IF( htran )
THEN
6462 ioffak = ia + j - 1 + ( ja + kk - 2 ) * lda
6463 ioffbk = ib + j - 1 + ( jb + kk - 2 ) * ldb
6464 DO 60 i = ibeg, iend
6465 ioffan = ia + i - 1 + ( ja + kk - 2 ) * lda
6466 ioffbn = ib + i - 1 + ( jb + kk - 2 ) * ldb
6468 $ alpha * a( ioffan ) * dconjg( b( ioffbk ) ) +
6469 $ b( ioffbn ) * dconjg( alpha * a( ioffak ) )
6470 g( i ) = g( i ) + abs1( alpha ) * (
6471 $ abs1( a( ioffan ) ) * abs1( b( ioffbk ) ) +
6472 $ abs1( b( ioffbn ) ) * abs1( a( ioffak ) ) )
6477 ioffak = ia + kk - 1 + ( ja + j - 2 ) * lda
6478 ioffbk = ib + kk - 1 + ( jb + j - 2 ) * ldb
6479 DO 80 i = ibeg, iend
6480 ioffan = ia + kk - 1 + ( ja + i - 2 ) * lda
6481 ioffbn = ib + kk - 1 + ( jb + i - 2 ) * ldb
6483 $ alpha * dconjg( a( ioffan ) ) * b( ioffbk ) +
6484 $ dconjg( alpha * b( ioffbn ) ) * a( ioffak )
6485 g( i ) = g( i ) + abs1( alpha ) * (
6486 $ abs1( dconjg( a( ioffan ) ) * b( ioffbk ) ) +
6487 $ abs1( dconjg( b( ioffbn ) ) * a( ioffak ) ) )
6492 ioffc = ic + ibeg - 1 + ( jc + j - 2 ) * ldc
6494 DO 100 i = ibeg, iend
6495 ct( i ) = ct( i ) + beta * c( ioffc )
6496 g( i ) = g( i ) + abs1( beta )*abs1( c( ioffc ) )
6497 c( ioffc ) = ct( i )
6505 ldpc = descc( lld_ )
6506 ioffc = ic + ( jc + j - 2 ) * ldc
6507 CALL pb_infog2l( ic, jc+j-1, descc, nprow, npcol, myrow, mycol,
6508 $ iic, jjc, icrow, iccol )
6510 rowrep = ( icrow.EQ.-1 )
6511 colrep = ( iccol.EQ.-1 )
6513 IF( mycol.EQ.iccol .OR. colrep )
THEN
6515 ibb = descc( imb_ ) - ic + 1
6517 $ ibb = ( ( -ibb ) / descc( mb_ ) + 1 )*descc( mb_ ) + ibb
6523 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
6524 erri = abs( pc( iic+(jjc-1)*ldpc ) -
6525 $ c( ioffc ) ) / eps
6526 IF( g( i-ic+1 ).NE.rzero )
6527 $ erri = erri / g( i-ic+1 )
6528 err =
max( err, erri )
6529 IF( err*sqrt( eps ).GE.rone )
6538 icurrow = mod( icurrow+1, nprow )
6540 DO 130 i = in+1, ic+n-1, descc( mb_ )
6541 ibb =
min( ic+n-i, descc( mb_ ) )
6543 DO 120 kk = 0, ibb-1
6545 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
6546 erri = abs( pc( iic+(jjc-1)*ldpc ) -
6548 IF( g( i+kk-ic+1 ).NE.rzero )
6549 $ erri = erri / g( i+kk-ic+1 )
6550 err =
max( err, erri )
6551 IF( err*sqrt( eps ).GE.rone )
6560 icurrow = mod( icurrow+1, nprow )
6568 CALL igsum2d( ictxt,
'All',
' ', 1, 1, info, 1, -1, mycol )
6569 CALL dgamx2d( ictxt,
'All',
' ', 1, 1, err, 1, i, j, -1, -1,
6583 SUBROUTINE pzmmch3( UPLO, TRANS, M, N, ALPHA, A, IA, JA, DESCA,
6584 $ BETA, C, PC, IC, JC, DESCC, ERR, INFO )
6592 CHARACTER*1 TRANS, UPLO
6593 INTEGER IA, IC, INFO, JA, JC, M, N
6594 DOUBLE PRECISION ERR
6595 COMPLEX*16 ALPHA, BETA
6598 INTEGER DESCA( * ), DESCC( * )
6599 COMPLEX*16 A( * ), C( * ), PC( * )
6742 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
6743 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
6745 PARAMETER ( BLOCK_CYCLIC_2D_INB = 2, dlen_ = 11,
6746 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
6747 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
6748 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
6749 DOUBLE PRECISION ZERO
6750 PARAMETER ( ZERO = 0.0d+0 )
6753 LOGICAL COLREP, CTRAN, LOWER, NOTRAN, ROWREP, UPPER
6754 INTEGER I, ICCOL, ICROW, ICTXT, IIC, IOFFA, IOFFC, J,
6755 $ JJC, LDA, LDC, LDPC, MYCOL, MYROW, NPCOL,
6757 DOUBLE PRECISION ERR0, ERRI, PREC
6760 EXTERNAL BLACS_GRIDINFO, DGAMX2D, IGSUM2D, PB_INFOG2L,
6765 DOUBLE PRECISION PDLAMCH
6766 EXTERNAL LSAME, PDLAMCH
6769 INTRINSIC abs, dconjg,
max
6773 ictxt = descc( ctxt_ )
6774 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
6776 prec = pdlamch( ictxt,
'eps' )
6778 upper = lsame( uplo,
'U' )
6779 lower = lsame( uplo,
'L' )
6780 notran = lsame( trans,
'N' )
6781 ctran = lsame( trans,
'C' )
6789 lda =
max( 1, desca( m_ ) )
6790 ldc =
max( 1, descc( m_ ) )
6791 ldpc =
max( 1, descc( lld_ ) )
6792 rowrep = ( descc( rsrc_ ).EQ.-1 )
6793 colrep = ( descc( csrc_ ).EQ.-1 )
6797 DO 20 j = jc, jc + n - 1
6799 ioffc = ic + ( j - 1 ) * ldc
6800 ioffa = ia + ( ja - 1 + j - jc ) * lda
6802 DO 10 i = ic, ic + m - 1
6805 IF( ( j - jc ).GE.( i - ic ) )
THEN
6806 CALL pzerraxpby( erri, alpha, a( ioffa ), beta,
6807 $ c( ioffc ), prec )
6811 ELSE IF( lower )
THEN
6812 IF( ( j - jc ).LE.( i - ic ) )
THEN
6813 CALL pzerraxpby( erri, alpha, a( ioffa ), beta,
6814 $ c( ioffc ), prec )
6819 CALL pzerraxpby( erri, alpha, a( ioffa ), beta,
6820 $ c( ioffc ), prec )
6823 CALL pb_infog2l( i, j, descc, nprow, npcol, myrow, mycol,
6824 $ iic, jjc, icrow, iccol )
6825 IF( ( myrow.EQ.icrow .OR. rowrep ) .AND.
6826 $ ( mycol.EQ.iccol .OR. colrep ) )
THEN
6827 err0 = abs( pc( iic+(jjc-1)*ldpc )-c( ioffc ) )
6830 err =
max( err, err0 )
6840 ELSE IF( ctran )
THEN
6842 DO 40 j = jc, jc + n - 1
6844 ioffc = ic + ( j - 1 ) * ldc
6845 ioffa = ia + ( j - jc ) + ( ja - 1 ) * lda
6847 DO 30 i = ic, ic + m - 1
6850 IF( ( j - jc ).GE.( i - ic ) )
THEN
6851 CALL pzerraxpby( erri, alpha, dconjg( a( ioffa ) ),
6852 $ beta, c( ioffc ), prec )
6856 ELSE IF( lower )
THEN
6857 IF( ( j - jc ).LE.( i - ic ) )
THEN
6858 CALL pzerraxpby( erri, alpha, dconjg( a( ioffa ) ),
6859 $ beta, c( ioffc ), prec )
6864 CALL pzerraxpby( erri, alpha, dconjg( a( ioffa ) ),
6865 $ beta, c( ioffc ), prec )
6868 CALL pb_infog2l( i, j, descc, nprow, npcol, myrow, mycol,
6869 $ iic, jjc, icrow, iccol )
6870 IF( ( myrow.EQ.icrow .OR. rowrep ) .AND.
6871 $ ( mycol.EQ.iccol .OR. colrep ) )
THEN
6872 err0 = abs( pc( iic+(jjc-1)*ldpc )-c( ioffc ) )
6875 err =
max( err, err0 )
6887 DO 60 j = jc, jc + n - 1
6889 ioffc = ic + ( j - 1 ) * ldc
6890 ioffa = ia + ( j - jc ) + ( ja - 1 ) * lda
6892 DO 50 i = ic, ic + m - 1
6895 IF( ( j - jc ).GE.( i - ic ) )
THEN
6896 CALL pzerraxpby( erri, alpha, a( ioffa ), beta,
6897 $ c( ioffc ), prec )
6901 ELSE IF( lower )
THEN
6902 IF( ( j - jc ).LE.( i - ic ) )
THEN
6903 CALL pzerraxpby( erri, alpha, a( ioffa ), beta,
6904 $ c( ioffc ), prec )
6909 CALL pzerraxpby( erri, alpha, a( ioffa ), beta,
6910 $ c( ioffc ), prec )
6913 CALL pb_infog2l( i, j, descc, nprow, npcol, myrow, mycol,
6914 $ iic, jjc, icrow, iccol )
6915 IF( ( myrow.EQ.icrow .OR. rowrep ) .AND.
6916 $ ( mycol.EQ.iccol .OR. colrep ) )
THEN
6917 err0 = abs( pc( iic+(jjc-1)*ldpc )-c( ioffc ) )
6920 err =
max( err, err0 )
6934 CALL igsum2d( ictxt,
'All',
' ', 1, 1, info, 1, -1, mycol )
6935 CALL dgamx2d( ictxt,
'All',
' ', 1, 1, err, 1, i, j, -1, -1,
6951 DOUBLE PRECISION ERRBND, PREC
6952 COMPLEX*16 ALPHA, BETA, X, Y
6990 DOUBLE PRECISION ONE, TWO, ZERO
6991 PARAMETER ( ONE = 1.0d+0, two = 2.0d+0,
6995 DOUBLE PRECISION ADDBND, FACT, SUMINEG, SUMIPOS, SUMRNEG,
7007 fact = one + two * prec
7008 addbnd = two * two * two * prec
7011 IF( dble( tmp ).GE.zero )
THEN
7012 sumrpos = sumrpos + dble( tmp ) * fact
7014 sumrneg = sumrneg - dble( tmp ) * fact
7016 IF( dimag( tmp ).GE.zero )
THEN
7017 sumipos = sumipos + dimag( tmp ) * fact
7019 sumineg = sumineg - dimag( tmp ) * fact
7023 IF( dble( tmp ).GE.zero )
THEN
7024 sumrpos = sumrpos + dble( tmp ) * fact
7026 sumrneg = sumrneg - dble( tmp ) * fact
7028 IF( dimag( tmp ).GE.zero )
THEN
7029 sumipos = sumipos + dimag( tmp ) * fact
7031 sumineg = sumineg - dimag( tmp ) * fact
7034 y = ( beta * y ) + ( alpha * x )
7036 errbnd = addbnd *
max(
max( sumrpos, sumrneg ),
7037 $
max( sumipos, sumineg ) )
7172 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
7173 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
7175 PARAMETER ( BLOCK_CYCLIC_2D_INB = 2, dlen_ = 11,
7176 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
7177 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
7178 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
7179 DOUBLE PRECISION ZERO
7180 PARAMETER ( ZERO = 0.0d+0 )
7183 LOGICAL COLREP, GODOWN, GOLEFT, ROWREP
7184 INTEGER I, IACOL, IAROW, ICTXT, IIA, IJOFFA, ILOW,
7185 $ IMB1, IMBLOC, INB1, INBLOC, IOFFA, IOFFD, IUPP,
7186 $ JJA, JOFFA, JOFFD, LCMT, LCMT00, LDA, LDAP1,
7187 $ LMBLOC, LNBLOC, LOW, MB, MBLKD, MBLKS, MBLOC,
7188 $ MRCOL, MRROW, MYCOL, MYROW, NB, NBLKD, NBLKS,
7189 $ NBLOC, NP, NPCOL, NPROW, NQ, PMB, QNB, UPP
7190 DOUBLE PRECISION ALPHA, ATMP
7193 INTEGER DESCA2( DLEN_ )
7201 DOUBLE PRECISION PDLAMCH
7202 EXTERNAL lsame, pdlamch
7205 INTRINSIC dble, dcmplx,
max,
min
7215 ictxt = desca2( ctxt_ )
7216 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
7221 IF( lsame( toggle,
'Z' ) )
THEN
7223 ELSE IF( lsame( toggle,
'B' ) )
THEN
7224 alpha = pdlamch( ictxt,
'Epsilon' )
7225 alpha = alpha / pdlamch( ictxt,
'Safe minimum' )
7228 CALL pb_ainfog2l( n, n, ia, ja, desca2, nprow, npcol, myrow,
7229 $ mycol, imb1, inb1, np, nq, iia, jja, iarow,
7230 $ iacol, mrrow, mrcol )
7232 IF( np.LE.0 .OR. nq.LE.0 )
7240 CALL pb_binfo( 0, np, nq, imb1, inb1, mb, nb, mrrow, mrcol,
7241 $ lcmt00, mblks, nblks, imbloc, inbloc, lmbloc,
7242 $ lnbloc, ilow, low, iupp, upp )
7246 rowrep = ( desca2( rsrc_ ).EQ.-1 )
7247 colrep = ( desca2( csrc_ ).EQ.-1 )
7248 lda = desca2( lld_ )
7265 godown = ( lcmt00.GT.iupp )
7266 goleft = ( lcmt00.LT.ilow )
7268 IF( .NOT.godown .AND. .NOT.goleft )
THEN
7272 IF( lcmt00.GE.0 )
THEN
7273 ijoffa = ioffa + lcmt00 + ( joffa - 1 ) * lda
7274 DO 10 i = 1,
min( inbloc,
max( 0, imbloc - lcmt00 ) )
7275 atmp = dble( a( ijoffa + i*ldap1 ) )
7276 a( ijoffa + i*ldap1 ) = dcmplx( atmp, alpha )
7279 ijoffa = ioffa + ( joffa - lcmt00 - 1 ) * lda
7280 DO 20 i = 1,
min( imbloc,
max( 0, inbloc + lcmt00 ) )
7281 atmp = dble( a( ijoffa + i*ldap1 ) )
7282 a( ijoffa + i*ldap1 ) = dcmplx( atmp, alpha )
7285 goleft = ( ( lcmt00 - ( iupp - upp + pmb ) ).LT.ilow )
7286 godown = .NOT.goleft
7292 lcmt00 = lcmt00 - ( iupp - upp + pmb )
7294 ioffa = ioffa + imbloc
7297 IF( mblks.GT.0 .AND. lcmt00.GT.upp )
THEN
7298 lcmt00 = lcmt00 - pmb
7313 IF( mblkd.GT.0 .AND. lcmt.GE.ilow )
THEN
7316 IF( lcmt.GE.0 )
THEN
7317 ijoffa = ioffd + lcmt + ( joffa - 1 ) * lda
7318 DO 50 i = 1,
min( inbloc,
max( 0, mbloc - lcmt ) )
7319 atmp = dble( a( ijoffa + i*ldap1 ) )
7320 a( ijoffa + i*ldap1 ) = dcmplx( atmp, alpha )
7323 ijoffa = ioffd + ( joffa - lcmt - 1 ) * lda
7324 DO 60 i = 1,
min( mbloc,
max( 0, inbloc + lcmt ) )
7325 atmp = dble( a( ijoffa + i*ldap1 ) )
7326 a( ijoffa + i*ldap1 ) = dcmplx( atmp, alpha )
7334 ioffd = ioffd + mbloc
7338 lcmt00 = lcmt00 + low - ilow + qnb
7340 joffa = joffa + inbloc
7342 ELSE IF( goleft )
THEN
7344 lcmt00 = lcmt00 + low - ilow + qnb
7346 joffa = joffa + inbloc
7349 IF( nblks.GT.0 .AND. lcmt00.LT.low )
THEN
7350 lcmt00 = lcmt00 + qnb
7365 IF( nblkd.GT.0 .AND. lcmt.LE.iupp )
THEN
7368 IF( lcmt.GE.0 )
THEN
7369 ijoffa = ioffa + lcmt + ( joffd - 1 ) * lda
7370 DO 90 i = 1,
min( nbloc,
max( 0, imbloc - lcmt ) )
7371 atmp = dble( a( ijoffa + i*ldap1 ) )
7372 a( ijoffa + i*ldap1 ) = dcmplx( atmp, alpha )
7375 ijoffa = ioffa + ( joffd - lcmt - 1 ) * lda
7376 DO 100 i = 1,
min( imbloc,
max( 0, nbloc + lcmt ) )
7377 atmp = dble( a( ijoffa + i*ldap1 ) )
7378 a( ijoffa + i*ldap1 ) = dcmplx( atmp, alpha )
7386 joffd = joffd + nbloc
7390 lcmt00 = lcmt00 - ( iupp - upp + pmb )
7392 ioffa = ioffa + imbloc
7398 IF( nblks.GT.0 )
THEN
7402 IF( mblks.GT.0 .AND. lcmt00.GT.upp )
THEN
7403 lcmt00 = lcmt00 - pmb
7418 IF( mblkd.GT.0 .AND. lcmt.GE.low )
THEN
7421 IF( lcmt.GE.0 )
THEN
7422 ijoffa = ioffd + lcmt + ( joffa - 1 ) * lda
7423 DO 140 i = 1,
min( nbloc,
max( 0, mbloc - lcmt ) )
7424 atmp = dble( a( ijoffa + i*ldap1 ) )
7425 a( ijoffa + i*ldap1 ) = dcmplx( atmp, alpha )
7428 ijoffa = ioffd + ( joffa - lcmt - 1 ) * lda
7429 DO 150 i = 1,
min( mbloc,
max( 0, nbloc + lcmt ) )
7430 atmp = dble( a( ijoffa + i*ldap1 ) )
7431 a( ijoffa + i*ldap1 ) = dcmplx( atmp, alpha )
7439 ioffd = ioffd + mbloc
7443 lcmt00 = lcmt00 + qnb
7445 joffa = joffa + nbloc
7474 DOUBLE PRECISION temp
7477 EXTERNAL dgamn2d, dgamx2d, pb_topget
7488 IF(
lsame( cmach,
'E' ).OR.
lsame( cmach,
'S' ).OR.
7489 $
lsame( cmach,
'M' ).OR.
lsame( cmach,
'U' ) )
THEN
7490 CALL pb_topget( ictxt,
'Combine',
'All', top )
7492 CALL dgamx2d( ictxt,
'All', top, 1, 1, temp, 1, idumm,
7493 $ idumm, -1, -1, idumm )
7494 ELSE IF(
lsame( cmach,
'L' ).OR.
lsame( cmach,
'O' ) )
THEN
7495 CALL pb_topget( ictxt,
'Combine',
'All', top )
7497 CALL dgamn2d( ictxt,
'All', top, 1, 1, temp, 1, idumm,
7498 $ idumm, -1, -1, idumm )
7508 SUBROUTINE pzlaset( UPLO, M, N, ALPHA, BETA, A, IA, JA, DESCA )
7517 INTEGER IA, JA, M, N
7518 COMPLEX*16 ALPHA, BETA
7653 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
7654 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
7656 PARAMETER ( BLOCK_CYCLIC_2D_INB = 2, dlen_ = 11,
7657 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
7658 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
7659 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
7662 LOGICAL GODOWN, GOLEFT, ISCOLREP, ISROWREP, LOWER,
7664 INTEGER IACOL, IAROW, ICTXT, IIA, IIMAX, ILOW, IMB1,
7665 $ IMBLOC, INB1, INBLOC, IOFFA, IOFFD, IUPP, JJA,
7666 $ JJMAX, JOFFA, JOFFD, LCMT, LCMT00, LDA, LMBLOC,
7667 $ LNBLOC, LOW, M1, MB, MBLKD, MBLKS, MBLOC, MP,
7668 $ MRCOL, MRROW, MYCOL, MYROW, N1, NB, NBLKD,
7669 $ NBLKS, NBLOC, NPCOL, NPROW, NQ, PMB, QNB, TMP1,
7673 INTEGER DESCA2( DLEN_ )
7688 IF( m.EQ.0 .OR. n.EQ.0 )
7697 ictxt = desca2( ctxt_ )
7698 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
7700 CALL pb_ainfog2l( m, n, ia, ja, desca2, nprow, npcol, myrow,
7701 $ mycol, imb1, inb1, mp, nq, iia, jja, iarow,
7702 $ iacol, mrrow, mrcol )
7704 IF( mp.LE.0 .OR. nq.LE.0 )
7707 isrowrep = ( desca2( rsrc_ ).LT.0 )
7708 iscolrep = ( desca2( csrc_ ).LT.0 )
7709 lda = desca2( lld_ )
7711 upper = .NOT.( lsame( uplo,
'L' ) )
7712 lower = .NOT.( lsame( uplo,
'U' ) )
7714 IF( ( ( lower.AND.upper ).AND.( alpha.EQ.beta ) ).OR.
7715 $ ( isrowrep .AND. iscolrep ) )
THEN
7716 IF( ( mp.GT.0 ).AND.( nq.GT.0 ) )
7717 $
CALL pb_zlaset( uplo, mp, nq, 0, alpha, beta,
7718 $ a( iia + ( jja - 1 ) * lda ), lda )
7727 CALL pb_binfo( 0, mp, nq, imb1, inb1, mb, nb, mrrow, mrcol,
7728 $ lcmt00, mblks, nblks, imbloc, inbloc, lmbloc,
7729 $ lnbloc, ilow, low, iupp, upp )
7753 godown = ( lcmt00.GT.iupp )
7754 goleft = ( lcmt00.LT.ilow )
7756 IF( .NOT.godown .AND. .NOT.goleft )
THEN
7760 goleft = ( ( lcmt00 - ( iupp - upp + pmb ) ).LT.ilow )
7761 godown = .NOT.goleft
7763 CALL pb_zlaset( uplo, imbloc, inbloc, lcmt00, alpha, beta,
7764 $ a( iia+joffa*lda ), lda )
7766 IF( upper .AND. nq.GT.inbloc )
7767 $
CALL pb_zlaset(
'All', imbloc, nq-inbloc, 0, alpha,
7768 $ alpha, a( iia+(joffa+inbloc)*lda ), lda )
7772 IF( lower .AND. mp.GT.imbloc )
7773 $
CALL pb_zlaset(
'All', mp-imbloc, inbloc, 0, alpha,
7774 $ alpha, a( iia+imbloc+joffa*lda ), lda )
7783 lcmt00 = lcmt00 - ( iupp - upp + pmb )
7785 ioffa = ioffa + imbloc
7788 IF( mblks.GT.0 .AND. lcmt00.GT.upp )
THEN
7789 lcmt00 = lcmt00 - pmb
7795 tmp1 =
min( ioffa, iimax ) - iia + 1
7796 IF( upper .AND. tmp1.GT.0 )
THEN
7797 CALL pb_zlaset(
'All', tmp1, n1, 0, alpha, alpha,
7798 $ a( iia+joffa*lda ), lda )
7812 IF( mblkd.GT.0 .AND. lcmt.GE.ilow )
THEN
7815 CALL pb_zlaset( uplo, mbloc, inbloc, lcmt, alpha, beta,
7816 $ a( ioffd+1+joffa*lda ), lda )
7822 ioffd = ioffd + mbloc
7826 tmp1 = m1 - ioffd + iia - 1
7827 IF( lower .AND. tmp1.GT.0 )
7828 $
CALL pb_zlaset(
'ALL', tmp1, inbloc, 0, alpha, alpha,
7829 $ a( ioffd+1+joffa*lda ), lda )
7831 tmp1 = ioffa - iia + 1
7834 lcmt00 = lcmt00 + low - ilow + qnb
7836 joffa = joffa + inbloc
7838 IF( upper .AND. tmp1.GT.0 .AND. n1.GT.0 )
7839 $
CALL pb_zlaset(
'ALL', tmp1, n1, 0, alpha, alpha,
7840 $ a( iia+joffa*lda ), lda )
7845 ELSE IF( goleft )
THEN
7847 lcmt00 = lcmt00 + low - ilow + qnb
7849 joffa = joffa + inbloc
7852 IF( nblks.GT.0 .AND. lcmt00.LT.low )
THEN
7853 lcmt00 = lcmt00 + qnb
7859 tmp1 =
min( joffa, jjmax ) - jja + 1
7860 IF( lower .AND. tmp1.GT.0 )
THEN
7861 CALL pb_zlaset(
'All', m1, tmp1, 0, alpha, alpha,
7862 $ a( iia+(jja-1)*lda ), lda )
7876 IF( nblkd.GT.0 .AND. lcmt.LE.iupp )
THEN
7879 CALL pb_zlaset( uplo, imbloc, nbloc, lcmt, alpha, beta,
7880 $ a( iia+joffd*lda ), lda )
7886 joffd = joffd + nbloc
7890 tmp1 = n1 - joffd + jja - 1
7891 IF( upper .AND. tmp1.GT.0 )
7892 $
CALL pb_zlaset(
'All', imbloc, tmp1, 0, alpha, alpha,
7893 $ a( iia+joffd*lda ), lda )
7895 tmp1 = joffa - jja + 1
7898 lcmt00 = lcmt00 - ( iupp - upp + pmb )
7900 ioffa = ioffa + imbloc
7902 IF( lower .AND. m1.GT.0 .AND. tmp1.GT.0 )
7903 $
CALL pb_zlaset(
'All', m1, tmp1, 0, alpha, alpha,
7904 $ a( ioffa+1+(jja-1)*lda ), lda )
7913 IF( nblks.GT.0 )
THEN
7917 IF( mblks.GT.0 .AND. lcmt00.GT.upp )
THEN
7918 lcmt00 = lcmt00 - pmb
7924 tmp1 =
min( ioffa, iimax ) - iia + 1
7925 IF( upper .AND. tmp1.GT.0 )
THEN
7926 CALL pb_zlaset(
'All', tmp1, n1, 0, alpha, alpha,
7927 $ a( iia+joffa*lda ), lda )
7941 IF( mblkd.GT.0 .AND. lcmt.GE.low )
THEN
7944 CALL pb_zlaset( uplo, mbloc, nbloc, lcmt, alpha, beta,
7945 $ a( ioffd+1+joffa*lda ), lda )
7951 ioffd = ioffd + mbloc
7955 tmp1 = m1 - ioffd + iia - 1
7956 IF( lower .AND. tmp1.GT.0 )
7957 $
CALL pb_zlaset(
'All', tmp1, nbloc, 0, alpha, alpha,
7958 $ a( ioffd+1+joffa*lda ), lda )
7960 tmp1 =
min( ioffa, iimax ) - iia + 1
7963 lcmt00 = lcmt00 + qnb
7965 joffa = joffa + nbloc
7967 IF( upper .AND. tmp1.GT.0 .AND. n1.GT.0 )
7968 $
CALL pb_zlaset(
'All', tmp1, n1, 0, alpha, alpha,
7969 $ a( iia+joffa*lda ), lda )
7983 SUBROUTINE pzlascal( TYPE, M, N, ALPHA, A, IA, JA, DESCA )
7992 INTEGER IA, JA, M, N
8118 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
8119 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
8121 PARAMETER ( BLOCK_CYCLIC_2D_INB = 2, dlen_ = 11,
8122 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
8123 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
8124 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
8128 LOGICAL GODOWN, GOLEFT, LOWER, UPPER
8129 INTEGER IACOL, IAROW, ICTXT, IIA, IIMAX, ILOW, IMB1,
8130 $ IMBLOC, INB1, INBLOC, IOFFA, IOFFD, ITYPE,
8131 $ IUPP, JJA, JJMAX, JOFFA, JOFFD, LCMT, LCMT00,
8132 $ LDA, LMBLOC, LNBLOC, LOW, M1, MB, MBLKD, MBLKS,
8133 $ MBLOC, MP, MRCOL, MRROW, MYCOL, MYROW, N1, NB,
8134 $ NBLKD, NBLKS, NBLOC, NPCOL, NPROW, NQ, PMB,
8138 INTEGER DESCA2( DLEN_ )
8147 EXTERNAL lsame, pb_numroc
8160 ictxt = desca2( ctxt_ )
8161 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
8165 IF( m.EQ.0 .OR. n.EQ.0 )
8168 IF( lsame(
TYPE,
'L' ) ) then
8174 ELSE IF( lsame(
TYPE,
'U' ) ) then
8180 ELSE IF( lsame(
TYPE,
'H' ) ) then
8196 IF( itype.EQ.0 )
THEN
8200 CALL pb_infog2l( ia, ja, desca2, nprow, npcol, myrow, mycol,
8201 $ iia, jja, iarow, iacol )
8202 mp = pb_numroc( m, ia, desca2( imb_ ), desca2( mb_ ), myrow,
8203 $ desca2( rsrc_ ), nprow )
8204 nq = pb_numroc( n, ja, desca2( inb_ ), desca2( nb_ ), mycol,
8205 $ desca2( csrc_ ), npcol )
8207 IF( mp.LE.0 .OR. nq.LE.0 )
8210 lda = desca2( lld_ )
8211 ioffa = iia + ( jja - 1 ) * lda
8213 CALL pb_zlascal(
'All', mp, nq, 0, alpha, a( ioffa ), lda )
8219 CALL pb_ainfog2l( m, n, ia, ja, desca2, nprow, npcol, myrow,
8220 $ mycol, imb1, inb1, mp, nq, iia, jja, iarow,
8221 $ iacol, mrrow, mrcol )
8223 IF( mp.LE.0 .OR. nq.LE.0 )
8231 lda = desca2( lld_ )
8233 CALL pb_binfo( ioffd, mp, nq, imb1, inb1, mb, nb, mrrow,
8234 $ mrcol, lcmt00, mblks, nblks, imbloc, inbloc,
8235 $ lmbloc, lnbloc, ilow, low, iupp, upp )
8244 IF( desca2( rsrc_ ).LT.0 )
THEN
8249 IF( desca2( csrc_ ).LT.0 )
THEN
8258 godown = ( lcmt00.GT.iupp )
8259 goleft = ( lcmt00.LT.ilow )
8261 IF( .NOT.godown .AND. .NOT.goleft )
THEN
8265 goleft = ( ( lcmt00 - ( iupp - upp + pmb ) ).LT.ilow )
8266 godown = .NOT.goleft
8268 CALL pb_zlascal( uplo, imbloc, inbloc, lcmt00, alpha,
8269 $ a( iia+joffa*lda ), lda )
8271 IF( upper .AND. nq.GT.inbloc )
8272 $
CALL pb_zlascal(
'All', imbloc, nq-inbloc, 0, alpha,
8273 $ a( iia+(joffa+inbloc)*lda ), lda )
8277 IF( lower .AND. mp.GT.imbloc )
8278 $
CALL pb_zlascal(
'All', mp-imbloc, inbloc, 0, alpha,
8279 $ a( iia+imbloc+joffa*lda ), lda )
8288 lcmt00 = lcmt00 - ( iupp - upp + pmb )
8290 ioffa = ioffa + imbloc
8293 IF( mblks.GT.0 .AND. lcmt00.GT.upp )
THEN
8294 lcmt00 = lcmt00 - pmb
8300 tmp1 =
min( ioffa, iimax ) - iia + 1
8301 IF( upper .AND. tmp1.GT.0 )
THEN
8303 $ a( iia+joffa*lda ), lda )
8317 IF( mblkd.GT.0 .AND. lcmt.GE.ilow )
THEN
8320 CALL pb_zlascal( uplo, mbloc, inbloc, lcmt, alpha,
8321 $ a( ioffd+1+joffa*lda ), lda )
8327 ioffd = ioffd + mbloc
8331 tmp1 = m1 - ioffd + iia - 1
8332 IF( lower .AND. tmp1.GT.0 )
8333 $
CALL pb_zlascal(
'All', tmp1, inbloc, 0, alpha,
8334 $ a( ioffd+1+joffa*lda ), lda )
8336 tmp1 = ioffa - iia + 1
8339 lcmt00 = lcmt00 + low - ilow + qnb
8341 joffa = joffa + inbloc
8343 IF( upper .AND. tmp1.GT.0 .AND. n1.GT.0 )
8344 $
CALL pb_zlascal(
'All', tmp1, n1, 0, alpha,
8345 $ a( iia+joffa*lda ), lda )
8350 ELSE IF( goleft )
THEN
8352 lcmt00 = lcmt00 + low - ilow + qnb
8354 joffa = joffa + inbloc
8357 IF( nblks.GT.0 .AND. lcmt00.LT.low )
THEN
8358 lcmt00 = lcmt00 + qnb
8364 tmp1 =
min( joffa, jjmax ) - jja + 1
8365 IF( lower .AND. tmp1.GT.0 )
THEN
8367 $ a( iia+(jja-1)*lda ), lda )
8381 IF( nblkd.GT.0 .AND. lcmt.LE.iupp )
THEN
8384 CALL pb_zlascal( uplo, imbloc, nbloc, lcmt, alpha,
8385 $ a( iia+joffd*lda ), lda )
8391 joffd = joffd + nbloc
8395 tmp1 = n1 - joffd + jja - 1
8396 IF( upper .AND. tmp1.GT.0 )
8397 $
CALL pb_zlascal(
'All', imbloc, tmp1, 0, alpha,
8398 $ a( iia+joffd*lda ), lda )
8400 tmp1 = joffa - jja + 1
8403 lcmt00 = lcmt00 - ( iupp - upp + pmb )
8405 ioffa = ioffa + imbloc
8407 IF( lower .AND. m1.GT.0 .AND. tmp1.GT.0 )
8408 $
CALL pb_zlascal(
'All', m1, tmp1, 0, alpha,
8409 $ a( ioffa+1+(jja-1)*lda ), lda )
8418 IF( nblks.GT.0 )
THEN
8422 IF( mblks.GT.0 .AND. lcmt00.GT.upp )
THEN
8423 lcmt00 = lcmt00 - pmb
8429 tmp1 =
min( ioffa, iimax ) - iia + 1
8430 IF( upper .AND. tmp1.GT.0 )
THEN
8432 $ a( iia+joffa*lda ), lda )
8446 IF( mblkd.GT.0 .AND. lcmt.GE.low )
THEN
8449 CALL pb_zlascal( uplo, mbloc, nbloc, lcmt, alpha,
8450 $ a( ioffd+1+joffa*lda ), lda )
8456 ioffd = ioffd + mbloc
8460 tmp1 = m1 - ioffd + iia - 1
8461 IF( lower .AND. tmp1.GT.0 )
8462 $
CALL pb_zlascal(
'All', tmp1, nbloc, 0, alpha,
8463 $ a( ioffd+1+joffa*lda ), lda )
8465 tmp1 =
min( ioffa, iimax ) - iia + 1
8468 lcmt00 = lcmt00 + qnb
8470 joffa = joffa + nbloc
8472 IF( upper .AND. tmp1.GT.0 .AND. n1.GT.0 )
8473 $
CALL pb_zlascal(
'All', tmp1, n1, 0, alpha,
8474 $ a( iia+joffa*lda ), lda )
8490 SUBROUTINE pzlagen( INPLACE, AFORM, DIAG, OFFA, M, N, IA, JA,
8491 $ DESCA, IASEED, A, LDA )
8500 CHARACTER*1 aform, diag
8501 INTEGER ia, iaseed, ja, lda, m, n, offa
8505 COMPLEX*16 A( LDA, * )
8683 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
8684 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
8686 PARAMETER ( BLOCK_CYCLIC_2D_INB = 2, dlen_ = 11,
8687 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
8688 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
8689 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
8690 INTEGER JMP_1, JMP_COL, JMP_IMBV, JMP_INBV, JMP_LEN,
8691 $ JMP_MB, JMP_NB, JMP_NPIMBLOC, JMP_NPMB,
8692 $ JMP_NQINBLOC, JMP_NQNB, JMP_ROW
8693 PARAMETER ( JMP_1 = 1, jmp_row = 2, jmp_col = 3,
8694 $ jmp_mb = 4, jmp_imbv = 5, jmp_npmb = 6,
8695 $ jmp_npimbloc = 7, jmp_nb = 8, jmp_inbv = 9,
8696 $ jmp_nqnb = 10, jmp_nqinbloc = 11,
8698 DOUBLE PRECISION ZERO
8699 PARAMETER ( ZERO = 0.0d+0 )
8702 LOGICAL DIAGDO, SYMM, HERM, NOTRAN
8703 INTEGER CSRC, I, IACOL, IAROW, ICTXT, IIA, ILOCBLK,
8704 $ ILOCOFF, ILOW, IMB, IMB1, IMBLOC, IMBVIR, INB,
8705 $ INB1, INBLOC, INBVIR, INFO, IOFFDA, ITMP, IUPP,
8706 $ ivir, jja, jlocblk, jlocoff, jvir, lcmt00,
8707 $ lmbloc, lnbloc, low, maxmn, mb, mblks, mp,
8708 $ mrcol, mrrow, mycdist, mycol, myrdist, myrow,
8709 $ nb, nblks, npcol, nprow, nq, nvir, rsrc, upp
8713 INTEGER DESCA2( DLEN_ ), IMULADD( 4, JMP_LEN ),
8714 $ IRAN( 2 ), JMP( JMP_LEN ), MULADD0( 4 )
8717 EXTERNAL BLACS_GRIDINFO, PB_AINFOG2L, PB_BINFO,
8728 INTRINSIC DBLE, DCMPLX, MAX, MIN
8731 DATA ( muladd0( i ), i = 1, 4 ) / 20077, 16838,
8742 ictxt = desca2( ctxt_ )
8743 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
8748 IF( nprow.EQ.-1 )
THEN
8749 info = -( 1000 + ctxt_ )
8751 symm = lsame( aform,
'S' )
8752 herm = lsame( aform,
'H' )
8753 notran = lsame( aform,
'N' )
8754 diagdo = lsame( diag,
'D' )
8755 IF( .NOT.( symm.OR.herm.OR.notran ) .AND.
8756 $ .NOT.( lsame( aform,
'T' ) ) .AND.
8757 $ .NOT.( lsame( aform,
'C' ) ) )
THEN
8759 ELSE IF( ( .NOT.diagdo ) .AND.
8760 $ ( .NOT.lsame( diag,
'N' ) ) )
THEN
8763 CALL pb_chkmat( ictxt, m, 5, n, 6, ia, ja, desca2, 10, info )
8766 IF( info.NE.0 )
THEN
8767 CALL pxerbla( ictxt,
'PZLAGEN', -info )
8773 IF( ( m.LE.0 ).OR.( n.LE.0 ) )
8780 imb = desca2( imb_ )
8781 inb = desca2( inb_ )
8782 rsrc = desca2( rsrc_ )
8783 csrc = desca2( csrc_ )
8787 CALL pb_ainfog2l( m, n, ia, ja, desca2, nprow, npcol, myrow,
8788 $ mycol, imb1, inb1, mp, nq, iia, jja, iarow,
8789 $ iacol, mrrow, mrcol )
8801 ioffda = ja + offa - ia
8802 CALL pb_binfo( ioffda, mp, nq, imb1, inb1, mb, nb, mrrow,
8803 $ mrcol, lcmt00, mblks, nblks, imbloc, inbloc,
8804 $ lmbloc, lnbloc, ilow, low, iupp, upp )
8812 itmp = max( 0, -offa )
8815 nvir = desca2( m_ ) + itmp
8817 CALL pb_locinfo( ivir, imbvir, mb, myrow, rsrc, nprow, ilocblk,
8818 $ ilocoff, myrdist )
8820 itmp = max( 0, offa )
8823 nvir = max( max( nvir, desca2( n_ ) + itmp ),
8824 $ desca2( m_ ) + desca2( n_ ) - 1 )
8826 CALL pb_locinfo( jvir, inbvir, nb, mycol, csrc, npcol, jlocblk,
8827 $ jlocoff, mycdist )
8829 IF( symm .OR. herm .OR. notran )
THEN
8831 CALL pb_initjmp( .true., nvir, imbvir, inbvir, imbloc, inbloc,
8832 $ mb, nb, rsrc, csrc, nprow, npcol, 2, jmp )
8840 CALL pb_setlocran( iaseed, ilocblk, jlocblk, ilocoff, jlocoff,
8841 $ myrdist, mycdist, nprow, npcol, jmp,
8844 CALL pb_zlagen(
'Lower', aform, a( iia, jja ), lda, lcmt00,
8845 $ iran, mblks, imbloc, mb, lmbloc, nblks, inbloc,
8846 $ nb, lnbloc, jmp, imuladd )
8850 IF( symm .OR. herm .OR. ( .NOT. notran ) )
THEN
8852 CALL pb_initjmp( .false., nvir, imbvir, inbvir, imbloc, inbloc,
8853 $ mb, nb, rsrc, csrc, nprow, npcol, 2, jmp )
8861 CALL pb_setlocran( iaseed, ilocblk, jlocblk, ilocoff, jlocoff,
8862 $ myrdist, mycdist, nprow, npcol, jmp,
8865 CALL pb_zlagen(
'Upper', aform, a( iia, jja ), lda, lcmt00,
8866 $ iran, mblks, imbloc, mb, lmbloc, nblks, inbloc,
8867 $ nb, lnbloc, jmp, imuladd )
8873 maxmn = max( desca2( m_ ), desca2( n_ ) )
8875 alpha = dcmplx( dble( 2 * maxmn ), zero )
8877 alpha = dcmplx( dble( nvir ), dble( maxmn ) )
8880 IF( ioffda.GE.0 )
THEN
8881 CALL pzladom( inplace, min( max( 0, m-ioffda ), n ), alpha,
8882 $ a, min( ia+ioffda, ia+m-1 ), ja, desca )
8884 CALL pzladom( inplace, min( m, max( 0, n+ioffda ) ), alpha,
8885 $ a, ia, min( ja-ioffda, ja+n-1 ), desca )
8895 SUBROUTINE pzladom( INPLACE, N, ALPHA, A, IA, JA, DESCA )
9023 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
9024 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
9026 PARAMETER ( BLOCK_CYCLIC_2D_INB = 2, dlen_ = 11,
9027 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
9028 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
9029 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
9032 LOGICAL GODOWN, GOLEFT
9033 INTEGER I, IACOL, IAROW, ICTXT, IIA, IJOFFA, ILOW,
9034 $ IMB1, IMBLOC, INB1, INBLOC, IOFFA, IOFFD, IUPP,
9035 $ JJA, JOFFA, JOFFD, LCMT, LCMT00, LDA, LDAP1,
9036 $ LMBLOC, LNBLOC, LOW, MB, MBLKD, MBLKS, MBLOC,
9037 $ MRCOL, MRROW, MYCOL, MYROW, NB, NBLKD, NBLKS,
9038 $ NBLOC, NP, NPCOL, NPROW, NQ, PMB, QNB, UPP
9042 INTEGER DESCA2( DLEN_ )
9049 INTRINSIC abs, dble, dcmplx, dimag,
max,
min
9059 ictxt = desca2( ctxt_ )
9060 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
9065 CALL pb_ainfog2l( n, n, ia, ja, desca2, nprow, npcol, myrow,
9066 $ mycol, imb1, inb1, np, nq, iia, jja, iarow,
9067 $ iacol, mrrow, mrcol )
9082 CALL pb_binfo( 0, np, nq, imb1, inb1, mb, nb, mrrow, mrcol,
9083 $ lcmt00, mblks, nblks, imbloc, inbloc, lmbloc,
9084 $ lnbloc, ilow, low, iupp, upp )
9088 lda = desca2( lld_ )
9091 IF( desca2( rsrc_ ).LT.0 )
THEN
9096 IF( desca2( csrc_ ).LT.0 )
THEN
9105 godown = ( lcmt00.GT.iupp )
9106 goleft = ( lcmt00.LT.ilow )
9108 IF( .NOT.godown .AND. .NOT.goleft )
THEN
9112 IF( lcmt00.GE.0 )
THEN
9113 ijoffa = ioffa+lcmt00 + ( joffa - 1 ) * lda
9114 DO 10 i = 1,
min( inbloc,
max( 0, imbloc - lcmt00 ) )
9115 atmp = a( ijoffa + i*ldap1 )
9116 a( ijoffa + i*ldap1 ) = alpha +
9117 $ dcmplx( abs( dble( atmp ) ),
9118 $ abs( dimag( atmp ) ) )
9121 ijoffa = ioffa + ( joffa - lcmt00 - 1 ) * lda
9122 DO 20 i = 1,
min( imbloc,
max( 0, inbloc + lcmt00 ) )
9123 atmp = a( ijoffa + i*ldap1 )
9124 a( ijoffa + i*ldap1 ) = alpha +
9125 $ dcmplx( abs( dble( atmp ) ),
9126 $ abs( dimag( atmp ) ) )
9129 goleft = ( ( lcmt00 - ( iupp - upp + pmb ) ).LT.ilow )
9130 godown = .NOT.goleft
9136 lcmt00 = lcmt00 - ( iupp - upp + pmb )
9138 ioffa = ioffa + imbloc
9141 IF( mblks.GT.0 .AND. lcmt00.GT.upp )
THEN
9142 lcmt00 = lcmt00 - pmb
9154 IF( mblkd.GT.0 .AND. lcmt.GE.ilow )
THEN
9157 IF( lcmt.GE.0 )
THEN
9158 ijoffa = ioffd + lcmt + ( joffa - 1 ) * lda
9159 DO 50 i = 1,
min( inbloc,
max( 0, mbloc - lcmt ) )
9160 atmp = a( ijoffa + i*ldap1 )
9161 a( ijoffa + i*ldap1 ) = alpha +
9162 $ dcmplx( abs( dble( atmp ) ),
9163 $ abs( dimag( atmp ) ) )
9166 ijoffa = ioffd + ( joffa - lcmt - 1 ) * lda
9167 DO 60 i = 1,
min( mbloc,
max( 0, inbloc + lcmt ) )
9168 atmp = a( ijoffa + i*ldap1 )
9169 a( ijoffa + i*ldap1 ) = alpha +
9170 $ dcmplx( abs( dble( atmp ) ),
9171 $ abs( dimag( atmp ) ) )
9179 ioffd = ioffd + mbloc
9183 lcmt00 = lcmt00 + low - ilow + qnb
9185 joffa = joffa + inbloc
9187 ELSE IF( goleft )
THEN
9189 lcmt00 = lcmt00 + low - ilow + qnb
9191 joffa = joffa + inbloc
9194 IF( nblks.GT.0 .AND. lcmt00.LT.low )
THEN
9195 lcmt00 = lcmt00 + qnb
9207 IF( nblkd.GT.0 .AND. lcmt.LE.iupp )
THEN
9210 IF( lcmt.GE.0 )
THEN
9211 ijoffa = ioffa + lcmt + ( joffd - 1 ) * lda
9212 DO 90 i = 1,
min( nbloc,
max( 0, imbloc - lcmt ) )
9213 atmp = a( ijoffa + i*ldap1 )
9214 a( ijoffa + i*ldap1 ) = alpha +
9215 $ dcmplx( abs( dble( atmp ) ),
9216 $ abs( dimag( atmp ) ) )
9219 ijoffa = ioffa + ( joffd - lcmt - 1 ) * lda
9220 DO 100 i = 1,
min( imbloc,
max( 0, nbloc + lcmt ) )
9221 atmp = a( ijoffa + i*ldap1 )
9222 a( ijoffa + i*ldap1 ) = alpha +
9223 $ dcmplx( abs( dble( atmp ) ),
9224 $ abs( dimag( atmp ) ) )
9232 joffd = joffd + nbloc
9236 lcmt00 = lcmt00 - ( iupp - upp + pmb )
9238 ioffa = ioffa + imbloc
9244 IF( nblks.GT.0 )
THEN
9248 IF( mblks.GT.0 .AND. lcmt00.GT.upp )
THEN
9249 lcmt00 = lcmt00 - pmb
9261 IF( mblkd.GT.0 .AND. lcmt.GE.low )
THEN
9264 IF( lcmt.GE.0 )
THEN
9265 ijoffa = ioffd + lcmt + ( joffa - 1 ) * lda
9266 DO 140 i = 1,
min( nbloc,
max( 0, mbloc - lcmt ) )
9267 atmp = a( ijoffa + i*ldap1 )
9268 a( ijoffa + i*ldap1 ) = alpha +
9269 $ dcmplx( abs( dble( atmp ) ),
9270 $ abs( dimag( atmp ) ) )
9273 ijoffa = ioffd + ( joffa - lcmt - 1 ) * lda
9274 DO 150 i = 1,
min( mbloc,
max( 0, nbloc + lcmt ) )
9275 atmp = a( ijoffa + i*ldap1 )
9276 a( ijoffa + i*ldap1 ) = alpha +
9277 $ dcmplx( abs( dble( atmp ) ),
9278 $ abs( dimag( atmp ) ) )
9286 ioffd = ioffd + mbloc
9290 lcmt00 = lcmt00 + qnb
9292 joffa = joffa + nbloc
9303 $ CMATNM, NOUT, WORK )
9311 INTEGER IA, ICPRNT, IRPRNT, JA, M, N, NOUT
9314 CHARACTER*(*) CMATNM
9316 COMPLEX*16 A( * ), WORK( * )
9442 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
9443 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
9445 PARAMETER ( BLOCK_CYCLIC_2D_INB = 2, dlen_ = 11,
9446 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
9447 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
9448 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
9451 INTEGER MYCOL, MYROW, NPCOL, NPROW, PCOL, PROW
9454 INTEGER DESCA2( DLEN_ )
9457 EXTERNAL BLACS_GRIDINFO, PB_DESCTRANS, PB_PZLAPRN2
9463 IF( ( m.LE.0 ).OR.( n.LE.0 ) )
9468 CALL pb_desctrans( desca, desca2 )
9470 CALL blacs_gridinfo( desca2( ctxt_ ), nprow, npcol, myrow, mycol )
9472 IF( desca2( rsrc_ ).GE.0 )
THEN
9473 IF( desca2( csrc_ ).GE.0 )
THEN
9474 CALL pb_pzlaprn2( m, n, a, ia, ja, desca2, irprnt, icprnt,
9475 $ cmatnm, nout, desca2( rsrc_ ),
9476 $ desca2( csrc_ ), work )
9478 DO 10 pcol = 0, npcol - 1
9479 IF( ( myrow.EQ.irprnt ).AND.( mycol.EQ.icprnt ) )
9480 $
WRITE( nout, * )
'Colum-replicated array -- ' ,
9481 $
'copy in process column: ', pcol
9482 CALL pb_pzlaprn2( m, n, a, ia, ja, desca2, irprnt,
9483 $ icprnt, cmatnm, nout, desca2( rsrc_ ),
9488 IF( desca2( csrc_ ).GE.0 )
THEN
9489 DO 20 prow = 0, nprow - 1
9490 IF( ( myrow.EQ.irprnt ).AND.( mycol.EQ.icprnt ) )
9491 $
WRITE( nout, * )
'Row-replicated array -- ' ,
9492 $
'copy in process row: ', prow
9493 CALL pb_pzlaprn2( m, n, a, ia, ja, desca2, irprnt,
9494 $ icprnt, cmatnm, nout, prow,
9495 $ desca2( csrc_ ), work )
9498 DO 40 prow = 0, nprow - 1
9499 DO 30 pcol = 0, npcol - 1
9500 IF( ( myrow.EQ.irprnt ).AND.( mycol.EQ.icprnt ) )
9501 $
WRITE( nout, * )
'Replicated array -- ' ,
9502 $
'copy in process (', prow,
',', pcol,
')'
9503 CALL pb_pzlaprn2( m, n, a, ia, ja, desca2, irprnt,
9504 $ icprnt, cmatnm, nout, prow, pcol,
9517 $ CMATNM, NOUT, PROW, PCOL, WORK )
9525 INTEGER IA, ICPRNT, IRPRNT, JA, M, N, NOUT, PCOL, PROW
9528 CHARACTER*(*) CMATNM
9530 COMPLEX*16 A( * ), WORK( * )
9534 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
9535 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
9537 parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
9538 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
9539 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
9540 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
9543 LOGICAL AISCOLREP, AISROWREP
9544 INTEGER H, I, IACOL, IAROW, IB, ICTXT, ICURCOL,
9545 $ ICURROW, II, IIA, IN, J, JB, JJ, JJA, JN, K,
9546 $ LDA, LDW, MYCOL, MYROW, NPCOL, NPROW
9549 EXTERNAL blacs_barrier, blacs_gridinfo,
pb_infog2l,
9553 INTRINSIC dble, dimag,
min
9559 ictxt = desca( ctxt_ )
9560 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
9561 CALL pb_infog2l( ia, ja, desca, nprow, npcol, myrow, mycol,
9562 $ iia, jja, iarow, iacol )
9565 IF( desca( rsrc_ ).LT.0 )
THEN
9573 IF( desca( csrc_ ).LT.0 )
THEN
9582 ldw =
max( desca( imb_ ), desca( mb_ ) )
9586 jb = desca( inb_ ) - ja + 1
9588 $ jb = ( (-jb) / desca( nb_ ) + 1 ) * desca( nb_ ) + jb
9592 ib = desca( imb_ ) - ia + 1
9594 $ ib = ( (-ib) / desca( mb_ ) + 1 ) * desca( mb_ ) + ib
9597 IF( icurrow.EQ.irprnt .AND. icurcol.EQ.icprnt )
THEN
9598 IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt )
THEN
9600 WRITE( nout, fmt = 9999 )
9601 $ cmatnm, ia+k, ja+h,
9602 $ dble( a( ii+k+(jj+h-1)*lda ) ),
9603 $ dimag( a( ii+k+(jj+h-1)*lda ) )
9607 IF( myrow.EQ.icurrow .AND. mycol.EQ.icurcol )
THEN
9608 CALL zgesd2d( ictxt, ib, 1, a( ii+(jj+h-1)*lda ), lda,
9610 ELSE IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt )
THEN
9611 CALL zgerv2d( ictxt, ib, 1, work, ldw, icurrow, icurcol )
9613 WRITE( nout, fmt = 9999 )
9614 $ cmatnm, ia+k-1, ja+h, dble( work( k ) ),
9615 $ dimag( work( k ) )
9619 IF( myrow.EQ.icurrow )
9621 IF( .NOT.aisrowrep )
9622 $ icurrow = mod( icurrow+1, nprow )
9623 CALL blacs_barrier( ictxt,
'All' )
9627 DO 50 i = in+1, ia+m-1, desca( mb_ )
9628 ib =
min( desca( mb_ ), ia+m-i )
9629 IF( icurrow.EQ.irprnt .AND. icurcol.EQ.icprnt )
THEN
9630 IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt )
THEN
9632 WRITE( nout, fmt = 9999 )
9633 $ cmatnm, i+k, ja+h,
9634 $ dble( a( ii+k+(jj+h-1)*lda ) ),
9635 $ dimag( a( ii+k+(jj+h-1)*lda ) )
9639 IF( myrow.EQ.icurrow .AND. mycol.EQ.icurcol )
THEN
9640 CALL zgesd2d( ictxt, ib, 1, a( ii+(jj+h-1)*lda ),
9641 $ lda, irprnt, icprnt )
9642 ELSE IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt )
THEN
9643 CALL zgerv2d( ictxt, ib, 1, work, ldw, icurrow,
9646 WRITE( nout, fmt = 9999 )
9647 $ cmatnm, i+k-1, ja+h, dble( work( k ) ),
9648 $ dimag( work( k ) )
9652 IF( myrow.EQ.icurrow )
9654 IF( .NOT.aisrowrep )
9655 $ icurrow = mod( icurrow+1, nprow )
9656 CALL blacs_barrier( ictxt,
'All' )
9663 IF( mycol.EQ.icurcol )
9665 IF( .NOT.aiscolrep )
9666 $ icurcol = mod( icurcol+1, npcol )
9667 CALL blacs_barrier( ictxt,
'All' )
9671 DO 130 j = jn+1, ja+n-1, desca( nb_ )
9672 jb =
min( desca( nb_ ), ja+n-j )
9674 ib = desca( imb_ )-ia+1
9676 $ ib = ( (-ib) / desca( mb_ ) + 1 ) * desca( mb_ ) + ib
9679 IF( icurrow.EQ.irprnt .AND. icurcol.EQ.icprnt )
THEN
9680 IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt )
THEN
9682 WRITE( nout, fmt = 9999 )
9683 $ cmatnm, ia+k, j+h,
9684 $ dble( a( ii+k+(jj+h-1)*lda ) ),
9685 $ dimag( a( ii+k+(jj+h-1)*lda ) )
9689 IF( myrow.EQ.icurrow .AND. mycol.EQ.icurcol )
THEN
9690 CALL zgesd2d( ictxt, ib, 1, a( ii+(jj+h-1)*lda ),
9691 $ lda, irprnt, icprnt )
9692 ELSE IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt )
THEN
9693 CALL zgerv2d( ictxt, ib, 1, work, ldw, icurrow,
9696 WRITE( nout, fmt = 9999 )
9697 $ cmatnm, ia+k-1, j+h, dble( work( k ) ),
9698 $ dimag( work( k ) )
9702 IF( myrow.EQ.icurrow )
9704 icurrow = mod( icurrow+1, nprow )
9705 CALL blacs_barrier( ictxt,
'All' )
9709 DO 110 i = in+1, ia+m-1, desca( mb_ )
9710 ib =
min( desca( mb_ ), ia+m-i )
9711 IF( icurrow.EQ.irprnt .AND. icurcol.EQ.icprnt )
THEN
9712 IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt )
THEN
9714 WRITE( nout, fmt = 9999 )
9716 $ dble( a( ii+k+(jj+h-1)*lda ) ),
9717 $ dimag( a( ii+k+(jj+h-1)*lda ) )
9721 IF( myrow.EQ.icurrow .AND. mycol.EQ.icurcol )
THEN
9722 CALL zgesd2d( ictxt, ib, 1, a( ii+(jj+h-1)*lda ),
9723 $ lda, irprnt, icprnt )
9724 ELSE IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt )
THEN
9725 CALL zgerv2d( ictxt, ib, 1, work, ldw, icurrow,
9728 WRITE( nout, fmt = 9999 )
9729 $ cmatnm, i+k-1, j+h, dble( work( k ) ),
9730 $ dimag( work( k ) )
9734 IF( myrow.EQ.icurrow )
9736 IF( .NOT.aisrowrep )
9737 $ icurrow = mod( icurrow+1, nprow )
9738 CALL blacs_barrier( ictxt,
'All' )
9745 IF( mycol.EQ.icurcol )
9747 IF( .NOT.aiscolrep )
9748 $ icurcol = mod( icurcol+1, npcol )
9749 CALL blacs_barrier( ictxt,
'All' )
9753 9999
FORMAT( 1x, a,
'(', i6,
',', i6,
')=', d30.18,
'+i*(',
9769 INTEGER ICTXT, IPOST, IPRE, LDA, M, N
9835 IF( IPRE.GT.0 ) THEN
9840 WRITE( *, fmt =
'(A)' )
9841 $
'WARNING no pre-guardzone in PB_ZFILLPAD'
9846 IF( ipost.GT.0 )
THEN
9848 DO 20 i = j, j+ipost-1
9852 WRITE( *, fmt =
'(A)' )
9853 $
'WARNING no post-guardzone in PB_ZFILLPAD'
9861 DO 30 i = k, k + ( lda - m ) - 1
9882 INTEGER ICTXT, IPOST, IPRE, LDA, M, N
9963 INTEGER I, IAM, IDUMM, INFO, J, K, MYCOL, MYROW, NPCOL,
9967 EXTERNAL BLACS_GRIDINFO, IGAMX2D, PB_TOPGET
9970 INTRINSIC DBLE, DIMAG
9976 CALL BLACS_GRIDINFO( ICTXT, NPROW, NPCOL, MYROW, MYCOL )
9977 IAM = myrow*npcol + mycol
9982 IF( ipre.GT.0 )
THEN
9984 IF( a( i ).NE.chkval )
THEN
9985 WRITE( *, fmt = 9998 ) myrow, mycol, mess,
' pre', i,
9986 $ dble( a( i ) ), dimag( a( i ) )
9991 WRITE( *, fmt = * )
'WARNING no pre-guardzone in PB_ZCHEKPAD'
9996 IF( ipost.GT.0 )
THEN
9998 DO 20 i = j, j+ipost-1
9999 IF( a( i ).NE.chkval )
THEN
10000 WRITE( *, fmt = 9998 ) myrow, mycol, mess,
'post',
10001 $ i-j+1, dble( a( i ) ),
10007 WRITE( *, fmt = * )
10008 $
'WARNING no post-guardzone buffer in PB_ZCHEKPAD'
10013 IF( lda.GT.m )
THEN
10016 DO 30 i = k, k + (lda-m) - 1
10017 IF( a( i ).NE.chkval )
THEN
10018 WRITE( *, fmt = 9997 ) myrow, mycol, mess,
10019 $ i-ipre-lda*(j-1), j, dble( a( i ) ),
10028 CALL pb_topget( ictxt,
'Combine',
'All', top )
10029 CALL igamx2d( ictxt,
'All', top, 1, 1, info, 1, idumm, idumm, -1,
10031 IF( iam.EQ.0 .AND. info.GE.0 )
THEN
10032 WRITE( *, fmt = 9999 ) info / npcol, mod( info, npcol ), mess
10035 9999
FORMAT(
'{', i5,
',', i5,
'}: Memory overwrite in ', a )
10036 9998
FORMAT(
'{', i5,
',', i5,
'}: ', a,
' memory overwrite in ',
10037 $ a4,
'-guardzone: loc(', i3,
') = ', g20.7,
'+ i*',
10039 9997
FORMAT(
'{', i5,
',', i5,
'}: ', a,
' memory overwrite in ',
10040 $
'lda-m gap: loc(', i3,
',', i3,
') = ', g20.7,
10057 INTEGER IOFFD, LDA, M, N
10058 COMPLEX*16 ALPHA, BETA
10061 COMPLEX*16 A( LDA, * )
10158 INTEGER I, J, JTMP, MN
10171 IF( M.LE.0 .OR. N.LE.0 )
10176 IF( LSAME( UPLO,
'L' ) ) THEN
10181 mn = max( 0, -ioffd )
10182 DO 20 j = 1, min( mn, n )
10187 DO 40 j = mn + 1, min( m - ioffd, n )
10189 a( jtmp, j ) = beta
10190 DO 30 i = jtmp + 1, m
10195 ELSE IF( lsame( uplo,
'U' ) )
THEN
10200 mn = min( m - ioffd, n )
10201 DO 60 j = max( 0, -ioffd ) + 1, mn
10203 DO 50 i = 1, jtmp - 1
10206 a( jtmp, j ) = beta
10208 DO 80 j = max( 0, mn ) + 1, n
10214 ELSE IF( lsame( uplo,
'D' ) )
THEN
10218 DO 90 j = max( 0, -ioffd ) + 1, min( m - ioffd, n )
10219 a( j + ioffd, j ) = beta
10232 IF( alpha.NE.beta .AND. ioffd.LT.m .AND. ioffd.GT.-n )
THEN
10233 DO 120 j = max( 0, -ioffd ) + 1, min( m - ioffd, n )
10234 a( j + ioffd, j ) = beta
10254 INTEGER IOFFD, LDA, M, N
10258 COMPLEX*16 A( LDA, * )
10348 INTEGER I, J, JTMP, MN
10361 IF( M.LE.0 .OR. N.LE.0 )
10366 IF( LSAME( UPLO,
'L' ) ) THEN
10370 MN = max( 0, -ioffd )
10371 DO 20 j = 1, min( mn, n )
10373 a( i, j ) = alpha * a( i, j )
10376 DO 40 j = mn + 1, min( m - ioffd, n )
10377 DO 30 i = j + ioffd, m
10378 a( i, j ) = alpha * a( i, j )
10382 ELSE IF( lsame( uplo,
'U' ) )
THEN
10386 mn = min( m - ioffd, n )
10387 DO 60 j = max( 0, -ioffd ) + 1, mn
10388 DO 50 i = 1, j + ioffd
10389 a( i, j ) = alpha * a( i, j )
10392 DO 80 j = max( 0, mn ) + 1, n
10394 a( i, j ) = alpha * a( i, j )
10398 ELSE IF( lsame( uplo,
'D' ) )
THEN
10402 DO 90 j = max( 0, -ioffd ) + 1, min( m - ioffd, n )
10404 a( jtmp, j ) = alpha * a( jtmp, j )
10413 a( i, j ) = alpha * a( i, j )
10425 $ IMBLOC, MB, LMBLOC, NBLKS, INBLOC, NB,
10426 $ LNBLOC, JMP, IMULADD )
10434 CHARACTER*1 UPLO, AFORM
10435 INTEGER IMBLOC, INBLOC, LCMT00, LDA, LMBLOC, LNBLOC,
10436 $ mb, mblks, nb, nblks
10439 INTEGER IMULADD( 4, * ), IRAN( * ), JMP( * )
10440 COMPLEX*16 A( LDA, * )
10543 INTEGER JMP_1, JMP_COL, JMP_IMBV, JMP_INBV, JMP_LEN,
10544 $ JMP_MB, JMP_NB, JMP_NPIMBLOC, JMP_NPMB,
10545 $ JMP_NQINBLOC, JMP_NQNB, JMP_ROW
10546 PARAMETER ( JMP_1 = 1, jmp_row = 2, jmp_col = 3,
10547 $ jmp_mb = 4, jmp_imbv = 5, jmp_npmb = 6,
10548 $ jmp_npimbloc = 7, jmp_nb = 8, jmp_inbv = 9,
10549 $ jmp_nqnb = 10, jmp_nqinbloc = 11,
10551 DOUBLE PRECISION ZERO
10552 PARAMETER ( ZERO = 0.0d+0 )
10555 INTEGER I, IB, IBLK, II, IK, ITMP, JB, JBLK, JJ, JK,
10556 $ JTMP, LCMTC, LCMTR, LOW, MNB, UPP
10560 INTEGER IB0( 2 ), IB1( 2 ), IB2( 2 ), IB3( 2 )
10567 DOUBLE PRECISION PB_DRAND
10568 EXTERNAL lsame, pb_drand
10571 INTRINSIC dble, dcmplx,
max,
min
10576 ib1( i ) = iran( i )
10577 ib2( i ) = iran( i )
10578 ib3( i ) = iran( i )
10581 IF( lsame( aform,
'N' ) )
THEN
10587 DO 50 jblk = 1, nblks
10589 IF( jblk.EQ.1 )
THEN
10591 ELSE IF( jblk.EQ.nblks )
THEN
10597 DO 40 jk = jj, jj + jb - 1
10601 DO 30 iblk = 1, mblks
10603 IF( iblk.EQ.1 )
THEN
10605 ELSE IF( iblk.EQ.mblks )
THEN
10613 DO 20 ik = ii, ii + ib - 1
10614 a( ik, jk ) = dcmplx( pb_drand( 0 ),
10620 IF( iblk.EQ.1 )
THEN
10624 CALL pb_jumpit( imuladd( 1, jmp_npimbloc ), ib1,
10631 CALL pb_jumpit( imuladd( 1, jmp_npmb ), ib1, ib0 )
10635 ib1( 1 ) = ib0( 1 )
10636 ib1( 2 ) = ib0( 2 )
10642 CALL pb_jumpit( imuladd( 1, jmp_col ), ib2, ib0 )
10644 ib1( 1 ) = ib0( 1 )
10645 ib1( 2 ) = ib0( 2 )
10646 ib2( 1 ) = ib0( 1 )
10647 ib2( 2 ) = ib0( 2 )
10653 IF( jblk.EQ.1 )
THEN
10657 CALL pb_jumpit( imuladd( 1, jmp_nqinbloc ), ib3, ib0 )
10663 CALL pb_jumpit( imuladd( 1, jmp_nqnb ), ib3, ib0 )
10667 ib1( 1 ) = ib0( 1 )
10668 ib1( 2 ) = ib0( 2 )
10669 ib2( 1 ) = ib0( 1 )
10670 ib2( 2 ) = ib0( 2 )
10671 ib3( 1 ) = ib0( 1 )
10672 ib3( 2 ) = ib0( 2 )
10676 ELSE IF( lsame( aform,
'T' ) )
THEN
10683 DO 90 iblk = 1, mblks
10685 IF( iblk.EQ.1 )
THEN
10687 ELSE IF( iblk.EQ.mblks )
THEN
10693 DO 80 ik = ii, ii + ib - 1
10697 DO 70 jblk = 1, nblks
10699 IF( jblk.EQ.1 )
THEN
10701 ELSE IF( jblk.EQ.nblks )
THEN
10709 DO 60 jk = jj, jj + jb - 1
10710 a( ik, jk ) = dcmplx( pb_drand( 0 ),
10716 IF( jblk.EQ.1 )
THEN
10720 CALL pb_jumpit( imuladd( 1, jmp_nqinbloc ), ib1,
10727 CALL pb_jumpit( imuladd( 1, jmp_nqnb ), ib1, ib0 )
10731 ib1( 1 ) = ib0( 1 )
10732 ib1( 2 ) = ib0( 2 )
10738 CALL pb_jumpit( imuladd( 1, jmp_row ), ib2, ib0 )
10740 ib1( 1 ) = ib0( 1 )
10741 ib1( 2 ) = ib0( 2 )
10742 ib2( 1 ) = ib0( 1 )
10743 ib2( 2 ) = ib0( 2 )
10749 IF( iblk.EQ.1 )
THEN
10753 CALL pb_jumpit( imuladd( 1, jmp_npimbloc ), ib3, ib0 )
10759 CALL pb_jumpit( imuladd( 1, jmp_npmb ), ib3, ib0 )
10763 ib1( 1 ) = ib0( 1 )
10764 ib1( 2 ) = ib0( 2 )
10765 ib2( 1 ) = ib0( 1 )
10766 ib2( 2 ) = ib0( 2 )
10767 ib3( 1 ) = ib0( 1 )
10768 ib3( 2 ) = ib0( 2 )
10772 ELSE IF( lsame( aform,
'S' ) )
THEN
10776 IF( lsame( uplo,
'L' ) )
THEN
10783 DO 170 jblk = 1, nblks
10785 IF( jblk.EQ.1 )
THEN
10788 ELSE IF( jblk.EQ.nblks )
THEN
10796 DO 160 jk = jj, jj + jb - 1
10801 DO 150 iblk = 1, mblks
10803 IF( iblk.EQ.1 )
THEN
10806 ELSE IF( iblk.EQ.mblks )
THEN
10816 IF( lcmtr.GT.upp )
THEN
10818 DO 100 ik = ii, ii + ib - 1
10819 dummy = dcmplx( pb_drand( 0 ),
10823 ELSE IF( lcmtr.GE.low )
THEN
10826 mnb =
max( 0, -lcmtr )
10828 IF( jtmp.LE.
min( mnb, jb ) )
THEN
10830 DO 110 ik = ii, ii + ib - 1
10831 a( ik, jk ) = dcmplx( pb_drand( 0 ),
10835 ELSE IF( ( jtmp.GE.( mnb + 1 ) ) .AND.
10836 $ ( jtmp.LE.
min( ib-lcmtr, jb ) ) )
THEN
10838 itmp = ii + jtmp + lcmtr - 1
10840 DO 120 ik = ii, itmp - 1
10841 dummy = dcmplx( pb_drand( 0 ),
10845 DO 130 ik = itmp, ii + ib - 1
10846 a( ik, jk ) = dcmplx( pb_drand( 0 ),
10854 DO 140 ik = ii, ii + ib - 1
10855 a( ik, jk ) = dcmplx( pb_drand( 0 ),
10863 IF( iblk.EQ.1 )
THEN
10867 lcmtr = lcmtr - jmp( jmp_npimbloc )
10868 CALL pb_jumpit( imuladd( 1, jmp_npimbloc ), ib1,
10875 lcmtr = lcmtr - jmp( jmp_npmb )
10876 CALL pb_jumpit( imuladd( 1, jmp_npmb ), ib1,
10881 ib1( 1 ) = ib0( 1 )
10882 ib1( 2 ) = ib0( 2 )
10888 CALL pb_jumpit( imuladd( 1, jmp_col ), ib2, ib0 )
10890 ib1( 1 ) = ib0( 1 )
10891 ib1( 2 ) = ib0( 2 )
10892 ib2( 1 ) = ib0( 1 )
10893 ib2( 2 ) = ib0( 2 )
10899 IF( jblk.EQ.1 )
THEN
10903 lcmtc = lcmtc + jmp( jmp_nqinbloc )
10904 CALL pb_jumpit( imuladd( 1, jmp_nqinbloc ), ib3, ib0 )
10910 lcmtc = lcmtc + jmp( jmp_nqnb )
10911 CALL pb_jumpit( imuladd( 1, jmp_nqnb ), ib3, ib0 )
10915 ib1( 1 ) = ib0( 1 )
10916 ib1( 2 ) = ib0( 2 )
10917 ib2( 1 ) = ib0( 1 )
10918 ib2( 2 ) = ib0( 2 )
10919 ib3( 1 ) = ib0( 1 )
10920 ib3( 2 ) = ib0( 2 )
10931 DO 250 iblk = 1, mblks
10933 IF( iblk.EQ.1 )
THEN
10936 ELSE IF( iblk.EQ.mblks )
THEN
10944 DO 240 ik = ii, ii + ib - 1
10949 DO 230 jblk = 1, nblks
10951 IF( jblk.EQ.1 )
THEN
10954 ELSE IF( jblk.EQ.nblks )
THEN
10964 IF( lcmtc.LT.low )
THEN
10966 DO 180 jk = jj, jj + jb - 1
10967 dummy = dcmplx( pb_drand( 0 ),
10971 ELSE IF( lcmtc.LE.upp )
THEN
10974 mnb =
max( 0, lcmtc )
10976 IF( itmp.LE.
min( mnb, ib ) )
THEN
10978 DO 190 jk = jj, jj + jb - 1
10979 a( ik, jk ) = dcmplx( pb_drand( 0 ),
10983 ELSE IF( ( itmp.GE.( mnb + 1 ) ) .AND.
10984 $ ( itmp.LE.
min( jb+lcmtc, ib ) ) )
THEN
10986 jtmp = jj + itmp - lcmtc - 1
10988 DO 200 jk = jj, jtmp - 1
10989 dummy = dcmplx( pb_drand( 0 ),
10993 DO 210 jk = jtmp, jj + jb - 1
10994 a( ik, jk ) = dcmplx( pb_drand( 0 ),
11002 DO 220 jk = jj, jj + jb - 1
11003 a( ik, jk ) = dcmplx( pb_drand( 0 ),
11011 IF( jblk.EQ.1 )
THEN
11015 lcmtc = lcmtc + jmp( jmp_nqinbloc )
11016 CALL pb_jumpit( imuladd( 1, jmp_nqinbloc ), ib1,
11023 lcmtc = lcmtc + jmp( jmp_nqnb )
11024 CALL pb_jumpit( imuladd( 1, jmp_nqnb ), ib1,
11029 ib1( 1 ) = ib0( 1 )
11030 ib1( 2 ) = ib0( 2 )
11036 CALL pb_jumpit( imuladd( 1, jmp_row ), ib2, ib0 )
11038 ib1( 1 ) = ib0( 1 )
11039 ib1( 2 ) = ib0( 2 )
11040 ib2( 1 ) = ib0( 1 )
11041 ib2( 2 ) = ib0( 2 )
11047 IF( iblk.EQ.1 )
THEN
11051 lcmtr = lcmtr - jmp( jmp_npimbloc )
11052 CALL pb_jumpit( imuladd( 1, jmp_npimbloc ), ib3, ib0 )
11058 lcmtr = lcmtr - jmp( jmp_npmb )
11059 CALL pb_jumpit( imuladd( 1, jmp_npmb ), ib3, ib0 )
11063 ib1( 1 ) = ib0( 1 )
11064 ib1( 2 ) = ib0( 2 )
11065 ib2( 1 ) = ib0( 1 )
11066 ib2( 2 ) = ib0( 2 )
11067 ib3( 1 ) = ib0( 1 )
11068 ib3( 2 ) = ib0( 2 )
11074 ELSE IF( lsame( aform,
'C' ) )
THEN
11081 DO 290 iblk = 1, mblks
11083 IF( iblk.EQ.1 )
THEN
11085 ELSE IF( iblk.EQ.mblks )
THEN
11091 DO 280 ik = ii, ii + ib - 1
11095 DO 270 jblk = 1, nblks
11097 IF( jblk.EQ.1 )
THEN
11099 ELSE IF( jblk.EQ.nblks )
THEN
11107 DO 260 jk = jj, jj + jb - 1
11108 a( ik, jk ) = dcmplx( pb_drand( 0 ),
11114 IF( jblk.EQ.1 )
THEN
11118 CALL pb_jumpit( imuladd( 1, jmp_nqinbloc ), ib1,
11125 CALL pb_jumpit( imuladd( 1, jmp_nqnb ), ib1,
11130 ib1( 1 ) = ib0( 1 )
11131 ib1( 2 ) = ib0( 2 )
11137 CALL pb_jumpit( imuladd( 1, jmp_row ), ib2, ib0 )
11139 ib1( 1 ) = ib0( 1 )
11140 ib1( 2 ) = ib0( 2 )
11141 ib2( 1 ) = ib0( 1 )
11142 ib2( 2 ) = ib0( 2 )
11148 IF( iblk.EQ.1 )
THEN
11152 CALL pb_jumpit( imuladd( 1, jmp_npimbloc ), ib3, ib0 )
11158 CALL pb_jumpit( imuladd( 1, jmp_npmb ), ib3, ib0 )
11162 ib1( 1 ) = ib0( 1 )
11163 ib1( 2 ) = ib0( 2 )
11164 ib2( 1 ) = ib0( 1 )
11165 ib2( 2 ) = ib0( 2 )
11166 ib3( 1 ) = ib0( 1 )
11167 ib3( 2 ) = ib0( 2 )
11171 ELSE IF( lsame( aform,
'H' ) )
THEN
11175 IF( lsame( uplo,
'L' ) )
THEN
11182 DO 370 jblk = 1, nblks
11184 IF( jblk.EQ.1 )
THEN
11187 ELSE IF( jblk.EQ.nblks )
THEN
11195 DO 360 jk = jj, jj + jb - 1
11200 DO 350 iblk = 1, mblks
11202 IF( iblk.EQ.1 )
THEN
11205 ELSE IF( iblk.EQ.mblks )
THEN
11215 IF( lcmtr.GT.upp )
THEN
11217 DO 300 ik = ii, ii + ib - 1
11218 dummy = dcmplx( pb_drand( 0 ),
11222 ELSE IF( lcmtr.GE.low )
THEN
11225 mnb =
max( 0, -lcmtr )
11227 IF( jtmp.LE.
min( mnb, jb ) )
THEN
11229 DO 310 ik = ii, ii + ib - 1
11230 a( ik, jk ) = dcmplx( pb_drand( 0 ),
11234 ELSE IF( ( jtmp.GE.( mnb + 1 ) ) .AND.
11235 $ ( jtmp.LE.
min( ib-lcmtr, jb ) ) )
THEN
11237 itmp = ii + jtmp + lcmtr - 1
11239 DO 320 ik = ii, itmp - 1
11240 dummy = dcmplx( pb_drand( 0 ),
11244 IF( itmp.LE.( ii + ib - 1 ) )
THEN
11245 dummy = dcmplx( pb_drand( 0 ),
11247 a( itmp, jk ) = dcmplx( dble( dummy ),
11251 DO 330 ik = itmp + 1, ii + ib - 1
11252 a( ik, jk ) = dcmplx( pb_drand( 0 ),
11260 DO 340 ik = ii, ii + ib - 1
11261 a( ik, jk ) = dcmplx( pb_drand( 0 ),
11269 IF( iblk.EQ.1 )
THEN
11273 lcmtr = lcmtr - jmp( jmp_npimbloc )
11274 CALL pb_jumpit( imuladd( 1, jmp_npimbloc ), ib1,
11281 lcmtr = lcmtr - jmp( jmp_npmb )
11282 CALL pb_jumpit( imuladd( 1, jmp_npmb ), ib1,
11287 ib1( 1 ) = ib0( 1 )
11288 ib1( 2 ) = ib0( 2 )
11294 CALL pb_jumpit( imuladd( 1, jmp_col ), ib2, ib0 )
11296 ib1( 1 ) = ib0( 1 )
11297 ib1( 2 ) = ib0( 2 )
11298 ib2( 1 ) = ib0( 1 )
11299 ib2( 2 ) = ib0( 2 )
11305 IF( jblk.EQ.1 )
THEN
11309 lcmtc = lcmtc + jmp( jmp_nqinbloc )
11310 CALL pb_jumpit( imuladd( 1, jmp_nqinbloc ), ib3, ib0 )
11316 lcmtc = lcmtc + jmp( jmp_nqnb )
11317 CALL pb_jumpit( imuladd( 1, jmp_nqnb ), ib3, ib0 )
11321 ib1( 1 ) = ib0( 1 )
11322 ib1( 2 ) = ib0( 2 )
11323 ib2( 1 ) = ib0( 1 )
11324 ib2( 2 ) = ib0( 2 )
11325 ib3( 1 ) = ib0( 1 )
11326 ib3( 2 ) = ib0( 2 )
11337 DO 450 iblk = 1, mblks
11339 IF( iblk.EQ.1 )
THEN
11342 ELSE IF( iblk.EQ.mblks )
THEN
11350 DO 440 ik = ii, ii + ib - 1
11355 DO 430 jblk = 1, nblks
11357 IF( jblk.EQ.1 )
THEN
11360 ELSE IF( jblk.EQ.nblks )
THEN
11370 IF( lcmtc.LT.low )
THEN
11372 DO 380 jk = jj, jj + jb - 1
11373 dummy = dcmplx( pb_drand( 0 ),
11377 ELSE IF( lcmtc.LE.upp )
THEN
11380 mnb =
max( 0, lcmtc )
11382 IF( itmp.LE.
min( mnb, ib ) )
THEN
11384 DO 390 jk = jj, jj + jb - 1
11385 a( ik, jk ) = dcmplx( pb_drand( 0 ),
11389 ELSE IF( ( itmp.GE.( mnb + 1 ) ) .AND.
11390 $ ( itmp.LE.
min( jb+lcmtc, ib ) ) )
THEN
11392 jtmp = jj + itmp - lcmtc - 1
11394 DO 400 jk = jj, jtmp - 1
11395 dummy = dcmplx( pb_drand( 0 ),
11399 IF( jtmp.LE.( jj + jb - 1 ) )
THEN
11400 dummy = dcmplx( pb_drand( 0 ),
11402 a( ik, jtmp ) = dcmplx( dble( dummy ),
11406 DO 410 jk = jtmp + 1, jj + jb - 1
11407 a( ik, jk ) = dcmplx( pb_drand( 0 ),
11415 DO 420 jk = jj, jj + jb - 1
11416 a( ik, jk ) = dcmplx( pb_drand( 0 ),
11424 IF( jblk.EQ.1 )
THEN
11428 lcmtc = lcmtc + jmp( jmp_nqinbloc )
11429 CALL pb_jumpit( imuladd( 1, jmp_nqinbloc ), ib1,
11436 lcmtc = lcmtc + jmp( jmp_nqnb )
11437 CALL pb_jumpit( imuladd( 1, jmp_nqnb ), ib1,
11442 ib1( 1 ) = ib0( 1 )
11443 ib1( 2 ) = ib0( 2 )
11449 CALL pb_jumpit( imuladd( 1, jmp_row ), ib2, ib0 )
11451 ib1( 1 ) = ib0( 1 )
11452 ib1( 2 ) = ib0( 2 )
11453 ib2( 1 ) = ib0( 1 )
11454 ib2( 2 ) = ib0( 2 )
11460 IF( iblk.EQ.1 )
THEN
11464 lcmtr = lcmtr - jmp( jmp_npimbloc )
11465 CALL pb_jumpit( imuladd( 1, jmp_npimbloc ), ib3, ib0 )
11471 lcmtr = lcmtr - jmp( jmp_npmb )
11472 CALL pb_jumpit( imuladd( 1, jmp_npmb ), ib3, ib0 )
11476 ib1( 1 ) = ib0( 1 )
11477 ib1( 2 ) = ib0( 2 )
11478 ib2( 1 ) = ib0( 1 )
11479 ib2( 2 ) = ib0( 2 )
11480 ib3( 1 ) = ib0( 1 )
11481 ib3( 2 ) = ib0( 2 )
11540 DOUBLE PRECISION one, two
11541 PARAMETER ( one = 1.0d+0, two = 2.0d+0 )
11601 DOUBLE PRECISION divfac, pow16
11602 PARAMETER ( divfac = 2.147483648d+9,
11603 $ pow16 = 6.5536d+4 )
11615 INTEGER iacs( 4 ), irand( 2 )
11616 common /rancom/ irand, iacs
11623 pb_dran = ( dble( irand( 1 ) ) + pow16 * dble( irand( 2 ) ) ) /
11626 CALL pb_lmul( irand, iacs, j )
11627 CALL pb_ladd( j, iacs( 3 ), irand )
subroutine pb_ainfog2l(m, n, i, j, desc, nprow, npcol, myrow, mycol, imb1, inb1, mp, nq, ii, jj, prow, pcol, rprow, rpcol)
subroutine pb_descset2(desc, m, n, imb, inb, mb, nb, rsrc, csrc, ctxt, lld)
subroutine pb_ladd(j, k, i)
subroutine pb_binfo(offd, m, n, imb1, inb1, mb, nb, mrrow, mrcol, lcmt00, mblks, nblks, imbloc, inbloc, lmbloc, lnbloc, ilow, low, iupp, upp)
subroutine pb_setran(iran, iac)
subroutine pb_infog2l(i, j, desc, nprow, npcol, myrow, mycol, ii, jj, prow, pcol)
subroutine pb_locinfo(i, inb, nb, myroc, srcproc, nprocs, ilocblk, ilocoff, mydist)
subroutine pchkpbe(ictxt, nout, sname, infot)
subroutine pb_chkmat(ictxt, m, mpos0, n, npos0, ia, ja, desca, dpos0, info)
subroutine pb_lmul(k, j, i)
subroutine pb_jump(k, muladd, irann, iranm, ima)
subroutine pb_setlocran(seed, ilocblk, jlocblk, ilocoff, jlocoff, myrdist, mycdist, nprow, npcol, jmp, imuladd, iran)
subroutine pb_initmuladd(muladd0, jmp, imuladd)
subroutine pb_desctrans(descin, descout)
subroutine pb_initjmp(colmaj, nvir, imbvir, inbvir, imbloc, inbloc, mb, nb, rsrc, csrc, nprow, npcol, stride, jmp)
subroutine pb_jumpit(muladd, irann, iranm)
double precision function pb_dran(idumm)
double precision function pb_drand(idumm)
double precision function pdlamch(ictxt, cmach)
subroutine pxerbla(ictxt, srname, info)
subroutine pzmprnt(ictxt, nout, m, n, a, lda, irprnt, icprnt, cmatnm)
subroutine pzchkvin(errmax, n, x, px, ix, jx, descx, incx, info)
subroutine pzcallsub(subptr, scode)
subroutine pzchkmout(m, n, a, pa, ia, ja, desca, info)
subroutine pzipset(toggle, n, a, ia, ja, desca)
subroutine pzlaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
subroutine pzvecee(ictxt, nout, subptr, scode, sname)
subroutine pb_zlaset(uplo, m, n, ioffd, alpha, beta, a, lda)
subroutine pzerrset(err, errmax, xtrue, x)
subroutine pzmmch(ictxt, transa, transb, m, n, k, alpha, a, ia, ja, desca, b, ib, jb, descb, beta, c, pc, ic, jc, descc, ct, g, err, info)
subroutine pb_zchekpad(ictxt, mess, m, n, a, lda, ipre, ipost, chkval)
subroutine pzmmch1(ictxt, uplo, trans, n, k, alpha, a, ia, ja, desca, beta, c, pc, ic, jc, descc, ct, g, err, info)
subroutine pzsetpblas(ictxt)
subroutine pzlascal(type, m, n, alpha, a, ia, ja, desca)
subroutine pb_zlagen(uplo, aform, a, lda, lcmt00, iran, mblks, imbloc, mb, lmbloc, nblks, inbloc, nb, lnbloc, jmp, imuladd)
subroutine pzmmch2(ictxt, uplo, trans, n, k, alpha, a, ia, ja, desca, b, ib, jb, descb, beta, c, pc, ic, jc, descc, ct, g, err, info)
subroutine pb_zfillpad(ictxt, m, n, a, lda, ipre, ipost, chkval)
subroutine pzchkmat(ictxt, nout, subptr, scode, sname, argnam, argpos)
subroutine pzmatee(ictxt, nout, subptr, scode, sname)
subroutine pzchkopt(ictxt, nout, subptr, scode, sname, argnam, argpos)
subroutine pzmmch3(uplo, trans, m, n, alpha, a, ia, ja, desca, beta, c, pc, ic, jc, descc, err, info)
subroutine pzerraxpby(errbnd, alpha, x, beta, y, prec)
subroutine pzchkmin(errmax, m, n, a, pa, ia, ja, desca, info)
subroutine pzmvch(ictxt, trans, m, n, alpha, a, ia, ja, desca, x, ix, jx, descx, incx, beta, y, py, iy, jy, descy, incy, g, err, info)
subroutine pzladom(inplace, n, alpha, a, ia, ja, desca)
subroutine pzchkvout(n, x, px, ix, jx, descx, incx, info)
subroutine pb_pzlaprn2(m, n, a, ia, ja, desca, irprnt, icprnt, cmatnm, nout, prow, pcol, work)
subroutine pb_pzlaprnt(m, n, a, ia, ja, desca, irprnt, icprnt, cmatnm, nout, work)
subroutine pb_zlascal(uplo, m, n, ioffd, alpha, a, lda)
subroutine pzvmch(ictxt, trans, uplo, m, n, alpha, x, ix, jx, descx, incx, y, iy, jy, descy, incy, a, pa, ia, ja, desca, g, err, info)
subroutine pzvprnt(ictxt, nout, n, x, incx, irprnt, icprnt, cvecnm)
subroutine pzlagen(inplace, aform, diag, offa, m, n, ia, ja, desca, iaseed, a, lda)
subroutine pzchkdim(ictxt, nout, subptr, scode, sname, argnam, argpos)
subroutine pzvmch2(ictxt, uplo, m, n, alpha, x, ix, jx, descx, incx, y, iy, jy, descy, incy, a, pa, ia, ja, desca, g, err, info)
subroutine pzoptee(ictxt, nout, subptr, scode, sname)
subroutine pzdimee(ictxt, nout, subptr, scode, sname)