1 SUBROUTINE pcoptee( ICTXT, NOUT, SUBPTR, SCODE, SNAME )
9 INTEGER ICTXT, NOUT, SCODE
156 IF( scode.EQ.21 )
THEN
161 CALL pcchkopt( ictxt, nout, subptr, scode, sname,
'A', apos )
163 ELSE IF( scode.EQ.22 .OR. scode.EQ.25 .OR. scode.EQ.26 .OR.
169 CALL pcchkopt( ictxt, nout, subptr, scode, sname,
'U', apos )
171 ELSE IF( scode.EQ.23 )
THEN
176 CALL pcchkopt( ictxt, nout, subptr, scode, sname,
'U', apos )
181 CALL pcchkopt( ictxt, nout, subptr, scode, sname,
'A', apos )
186 CALL pcchkopt( ictxt, nout, subptr, scode, sname,
'D', apos )
190 ELSE IF( scode.EQ.31 )
THEN
195 CALL pcchkopt( ictxt, nout, subptr, scode, sname,
'A', apos )
200 CALL pcchkopt( ictxt, nout, subptr, scode, sname,
'B', apos )
202 ELSE IF( scode.EQ.32 )
THEN
207 CALL pcchkopt( ictxt, nout, subptr, scode, sname,
'S', apos )
212 CALL pcchkopt( 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 pcchkopt( ictxt, nout, subptr, scode, sname,
'U', apos )
225 CALL pcchkopt( ictxt, nout, subptr, scode, sname,
'A', apos )
227 ELSE IF( scode.EQ.38 )
THEN
232 CALL pcchkopt( ictxt, nout, subptr, scode, sname,
'S', apos )
237 CALL pcchkopt( ictxt, nout, subptr, scode, sname,
'U', apos )
242 CALL pcchkopt( ictxt, nout, subptr, scode, sname,
'A', apos )
247 CALL pcchkopt( ictxt, nout, subptr, scode, sname,
'D', apos )
250 ELSE IF( scode.EQ.39 )
THEN
255 CALL pcchkopt( ictxt, nout, subptr, scode, sname,
'A', apos )
264 SUBROUTINE pcchkopt( 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 pcdimee( 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 pcchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
619 ELSE IF( scode.EQ.21 )
THEN
624 CALL pcchkdim( ictxt, nout, subptr, scode, sname,
'M', apos )
629 CALL pcchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
631 ELSE IF( scode.EQ.22 .OR. scode.EQ.25 .OR. scode.EQ.26 .OR.
637 CALL pcchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
639 ELSE IF( scode.EQ.23 )
THEN
644 CALL pcchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
646 ELSE IF( scode.EQ.24 )
THEN
651 CALL pcchkdim( ictxt, nout, subptr, scode, sname,
'M', apos )
656 CALL pcchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
660 ELSE IF( scode.EQ.31 )
THEN
665 CALL pcchkdim( ictxt, nout, subptr, scode, sname,
'M', apos )
670 CALL pcchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
675 CALL pcchkdim( ictxt, nout, subptr, scode, sname,
'K', apos )
677 ELSE IF( scode.EQ.32 )
THEN
682 CALL pcchkdim( ictxt, nout, subptr, scode, sname,
'M', apos )
687 CALL pcchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
689 ELSE IF( scode.EQ.33 .OR. scode.EQ.34 .OR. scode.EQ.35 .OR.
695 CALL pcchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
700 CALL pcchkdim( ictxt, nout, subptr, scode, sname,
'K', apos )
702 ELSE IF( scode.EQ.37 )
THEN
707 CALL pcchkdim( ictxt, nout, subptr, scode, sname,
'M', apos )
712 CALL pcchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
714 ELSE IF( scode.EQ.38 )
THEN
719 CALL pcchkdim( ictxt, nout, subptr, scode, sname,
'M', apos )
724 CALL pcchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
726 ELSE IF( scode.EQ.39 )
THEN
731 CALL pcchkdim( ictxt, nout, subptr, scode, sname,
'M', apos )
736 CALL pcchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
738 ELSE IF( scode.EQ.40 )
THEN
743 CALL pcchkdim( ictxt, nout, subptr, scode, sname,
'M', apos )
748 CALL pcchkdim( ictxt, nout, subptr, scode, sname,
'N', apos )
757 SUBROUTINE pcchkdim( 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 pcvecee( ICTXT, NOUT, SUBPTR, SCODE, SNAME )
943 INTEGER ICTXT, NOUT, SCODE
1092 IF( scode.EQ.11 )
THEN
1097 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'X', apos )
1102 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'Y', apos )
1104 ELSE IF( scode.EQ.12 .OR. scode.EQ.15 )
THEN
1109 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'X', apos )
1111 ELSE IF( scode.EQ.13 )
THEN
1116 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'X', apos )
1121 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'Y', apos )
1123 ELSE IF( scode.EQ.14 )
THEN
1128 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'X', apos )
1132 ELSE IF( scode.EQ.21 )
THEN
1137 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'X', apos )
1142 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'Y', apos )
1144 ELSE IF( scode.EQ.22 )
THEN
1149 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'X', apos )
1154 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'Y', apos )
1156 ELSE IF( scode.EQ.23 )
THEN
1161 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'X', apos )
1163 ELSE IF( scode.EQ.24 .OR. scode.EQ.27 )
THEN
1168 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'X', apos )
1173 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'Y', apos )
1175 ELSE IF( scode.EQ.26 .OR. scode.EQ.27 )
THEN
1180 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'X', apos )
1189 SUBROUTINE pcmatee( ICTXT, NOUT, SUBPTR, SCODE, SNAME )
1197 INTEGER ICTXT, NOUT, SCODE
1346 IF( scode.EQ.21 .OR. scode.EQ.23 )
THEN
1351 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1353 ELSE IF( scode.EQ.22 )
THEN
1358 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1360 ELSE IF( scode.EQ.24 .OR. scode.EQ.27 )
THEN
1365 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1367 ELSE IF( scode.EQ.25 .OR. scode.EQ.26 )
THEN
1372 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1376 ELSE IF( scode.EQ.31 )
THEN
1381 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1386 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'B', apos )
1391 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'C', apos )
1393 ELSE IF( scode.EQ.32 .OR. scode.EQ.35 .OR. scode.EQ.36 )
THEN
1398 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1403 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'B', apos )
1408 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'C', apos )
1410 ELSE IF( scode.EQ.33 .OR. scode.EQ.34 )
THEN
1415 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1420 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'C', apos )
1422 ELSE IF( scode.EQ.37 )
THEN
1427 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1432 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'C', apos )
1434 ELSE IF( scode.EQ.38 )
THEN
1439 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1444 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'B', apos )
1446 ELSE IF( scode.EQ.39 )
THEN
1451 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1456 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'C', apos )
1458 ELSE IF( scode.EQ.40 )
THEN
1463 CALL pcchkmat( ictxt, nout, subptr, scode, sname,
'A', apos )
1468 CALL pcchkmat( 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 )
1579 parameter( one = ( 1.0e+0, 0.0e+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
1591 INTEGER DESCA( DLEN_ ), DESCB( DLEN_ ), DESCC( DLEN_ ),
1592 $ descx( dlen_ ), descy( dlen_ )
1593 COMPLEX 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 pcchkmat( 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
2325 INTEGER DESCA( DLEN_ ), DESCB( DLEN_ ), DESCC( DLEN_ ),
2326 $ descx( dlen_ ), descy( dlen_ )
2327 COMPLEX 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 )
2459 SUBROUTINE pcerrset( ERR, ERRMAX, XTRUE, X )
2566 INTRINSIC abs, aimag,
max, real
2570 err = abs( psdiff( real( xtrue ), real( x ) ) )
2571 err =
max( err, abs( psdiff( aimag( xtrue ), aimag( x ) ) ) )
2573 errmax =
max( errmax, err )
2580 SUBROUTINE pcchkvin( ERRMAX, N, X, PX, IX, JX, DESCX, INCX,
2589 INTEGER INCX, INFO, IX, JX, N
2594 COMPLEX 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 )
2726 PARAMETER ( ZERO = 0.0e+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
2743 INTRINSIC abs, aimag,
max,
min, mod, real
2755 ictxt = descx( ctxt_ )
2756 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
2758 eps = pslamch( 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 pcerrset( 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 pcerrset( 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 pcerrset( 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 pcerrset( 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 pcerrset( err, errmax, x( i+kk+(jx-1)*ldx ),
2846 $ px( iix+kk+(jjx-1)*ldpx ) )
2853 icurrow = mod( icurrow+1, nprow )
2861 CALL sgamx2d( 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
2875 SUBROUTINE pcchkvout( N, X, PX, IX, JX, DESCX, INCX, INFO )
2883 INTEGER INCX, INFO, IX, JX, N
2887 COMPLEX 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 )
3015 PARAMETER ( ZERO = 0.0e+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 REAL EPS, ERR, ERRMAX
3026 EXTERNAL BLACS_GRIDINFO, PCERRSET, SGAMX2D
3031 EXTERNAL PSLAMCH, PB_NUMROC
3034 INTRINSIC abs, aimag,
max,
min, mod, real
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 = pslamch( 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 pcerrset( 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 pcerrset( 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 pcerrset( 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 pcerrset( 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 pcerrset( 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 pcerrset( 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 pcerrset( 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 pcerrset( 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 sgamx2d( 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 pcchkmin( ERRMAX, M, N, A, PA, IA, JA, DESCA, INFO )
3339 INTEGER IA, INFO, JA, M, N
3344 COMPLEX 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 )
3475 PARAMETER ( ZERO = 0.0e+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
3492 INTRINSIC abs, aimag,
max,
min, mod, real
3501 IF( ( m.EQ.0 ).OR.( n.EQ.0 ) )
3506 ictxt = desca( ctxt_ )
3507 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
3509 eps = pslamch( 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 pcerrset( 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 pcerrset( 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 pcerrset( 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 sgamx2d( 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
3632 SUBROUTINE pcchkmout( M, N, A, PA, IA, JA, DESCA, INFO )
3640 INTEGER IA, INFO, JA, M, N
3644 COMPLEX 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 )
3771 PARAMETER ( ZERO = 0.0e+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 REAL EPS, ERR, ERRMAX
3781 EXTERNAL blacs_gridinfo,
pcerrset, sgamx2d
3786 EXTERNAL PSLAMCH, 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 = pslamch( 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 pcerrset( 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 sgamx2d( 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 pcmprnt( ICTXT, NOUT, M, N, A, LDA, IRPRNT, ICPRNT,
3962 INTEGER ICPRNT, ICTXT, IRPRNT, LDA, M, N, NOUT
3965 CHARACTER*(*) CMATNM
4022 INTEGER I, J, MYCOL, MYROW, NPCOL, NPROW
4025 EXTERNAL BLACS_GRIDINFO
4028 INTRINSIC aimag, real
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 $ real( a( i, j ) ), aimag( a( i, j ) )
4057 9999
FORMAT( 1x, a,
'(', i6,
',', i6,
')=', e16.8,
'+i*(',
4065 SUBROUTINE pcvprnt( 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 aimag, real
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, real( x( i ) ),
4162 9999
FORMAT( 1x, a,
'(', i6,
')=', e16.8,
'+i*(', e16.8,
')' )
4169 SUBROUTINE pcmvch( 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,
4186 INTEGER DESCA( * ), DESCX( * ), DESCY( * )
4188 COMPLEX 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 )
4377 parameter( rzero = 0.0e+0, rone = 1.0e+0 )
4379 PARAMETER ( ZERO = ( 0.0e+0, 0.0e+0 ),
4380 $ one = ( 1.0e+0, 0.0e+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 REAL EPS, ERRI, GTMP
4389 COMPLEX C, TBETA, YTMP
4392 EXTERNAL blacs_gridinfo, igsum2d,
pb_infog2l, sgamx2d
4397 EXTERNAL lsame, pslamch
4400 INTRINSIC abs, aimag, conjg,
max,
min, mod, real, sqrt
4404 abs1( c ) = abs( real( c ) ) + abs( aimag( c ) )
4408 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
4410 eps = pslamch( 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 + conjg( 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 sgamx2d( ictxt,
'All',
' ', 1, 1, err, 1, i, j, -1, -1,
4603 SUBROUTINE pcvmch( 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,
4620 INTEGER DESCA( * ), DESCX( * ), DESCY( * )
4622 COMPLEX 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 )
4813 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+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 REAL EPS, ERRI, GTMP
4824 EXTERNAL blacs_gridinfo, igsum2d,
pb_infog2l, sgamx2d
4829 EXTERNAL LSAME, PSLAMCH
4832 INTRINSIC abs, aimag, conjg,
max,
min, mod, real, sqrt
4836 ABS1( C ) = abs( real( c ) ) + abs( aimag( c ) )
4840 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
4842 eps = pslamch( 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 ) * conjg( 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 sgamx2d( ictxt,
'All',
' ', 1, 1, err, 1, i, j, -1, -1,
4972 SUBROUTINE pcvmch2( 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,
4989 INTEGER DESCA( * ), DESCX( * ), DESCY( * )
4991 COMPLEX 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 )
5174 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+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 REAL EPS, ERRI, GTMP
5186 EXTERNAL blacs_gridinfo, igsum2d,
pb_infog2l, sgamx2d
5191 EXTERNAL LSAME, PSLAMCH
5194 INTRINSIC abs, aimag, conjg,
max,
min, mod, real, sqrt
5198 abs1( c ) = abs( real( c ) ) + abs( aimag( c ) )
5202 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
5204 eps = pslamch( 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 ) * conjg( y( ioffyj ) )
5244 atmp = atmp + y( ioffyi ) * conjg( alpha * x( ioffxj ) )
5245 gtmp = abs1( alpha * x( ioffxi ) ) * abs1( y( ioffyj ) )
5246 gtmp = gtmp + abs1( y( ioffyi ) ) *
5247 $ abs1( conjg( 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 sgamx2d( ictxt,
'All',
' ', 1, 1, err, 1, i, j, -1, -1,
5333 SUBROUTINE pcmmch( 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
5349 INTEGER DESCA( * ), DESCB( * ), DESCC( * )
5351 COMPLEX 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 )
5535 PARAMETER ( RZERO = 0.0e+0, rone = 1.0e+0 )
5537 PARAMETER ( ZERO = ( 0.0e+0, 0.0e+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
5548 EXTERNAL blacs_gridinfo, igsum2d,
pb_infog2l, sgamx2d
5553 EXTERNAL LSAME, PSLAMCH
5556 INTRINSIC abs, aimag, conjg,
max,
min, mod, real, sqrt
5560 ABS1( Z ) = abs( real( z ) ) + abs( aimag( z ) )
5564 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
5566 eps = pslamch( 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 ) + conjg( 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 $ conjg( 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 ) + conjg( a( ioffa ) ) *
5653 $ conjg( 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 ) + conjg( 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 $ conjg( 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 sgamx2d( ictxt,
'All',
' ', 1, 1, err, 1, i, j, -1, -1,
5786 SUBROUTINE pcmmch1( 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
5802 INTEGER DESCA( * ), DESCC( * )
5804 COMPLEX 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 )
5970 PARAMETER ( RZERO = 0.0e+0, rone = 1.0e+0 )
5972 PARAMETER ( ZERO = ( 0.0e+0, 0.0e+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
5983 EXTERNAL blacs_gridinfo, igsum2d,
pb_infog2l, sgamx2d
5988 EXTERNAL lsame, pslamch
5991 INTRINSIC abs, aimag, conjg,
max,
min, mod, real, sqrt
5995 abs1( z ) = abs( real( z ) ) + abs( aimag( z ) )
5999 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
6001 eps = pslamch( 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 $ conjg( 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 ) + conjg( a( ioffan ) ) * a( ioffak )
6067 g( i ) = g( i ) + abs1( conjg( a( ioffan ) ) ) *
6068 $ abs1( a( ioffak ) )
6073 ioffc = ic + ibeg - 1 + ( jc + j - 2 ) * ldc
6075 DO 100 i = ibeg, iend
6076 ct( i ) = alpha*ct( i ) + beta * c( ioffc )
6077 g( i ) = abs1( alpha )*g( i ) +
6078 $ abs1( beta )*abs1( c( ioffc ) )
6079 c( ioffc ) = ct( i )
6087 ldpc = descc( lld_ )
6088 ioffc = ic + ( jc + j - 2 ) * ldc
6089 CALL pb_infog2l( ic, jc+j-1, descc, nprow, npcol, myrow, mycol,
6090 $ iic, jjc, icrow, iccol )
6092 rowrep = ( icrow.EQ.-1 )
6093 colrep = ( iccol.EQ.-1 )
6095 IF( mycol.EQ.iccol .OR. colrep )
THEN
6097 ibb = descc( imb_ ) - ic + 1
6099 $ ibb = ( ( -ibb ) / descc( mb_ ) + 1 )*descc( mb_ ) + ibb
6105 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
6106 erri = abs( pc( iic+(jjc-1)*ldpc ) -
6107 $ c( ioffc ) ) / eps
6108 IF( g( i-ic+1 ).NE.rzero )
6109 $ erri = erri / g( i-ic+1 )
6110 err =
max( err, erri )
6111 IF( err*sqrt( eps ).GE.rone )
6120 icurrow = mod( icurrow+1, nprow )
6122 DO 130 i = in+1, ic+n-1, descc( mb_ )
6123 ibb =
min( ic+n-i, descc( mb_ ) )
6125 DO 120 kk = 0, ibb-1
6127 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
6128 erri = abs( pc( iic+(jjc-1)*ldpc ) -
6130 IF( g( i+kk-ic+1 ).NE.rzero )
6131 $ erri = erri / g( i+kk-ic+1 )
6132 err =
max( err, erri )
6133 IF( err*sqrt( eps ).GE.rone )
6142 icurrow = mod( icurrow+1, nprow )
6150 CALL igsum2d( ictxt,
'All',
' ', 1, 1, info, 1, -1, mycol )
6151 CALL sgamx2d( ictxt,
'All',
' ', 1, 1, err, 1, i, j, -1, -1,
6165 SUBROUTINE pcmmch2( ICTXT, UPLO, TRANS, N, K, ALPHA, A, IA, JA,
6166 $ DESCA, B, IB, JB, DESCB, BETA, C, PC, IC,
6167 $ JC, DESCC, CT, G, ERR, INFO )
6175 CHARACTER*1 TRANS, UPLO
6176 INTEGER IA, IB, IC, ICTXT, INFO, JA, JB, JC, K, N
6181 INTEGER DESCA( * ), DESCB( * ), DESCC( * )
6183 COMPLEX A( * ), B( * ), C( * ), CT( * ),
6359 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
6360 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
6362 PARAMETER ( BLOCK_CYCLIC_2D_INB = 2, dlen_ = 11,
6363 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
6364 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
6365 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
6367 PARAMETER ( RZERO = 0.0e+0, rone = 1.0e+0 )
6369 PARAMETER ( ZERO = ( 0.0e+0, 0.0e+0 ) )
6372 LOGICAL COLREP, HTRAN, NOTRAN, ROWREP, TRAN, UPPER
6373 INTEGER I, IBB, IBEG, ICCOL, ICROW, ICURROW, IEND, IIC,
6374 $ IN, IOFFAK, IOFFAN, IOFFBK, IOFFBN, IOFFC, J,
6375 $ JJC, KK, LDA, LDB, LDC, LDPC, MYCOL, MYROW,
6381 EXTERNAL blacs_gridinfo, igsum2d,
pb_infog2l, sgamx2d
6386 EXTERNAL lsame, pslamch
6389 INTRINSIC abs, aimag, conjg,
max,
min, mod, real, sqrt
6393 ABS1( Z ) = abs( real( z ) ) + abs( aimag( z ) )
6397 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
6399 eps = pslamch( ictxt,
'eps' )
6401 upper = lsame( uplo,
'U' )
6402 htran = lsame( trans,
'H' )
6403 notran = lsame( trans,
'N' )
6404 tran = lsame( trans,
'T' )
6406 lda =
max( 1, desca( m_ ) )
6407 ldb =
max( 1, descb( m_ ) )
6408 ldc =
max( 1, descc( m_ ) )
6431 ioffak = ia + j - 1 + ( ja + kk - 2 ) * lda
6432 ioffbk = ib + j - 1 + ( jb + kk - 2 ) * ldb
6433 DO 20 i = ibeg, iend
6434 ioffan = ia + i - 1 + ( ja + kk - 2 ) * lda
6435 ioffbn = ib + i - 1 + ( jb + kk - 2 ) * ldb
6436 ct( i ) = ct( i ) + alpha * (
6437 $ a( ioffan ) * b( ioffbk ) +
6438 $ b( ioffbn ) * a( ioffak ) )
6439 g( i ) = g( i ) + abs( alpha ) * (
6440 $ abs1( a( ioffan ) ) * abs1( b( ioffbk ) ) +
6441 $ abs1( b( ioffbn ) ) * abs1( a( ioffak ) ) )
6444 ELSE IF( tran )
THEN
6446 ioffak = ia + kk - 1 + ( ja + j - 2 ) * lda
6447 ioffbk = ib + kk - 1 + ( jb + j - 2 ) * ldb
6448 DO 40 i = ibeg, iend
6449 ioffan = ia + kk - 1 + ( ja + i - 2 ) * lda
6450 ioffbn = ib + kk - 1 + ( jb + i - 2 ) * ldb
6451 ct( i ) = ct( i ) + alpha * (
6452 $ a( ioffan ) * b( ioffbk ) +
6453 $ b( ioffbn ) * a( ioffak ) )
6454 g( i ) = g( i ) + abs( alpha ) * (
6455 $ abs1( a( ioffan ) ) * abs1( b( ioffbk ) ) +
6456 $ abs1( b( ioffbn ) ) * abs1( a( ioffak ) ) )
6459 ELSE IF( htran )
THEN
6461 ioffak = ia + j - 1 + ( ja + kk - 2 ) * lda
6462 ioffbk = ib + j - 1 + ( jb + kk - 2 ) * ldb
6463 DO 60 i = ibeg, iend
6464 ioffan = ia + i - 1 + ( ja + kk - 2 ) * lda
6465 ioffbn = ib + i - 1 + ( jb + kk - 2 ) * ldb
6467 $ alpha * a( ioffan ) * conjg( b( ioffbk ) ) +
6468 $ b( ioffbn ) * conjg( alpha * a( ioffak ) )
6469 g( i ) = g( i ) + abs1( alpha ) * (
6470 $ abs1( a( ioffan ) ) * abs1( b( ioffbk ) ) +
6471 $ abs1( b( ioffbn ) ) * abs1( a( ioffak ) ) )
6476 ioffak = ia + kk - 1 + ( ja + j - 2 ) * lda
6477 ioffbk = ib + kk - 1 + ( jb + j - 2 ) * ldb
6478 DO 80 i = ibeg, iend
6479 ioffan = ia + kk - 1 + ( ja + i - 2 ) * lda
6480 ioffbn = ib + kk - 1 + ( jb + i - 2 ) * ldb
6482 $ alpha * conjg( a( ioffan ) ) * b( ioffbk ) +
6483 $ conjg( alpha * b( ioffbn ) ) * a( ioffak )
6484 g( i ) = g( i ) + abs1( alpha ) * (
6485 $ abs1( conjg( a( ioffan ) ) * b( ioffbk ) ) +
6486 $ abs1( conjg( b( ioffbn ) ) * a( ioffak ) ) )
6491 ioffc = ic + ibeg - 1 + ( jc + j - 2 ) * ldc
6493 DO 100 i = ibeg, iend
6494 ct( i ) = ct( i ) + beta * c( ioffc )
6495 g( i ) = g( i ) + abs1( beta )*abs1( c( ioffc ) )
6496 c( ioffc ) = ct( i )
6504 ldpc = descc( lld_ )
6505 ioffc = ic + ( jc + j - 2 ) * ldc
6506 CALL pb_infog2l( ic, jc+j-1, descc, nprow, npcol, myrow, mycol,
6507 $ iic, jjc, icrow, iccol )
6509 rowrep = ( icrow.EQ.-1 )
6510 colrep = ( iccol.EQ.-1 )
6512 IF( mycol.EQ.iccol .OR. colrep )
THEN
6514 ibb = descc( imb_ ) - ic + 1
6516 $ ibb = ( ( -ibb ) / descc( mb_ ) + 1 )*descc( mb_ ) + ibb
6522 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
6523 erri = abs( pc( iic+(jjc-1)*ldpc ) -
6524 $ c( ioffc ) ) / eps
6525 IF( g( i-ic+1 ).NE.rzero )
6526 $ erri = erri / g( i-ic+1 )
6527 err =
max( err, erri )
6528 IF( err*sqrt( eps ).GE.rone )
6537 icurrow = mod( icurrow+1, nprow )
6539 DO 130 i = in+1, ic+n-1, descc( mb_ )
6540 ibb =
min( ic+n-i, descc( mb_ ) )
6542 DO 120 kk = 0, ibb-1
6544 IF( myrow.EQ.icurrow .OR. rowrep )
THEN
6545 erri = abs( pc( iic+(jjc-1)*ldpc ) -
6547 IF( g( i+kk-ic+1 ).NE.rzero )
6548 $ erri = erri / g( i+kk-ic+1 )
6549 err =
max( err, erri )
6550 IF( err*sqrt( eps ).GE.rone )
6559 icurrow = mod( icurrow+1, nprow )
6567 CALL igsum2d( ictxt,
'All',
' ', 1, 1, info, 1, -1, mycol )
6568 CALL sgamx2d( ictxt,
'All',
' ', 1, 1, err, 1, i, j, -1, -1,
6582 SUBROUTINE pcmmch3( UPLO, TRANS, M, N, ALPHA, A, IA, JA, DESCA,
6583 $ BETA, C, PC, IC, JC, DESCC, ERR, INFO )
6591 CHARACTER*1 TRANS, UPLO
6592 INTEGER IA, IC, INFO, JA, JC, M, N
6597 INTEGER DESCA( * ), DESCC( * )
6598 COMPLEX A( * ), C( * ), PC( * )
6741 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
6742 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
6744 PARAMETER ( BLOCK_CYCLIC_2D_INB = 2, dlen_ = 11,
6745 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
6746 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
6747 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
6749 PARAMETER ( ZERO = 0.0e+0 )
6752 LOGICAL COLREP, CTRAN, LOWER, NOTRAN, ROWREP, UPPER
6753 INTEGER I, ICCOL, ICROW, ICTXT, IIC, IOFFA, IOFFC, J,
6754 $ JJC, LDA, LDC, LDPC, MYCOL, MYROW, NPCOL,
6756 REAL ERR0, ERRI, PREC
6759 EXTERNAL BLACS_GRIDINFO, IGSUM2D, PB_INFOG2L,
6765 EXTERNAL LSAME, PSLAMCH
6768 INTRINSIC abs, conjg,
max
6772 ictxt = descc( ctxt_ )
6773 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
6775 prec = pslamch( ictxt,
'eps' )
6777 upper = lsame( uplo,
'U' )
6778 lower = lsame( uplo,
'L' )
6779 notran = lsame( trans,
'N' )
6780 ctran = lsame( trans,
'C' )