1 SUBROUTINE pzlascal( TYPE, M, N, ALPHA, A, IA, JA, DESCA )
136 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
137 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
139 parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
140 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
141 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
142 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
146 LOGICAL GODOWN, GOLEFT, LOWER, UPPER
147 INTEGER IACOL, IAROW, ICTXT, IIA, IIMAX, ILOW, IMB1,
148 $ IMBLOC, INB1, INBLOC, IOFFA, IOFFD, ITYPE,
149 $ IUPP, JJA, JJMAX, JOFFA, , LCMT, LCMT00,
150 $ LDA, LMBLOC, LNBLOC, LOW, M1, MB, MBLKD, MBLKS,
151 $ MBLOC, MP, MRCOL, MRROW, MYCOL, MYROW, N1, NB,
152 $ NBLKD, NBLKS, NBLOC, NPCOL, NPROW, NQ, PMB,
156 INTEGER DESCA2( DLEN_ )
165 EXTERNAL lsame, pb_numroc
178 ictxt = desca2( ctxt_ )
183 IF( m.EQ.0 .OR. n.EQ.0 )
186 IF(
lsame(
TYPE,
'L' ) ) then
192 ELSE IF(
lsame(
TYPE,
'U' ) ) then
198 ELSE IF(
lsame(
TYPE,
'H' ) ) then
214 IF( itype.EQ.0 )
THEN
218 CALL pb_infog2l( ia, ja, desca2, nprow, npcol, myrow, mycol,
219 $ iia, jja, iarow, iacol )
220 mp = pb_numroc( m, ia, desca2( imb_ ), desca2( mb_ ), myrow,
221 $ desca2( rsrc_ ), nprow )
222 nq = pb_numroc( n, ja, desca2( inb_ ), desca2( nb_ ), mycol,
223 $ desca2( csrc_ ), npcol )
225 IF( mp.LE.0 .OR. nq.LE.0 )
229 ioffa = iia + ( jja - 1 ) * lda
231 CALL pb_zlascal(
'All', mp, nq, 0, alpha, a( ioffa ), lda )
237 CALL pb_ainfog2l( m, n, ia, ja, desca2, nprow, npcol, myrow,
238 $ mycol, imb1, inb1, mp, nq, iia, jja, iarow,
239 $ iacol, mrrow, mrcol )
241 IF( mp.LE.0 .OR. nq.LE.0 )
251 CALL pb_binfo( ioffd, mp, nq, imb1, inb1, mb, nb, mrrow,
252 $ mrcol, lcmt00, mblks, nblks, imbloc, inbloc,
253 $ lmbloc, lnbloc, ilow, low, iupp, upp )
262 IF( desca2( rsrc_ ).LT.0 )
THEN
267 IF( desca2( csrc_ ).LT.0 )
THEN
276 godown = ( lcmt00.GT.iupp )
277 goleft = ( lcmt00.LT.ilow )
279 IF( .NOT.godown .AND. .NOT.goleft )
THEN
283 goleft = ( ( lcmt00 - ( iupp - upp + pmb ) ).LT.ilow )
286 CALL pb_zlascal( uplo, imbloc, inbloc, lcmt00, alpha,
287 $ a( iia+joffa*lda ), lda )
289 IF( upper .AND. nq.GT.inbloc )
290 $
CALL pb_zlascal(
'All', imbloc, nq-inbloc, 0, alpha,
291 $ a( iia+(joffa+inbloc)*lda ), lda )
295 IF( lower .AND. mp.GT.imbloc )
296 $
CALL pb_zlascal(
'All', mp-imbloc, inbloc, 0, alpha,
297 $ a( iia+imbloc+joffa*lda ), lda )
306 lcmt00 = lcmt00 - ( iupp - upp + pmb )
308 ioffa = ioffa + imbloc
311 IF( mblks.GT.0 .AND. lcmt00.GT.upp )
THEN
312 lcmt00 = lcmt00 - pmb
318 tmp1 =
min( ioffa, iimax ) - iia + 1
319 IF( upper .AND. tmp1.GT.0 )
THEN
321 $ a( iia+joffa*lda ), lda )
335 IF( mblkd.GT.0 .AND. lcmt.GE.ilow )
THEN
338 CALL pb_zlascal( uplo, mbloc, inbloc, lcmt, alpha,
339 $ a( ioffd+1+joffa*lda ), lda )
345 ioffd = ioffd + mbloc
349 tmp1 = m1 - ioffd + iia - 1
350 IF( lower .AND. tmp1.GT.0 )
351 $
CALL pb_zlascal(
'All', tmp1, inbloc, 0, alpha,
352 $ a( ioffd+1+joffa*lda ), lda )
354 tmp1 = ioffa - iia + 1
357 lcmt00 = lcmt00 + low - ilow + qnb
359 joffa = joffa + inbloc
361 IF( upper .AND. tmp1.GT.0 .AND. n1.GT.0 )
363 $ a( iia+joffa*lda ), lda )
368 ELSE IF( goleft )
THEN
370 lcmt00 = lcmt00 + low - ilow + qnb
372 joffa = joffa + inbloc
375 IF( nblks.GT.0 .AND. lcmt00.LT.low )
THEN
376 lcmt00 = lcmt00 + qnb
382 tmp1 =
min( joffa, jjmax ) - jja + 1
383 IF( lower .AND. tmp1.GT.0 )
THEN
385 $ a( iia+(jja-1)*lda ), lda )
399 IF( nblkd.GT.0 .AND. lcmt.LE.iupp )
THEN
402 CALL pb_zlascal( uplo, imbloc, nbloc, lcmt, alpha,
403 $ a( iia+joffd*lda ), lda )
409 joffd = joffd + nbloc
413 tmp1 = n1 - joffd + jja - 1
414 IF( upper .AND. tmp1.GT.0 )
415 $
CALL pb_zlascal(
'All', imbloc, tmp1, 0, alpha,
416 $ a( iia+joffd*lda ), lda )
418 tmp1 = joffa - jja + 1
421 lcmt00 = lcmt00 - ( iupp - upp + pmb )
423 ioffa = ioffa + imbloc
425 IF( lower .AND. m1.GT.0 .AND. tmp1.GT.0 )
427 $ A( IOFFA+1+(JJA-1)*LDA ), LDA )
436.GT.
IF( NBLKS0 ) THEN
440.GT..AND..GT.
IF( MBLKS0 LCMT00UPP ) THEN
441 LCMT00 = LCMT00 - PMB
447 TMP1 = MIN( IOFFA, IIMAX ) - IIA + 1
448.AND..GT.
IF( UPPER TMP10 ) THEN
449 CALL PB_ZLASCAL( 'all
', TMP1, N1, 0, ALPHA,
450 $ A( IIA+JOFFA*LDA ), LDA )
464.GT..AND..GE.
IF( MBLKD0 LCMTLOW ) THEN
467 CALL PB_ZLASCAL( UPLO, MBLOC, NBLOC, LCMT, ALPHA,
468 $ A( IOFFD+1+JOFFA*LDA ), LDA )
474 IOFFD = IOFFD + MBLOC
478 TMP1 = M1 - IOFFD + IIA - 1
479.AND..GT.
IF( LOWER TMP10 )
480 $ CALL PB_ZLASCAL( 'all
', TMP1, NBLOC, 0, ALPHA,
481 $ A( IOFFD+1+JOFFA*LDA ), LDA )
483 TMP1 = MIN( IOFFA, IIMAX ) - IIA + 1
486 LCMT00 = LCMT00 + QNB
488 JOFFA = JOFFA + NBLOC
490.AND..GT..AND..GT.
IF( UPPER TMP10 N10 )
491 $ CALL PB_ZLASCAL( 'all
', TMP1, N1, 0, ALPHA,
492 $ A( IIA+JOFFA*LDA ), LDA )
1499 SUBROUTINE PB_ZLAGEN( UPLO, AFORM, A, LDA, LCMT00, IRAN, MBLKS,
1500 $ IMBLOC, MB, LMBLOC, NBLKS, INBLOC, NB,
1501 $ LNBLOC, JMP, IMULADD )
1509 CHARACTER*1 UPLO, AFORM
1510 INTEGER IMBLOC, INBLOC, LCMT00, LDA, LMBLOC, LNBLOC,
1511 $ MB, MBLKS, NB, NBLKS
1514 INTEGER IMULADD( 4, * ), IRAN( * ), JMP( * )
1515 COMPLEX*16 A( LDA, * )
1618 INTEGER JMP_1, JMP_COL, JMP_IMBV, JMP_INBV, JMP_LEN,
1619 $ JMP_MB, JMP_NB, JMP_NPIMBLOC, JMP_NPMB,
1620 $ JMP_NQINBLOC, JMP_NQNB, JMP_ROW
1621 PARAMETER ( JMP_1 = 1, JMP_ROW = 2, JMP_COL = 3,
1622 $ JMP_MB = 4, JMP_IMBV = 5, JMP_NPMB = 6,
1623 $ JMP_NPIMBLOC = 7, JMP_NB = 8, JMP_INBV = 9,
1624 $ JMP_NQNB = 10, JMP_NQINBLOC = 11,
1626 DOUBLE PRECISION ZERO
1627 PARAMETER ( ZERO = 0.0D+0 )
1630 INTEGER I, IB, IBLK, II, IK, ITMP, JB, JBLK, JJ, JK,
1631 $ JTMP, LCMTC, LCMTR, LOW, MNB, UPP
1635 INTEGER IB0( 2 ), IB1( 2 ), IB2( 2 ), IB3( 2 )
1642 DOUBLE PRECISION PB_DRAND
1643 EXTERNAL LSAME, PB_DRAND
1646 INTRINSIC DBLE, DCMPLX, MAX, MIN
1651 IB1( I ) = IRAN( I )
1652 IB2( I ) = IRAN( I )
1653 IB3( I ) = IRAN( I )
1656 IF( LSAME( AFORM, 'n' ) )
THEN
1662 DO 50 jblk = 1, nblks
1664 IF( jblk.EQ.1 )
THEN
1666 ELSE IF( jblk.EQ.nblks )
THEN
1672 DO 40 jk = jj, jj + jb - 1
1676 DO 30 iblk = 1, mblks
1678 IF( iblk.EQ.1 )
THEN
1680 ELSE IF( iblk.EQ.mblks )
THEN
1688 DO 20 ik = ii, ii + ib - 1
1689 a( ik, jk ) = dcmplx(
pb_drand( 0 ),
1695 IF( iblk.EQ.1 )
THEN
1699 CALL pb_jumpit( imuladd( 1, jmp_npimbloc ), ib1,
1706 CALL pb_jumpit( imuladd( 1, jmp_npmb ), ib1, ib0 )
1717 CALL pb_jumpit( imuladd( 1, jmp_col ), ib2, ib0 )
1728 IF( jblk.EQ.1 )
THEN
1732 CALL pb_jumpit( imuladd( 1, jmp_nqinbloc ), ib3, ib0 )
1738 CALL pb_jumpit( imuladd( 1, jmp_nqnb ), ib3, ib0 )
1751 ELSE IF(
lsame( aform,
'T' ) )
THEN
1758 DO 90 iblk = 1, mblks
1760 IF( iblk.EQ.1 )
THEN
1762 ELSE IF( iblk.EQ.mblks )
THEN
1768 DO 80 ik = ii, ii + ib - 1
1772 DO 70 jblk = 1, nblks
1774 IF( jblk.EQ.1 )
THEN
1776 ELSE IF( jblk.EQ.nblks )
THEN
1784 DO 60 jk = jj, jj + jb - 1
1785 a( ik, jk ) = dcmplx(
pb_drand( 0 ),
1791 IF( jblk.EQ.1 )
THEN
1795 CALL pb_jumpit( imuladd( 1, jmp_nqinbloc ), ib1,
1802 CALL pb_jumpit( imuladd( 1, jmp_nqnb ), ib1, ib0 )
1813 CALL pb_jumpit( imuladd( 1, jmp_row ), ib2, ib0 )
1824 IF( iblk.EQ.1 )
THEN
1828 CALL pb_jumpit( imuladd( 1, jmp_npimbloc ), ib3, ib0 )
1834 CALL pb_jumpit( imuladd( 1, jmp_npmb ), ib3, ib0 )
1847 ELSE IF(
lsame( aform,
'S' ) )
THEN
1858 DO 170 jblk = 1, nblks
1860 IF( jblk.EQ.1 )
THEN
1863 ELSE IF( jblk.EQ.nblks )
THEN
1871 DO 160 jk = jj, jj + jb - 1
1876 DO 150 iblk = 1, mblks
1878 IF( iblk.EQ.1 )
THEN
1881 ELSE IF( iblk.EQ.mblks )
THEN
1891 IF( lcmtr.GT.upp
THEN
1893 DO 100 ik = ii, ii + ib - 1
1898 ELSE IF( lcmtr.GE.low )
THEN
1901 mnb =
max( 0, -lcmtr )
1903 IF( jtmp.LE.
min( mnb, jb ) )
THEN
1905 DO 110 ik = ii, ii + ib - 1
1906 a( ik, jk ) = dcmplx(
pb_drand( 0 ),
1910 ELSE IF( ( jtmp.GE.( mnb + 1 ) ) .AND.
1911 $ ( jtmp.LE.
min( ib-lcmtr, jb ) ) )
THEN
1913 itmp = ii + jtmp + lcmtr - 1
1915 DO 120 ik = ii, itmp - 1
1920 DO 130 ik = itmp, ii + ib - 1
1921 a( ik, jk ) = dcmplx(
pb_drand( 0 ),
1929 DO 140 ik = ii, ii + ib - 1
1930 a( ik, jk ) = dcmplx(
pb_drand( 0 ),
1938 IF( iblk.EQ.1 )
THEN
1942 lcmtr = lcmtr - jmp( jmp_npimbloc )
1943 CALL pb_jumpit( imuladd( 1, jmp_npimbloc ), ib1,
1950 lcmtr = lcmtr - jmp( jmp_npmb )
1951 CALL pb_jumpit( imuladd( 1, jmp_npmb ), ib1,
1963 CALL pb_jumpit( imuladd( 1, jmp_col ), ib2, ib0 )
1974 IF( jblk.EQ.1 )
THEN
1978 lcmtc = lcmtc + jmp( jmp_nqinbloc )
1979 CALL pb_jumpit( imuladd( 1, jmp_nqinbloc ), ib3, ib0 )
1985 lcmtc = lcmtc + jmp( jmp_nqnb )
1986 CALL pb_jumpit( imuladd( 1, jmp_nqnb ), ib3, ib0 )
2006 DO 250 iblk = 1, mblks
2008 IF( iblk.EQ.1 )
THEN
2011 ELSE IF( iblk.EQ.mblks )
THEN
2019 DO 240 ik = ii, ii + ib - 1
2024 DO 230 jblk = 1, nblks
2026 IF( jblk.EQ.1 )
THEN
2029 ELSE IF( jblk.EQ.nblks )
THEN
2039 IF( lcmtc.LT.low )
THEN
2041 DO 180 jk = jj, jj + jb - 1
2046 ELSE IF( lcmtc.LE.upp )
THEN
2049 mnb =
max( 0, lcmtc )
2051 IF( itmp.LE.
min( mnb, ib ) )
THEN
2053 DO 190 jk = jj, jj + jb - 1
2054 a( ik, jk ) = dcmplx(
pb_drand( 0 ),
2058 ELSE IF( ( itmp.GE.( mnb + 1 ) ) .AND.
2059 $ ( itmp.LE.
min( jb+lcmtc, ib ) ) )
THEN
2061 jtmp = jj + itmp - lcmtc - 1
2063 DO 200 jk = jj, jtmp - 1
2068 DO 210 jk = jtmp, jj + jb - 1
2069 a( ik, jk ) = dcmplx(
pb_drand( 0 ),
2077 DO 220 jk = jj, jj + jb - 1
2078 a( ik, jk ) = dcmplx(
pb_drand( 0 ),
2086 IF( jblk.EQ.1 )
THEN
2090 lcmtc = lcmtc + jmp( jmp_nqinbloc )
2091 CALL pb_jumpit( imuladd( 1, jmp_nqinbloc ), ib1,
2098 lcmtc = lcmtc + jmp( jmp_nqnb )
2099 CALL pb_jumpit( imuladd( 1, jmp_nqnb ), ib1,
2111 CALL pb_jumpit( imuladd( 1, jmp_row ), ib2, ib0 )
2122 IF( iblk.EQ.1 )
THEN
2126 lcmtr = lcmtr - jmp( jmp_npimbloc )
2127 CALL pb_jumpit( imuladd( 1, jmp_npimbloc ), ib3, ib0 )
2133 lcmtr = lcmtr - jmp( jmp_npmb )
2134 CALL pb_jumpit( imuladd( 1, jmp_npmb ), ib3, ib0 )
2149 ELSE IF(
lsame( aform,
'C' ) )
THEN
2156 DO 290 iblk = 1, mblks
2158 IF( iblk.EQ.1 )
THEN
2160 ELSE IF( iblk.EQ.mblks )
THEN
2166 DO 280 ik = ii, ii + ib - 1
2170 DO 270 jblk = 1, nblks
2172 IF( jblk.EQ.1 )
THEN
2174 ELSE IF( jblk.EQ.nblks )
THEN
2182 DO 260 jk = jj, jj + jb - 1
2183 a( ik, jk ) = dcmplx(
pb_drand( 0 ),
2189 IF( jblk.EQ.1 )
THEN
2193 CALL pb_jumpit( imuladd( 1, jmp_nqinbloc ), ib1,
2200 CALL pb_jumpit( imuladd( 1, jmp_nqnb ), ib1,
2212 CALL pb_jumpit( imuladd( 1, jmp_row ), ib2, ib0 )
2223 IF( iblk.EQ.1 )
THEN
2227 CALL pb_jumpit( imuladd( 1, jmp_npimbloc ), ib3, ib0 )
2233 CALL pb_jumpit( imuladd( 1, jmp_npmb ), ib3, ib0 )
2246 ELSE IF(
lsame( aform,
'H' ) )
THEN
2250 IF(
lsame( uplo,
'L' ) )
THEN
2257 DO 370 jblk = 1, nblks
2259 IF( jblk.EQ.1 )
THEN
2262 ELSE IF( jblk.EQ.nblks )
THEN
2270 DO 360 jk = jj, jj + jb - 1
2275 DO 350 iblk = 1, mblks
2277 IF( iblk.EQ.1 )
THEN
2280 ELSE IF( iblk.EQ.mblks )
THEN
2290 IF( lcmtr.GT.upp )
THEN
2292 DO 300 ik = ii, ii + ib - 1
2297 ELSE IF( lcmtr.GE.low )
THEN
2300 mnb =
max( 0, -lcmtr )
2302 IF( jtmp.LE.
min( mnb, jb ) )
THEN
2304 DO 310 ik = ii, ii + ib - 1
2305 a( ik, jk ) = dcmplx(
pb_drand( 0 ),
2309 ELSE IF( ( jtmp.GE.( mnb + 1 ) ) .AND.
2310 $ ( jtmp.LE.
min( ib-lcmtr, jb ) ) )
THEN
2312 itmp = ii + jtmp + lcmtr - 1
2314 DO 320 ik = ii, itmp - 1
2319 IF( itmp.LE.( ii + ib - 1 ) )
THEN
2322 a( itmp, jk ) = dcmplx( dble( dummy ),
2326 DO 330 ik = itmp + 1, ii + ib - 1
2327 a( ik, jk ) = dcmplx(
pb_drand( 0 ),
2335 DO 340 ik = ii, ii + ib - 1
2336 a( ik, jk ) = dcmplx(
pb_drand( 0 ),
2344 IF( iblk.EQ.1 )
THEN
2348 lcmtr = lcmtr - jmp( jmp_npimbloc )
2349 CALL pb_jumpit( imuladd( 1, jmp_npimbloc ), ib1,
2356 lcmtr = lcmtr - jmp( jmp_npmb )
2357 CALL pb_jumpit( imuladd( 1, jmp_npmb ), ib1,
2369 CALL pb_jumpit( imuladd( 1, jmp_col ), ib2, ib0 )
2380 IF( jblk.EQ.1 )
THEN
2384 lcmtc = lcmtc + jmp( jmp_nqinbloc )
2385 CALL pb_jumpit( imuladd( 1, jmp_nqinbloc ), ib3, ib0 )
2391 lcmtc = lcmtc + jmp( jmp_nqnb )
2392 CALL pb_jumpit( imuladd( 1, jmp_nqnb ), ib3, ib0 )
2412 DO 450 iblk = 1, mblks
2414 IF( iblk.EQ.1 )
THEN
2417 ELSE IF( iblk.EQ.mblks )
THEN
2425 DO 440 ik = ii, ii + ib - 1
2430 DO 430 jblk = 1, nblks
2432 IF( jblk.EQ.1 )
THEN
2435 ELSE IF( jblk.EQ.nblks )
THEN
2445 IF( lcmtc.LT.low )
THEN
2447 DO 380 jk = jj, jj + jb - 1
2452 ELSE IF( lcmtc.LE.upp )
THEN
2455 mnb =
max( 0, lcmtc )
2457 IF( itmp.LE.
min( mnb, ib ) )
THEN
2459 DO 390 jk = jj, jj + jb - 1
2460 a( ik, jk ) = dcmplx(
pb_drand( 0 ),
2464 ELSE IF( ( itmp.GE.( mnb + 1 ) ) .AND.
2465 $ ( itmp.LE.
min( jb+lcmtc, ib ) ) )
THEN
2467 jtmp = jj + itmp - lcmtc - 1
2469 DO 400 jk = jj, jtmp - 1
2474 IF( jtmp.LE.( jj + jb - 1 ) )
THEN
2477 a( ik, jtmp ) = dcmplx( dble( dummy ),
2481 DO 410 jk = jtmp + 1, jj + jb - 1
2482 a( ik, jk ) = dcmplx(
pb_drand( 0 ),
2490 DO 420 jk = jj, jj + jb - 1
2491 a( ik, jk ) = dcmplx(
pb_drand( 0 ),
2499 IF( jblk.EQ.1 )
THEN
2503 lcmtc = lcmtc + jmp( jmp_nqinbloc )
2504 CALL pb_jumpit( imuladd( 1, jmp_nqinbloc ), ib1,
2511 lcmtc = lcmtc + jmp( jmp_nqnb )
2512 CALL pb_jumpit( imuladd( 1, jmp_nqnb ), ib1,
2524 CALL pb_jumpit( imuladd( 1, jmp_row ), ib2, ib0 )
2535 IF( iblk.EQ.1 )
THEN
2539 lcmtr = lcmtr - jmp( jmp_npimbloc )
2540 CALL pb_jumpit( imuladd( 1, jmp_npimbloc ), ib3, ib0 )
2546 lcmtr = lcmtr - jmp( jmp_npmb )
2547 CALL pb_jumpit( imuladd( 1, jmp_npmb ), ib3, ib0 )