1 SUBROUTINE pclascal( TYPE, M, N, ALPHA, A, IA, JA, DESCA )
136 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
137 $ DTYPE_, IMB_, , LLD_, MB_, M_, , 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, JOFFD, 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,
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_clascal(
'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_clascal( uplo, imbloc, inbloc, lcmt00, alpha,
287 $ a( iia+joffa*lda ), lda )
289 IF( upper .AND. nq.GT.inbloc )
290 $
CALL pb_clascal(
'All', imbloc, nq-inbloc, 0, alpha,
291 $ a( iia+(joffa+inbloc)*lda ), lda )
295 IF( lower .AND. mp.GT.imbloc )
296 $
CALL pb_clascal(
'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_clascal( uplo, mbloc, inbloc, lcmt, alpha,
339 $ a( ioffd+1+joffa*lda ), lda )
345 ioffd = ioffd + mbloc
349 tmp1 = m1 - ioffd + iia - 1
351 $
CALL pb_clascal(
'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_clascal( 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_clascal(
'All', imbloc, tmp1, 0, alpha,
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 IF( nblks.GT.0 )
THEN
440 IF( mblks.GT.0 .AND. lcmt00.GT.upp )
THEN
441 lcmt00 = lcmt00 - pmb
447 tmp1 =
min( ioffa, iimax ) - iia + 1
448 IF( upper .AND. tmp1.GT.
THEN
450 $ a( iia+joffa*lda ), lda )
464 IF( mblkd.GT.0 .AND. lcmt.GE.low )
THEN
467 CALL pb_clascal( uplo, mbloc, nbloc, lcmt, alpha,
468 $ a( ioffd+1+joffa*lda ), lda )
474 ioffd = ioffd + mbloc
478 tmp1 = m1 - ioffd + iia - 1
479 IF( lower .AND. tmp1.GT.0 )
480 $
CALL pb_clascal(
'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 IF( upper .AND. tmp1.GT.0 .AND. n1.GT.0 )
492 $ a( iia+joffa*lda ), lda )
508 SUBROUTINE pclagen( INPLACE, AFORM, DIAG, OFFA, M, N, IA, JA,
509 $ DESCA, IASEED, A, LDA )
518 CHARACTER*1 aform, diag
519 INTEGER ia, iaseed, ja, lda, , n, offa
701 INTEGER BLOCK_CYCLIC_2D_INB, , CTXT_, DLEN_,
702 $ dtype_, imb_, inb_, lld_, mb_, m_, nb_, n_,
704 parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
705 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
706 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
707 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
708 INTEGER JMP_1, JMP_COL, JMP_IMBV, JMP_INBV, JMP_LEN,
709 $ jmp_mb, jmp_nb, jmp_npimbloc, jmp_npmb,
710 $ jmp_nqinbloc, jmp_nqnb, jmp_row
711 parameter( jmp_1 = 1, jmp_row = 2, jmp_col = 3,
712 $ jmp_mb = 4, jmp_imbv = 5, jmp_npmb = 6,
713 $ jmp_npimbloc = 7, jmp_nb = 8, jmp_inbv = 9,
714 $ jmp_nqnb = 10, jmp_nqinbloc = 11,
717 parameter( zero = 0.0e+0 )
720 LOGICAL DIAGDO, SYMM, HERM, NOTRAN
721 INTEGER CSRC, I, IACOL, IAROW, ICTXT, IIA, ILOCBLK,
722 $ ilocoff, ilow, imb, imb1, imbloc, imbvir, inb,
723 $ inb1, inbloc, inbvir, info, ioffda, itmp, iupp,
724 $ ivir, jja, jlocblk, jlocoff, jvir, lcmt00,
725 $ lmbloc, lnbloc, low, maxmn, mb, mblks, mp,
726 $ mrcol, mrrow, mycdist, mycol, myrdist, myrow,
727 $ nb, nblks, npcol, nprow, nq, nvir, rsrc, upp
731 INTEGER DESCA2( DLEN_ ), IMULADD( 4, JMP_LEN ),
732 $ iran( 2 ), jmp( jmp_len ), muladd0( 4 )
748 DATA ( muladd0( i ), i = 1, 4 ) / 20077, 16838,
759 ictxt = desca2( ctxt_ )
765 IF( nprow.EQ.-1 )
THEN
766 info = -( 1000 + ctxt_ )
768 symm = lsame( aform,
'S' )
769 herm = lsame( aform,
'H' )
770 notran = lsame( aform,
'N' )
771 diagdo = lsame( diag,
'D' )
772 IF( .NOT.( symm.OR.herm.OR.notran ) .AND.
773 $ .NOT.( lsame( aform,
'T' ) ) .AND.
774 $ .NOT.( lsame( aform,
'C' ) ) )
THEN
776 ELSE IF( ( .NOT.diagdo ) .AND.
777 $ ( .NOT.lsame( diag, 'n
' ) ) ) THEN
780 CALL PB_CHKMAT( ICTXT, M, 5, N, 6, IA, JA, DESCA2, 10, INFO )
784 CALL PXERBLA( ICTXT, 'pclagen', -INFO )
790.LE..OR..LE.
IF( ( M0 )( N0 ) )
799 RSRC = DESCA2( RSRC_ )
800 CSRC = DESCA2( CSRC_ )
804 CALL PB_AINFOG2L( M, N, IA, JA, DESCA2, NPROW, NPCOL, MYROW,
805 $ MYCOL, IMB1, INB1, MP, NQ, IIA, JJA, IAROW,
806 $ IACOL, MRROW, MRCOL )
818 IOFFDA = JA + OFFA - IA
819 CALL PB_BINFO( IOFFDA, MP, NQ, IMB1, INB1, MB, NB, MRROW,
820 $ MRCOL, LCMT00, MBLKS, NBLKS, IMBLOC, INBLOC,
821 $ LMBLOC, LNBLOC, ILOW, LOW, IUPP, UPP )
829 ITMP = MAX( 0, -OFFA )
832 NVIR = DESCA2( M_ ) + ITMP
834 CALL PB_LOCINFO( IVIR, IMBVIR, MB, MYROW, RSRC, NPROW, ILOCBLK,
837 ITMP = MAX( 0, OFFA )
840 NVIR = MAX( MAX( NVIR, DESCA2( N_ ) + ITMP ),
841 $ DESCA2( M_ ) + DESCA2( N_ ) - 1 )
843 CALL PB_LOCINFO( JVIR, INBVIR, NB, MYCOL, CSRC, NPCOL, JLOCBLK,
846.OR..OR.
IF( SYMM HERM NOTRAN ) THEN
848 CALL PB_INITJMP( .TRUE., NVIR, IMBVIR, INBVIR, IMBLOC, INBLOC,
849 $ MB, NB, RSRC, CSRC, NPROW, NPCOL, 2, JMP )
853 CALL PB_INITMULADD( MULADD0, JMP, IMULADD )
857 CALL PB_SETLOCRAN( IASEED, ILOCBLK, JLOCBLK, ILOCOFF, JLOCOFF,
858 $ MYRDIST, MYCDIST, NPROW, NPCOL, JMP,
861 CALL PB_CLAGEN( 'lower
', AFORM, A( IIA, JJA ), LDA, LCMT00,
862 $ IRAN, MBLKS, IMBLOC, MB, LMBLOC, NBLKS, INBLOC,
863 $ NB, LNBLOC, JMP, IMULADD )
867.OR..OR..NOT.
IF( SYMM HERM ( NOTRAN ) ) THEN
869 CALL PB_INITJMP( .FALSE., NVIR, IMBVIR, INBVIR, IMBLOC, INBLOC,
870 $ MB, NB, RSRC, CSRC, NPROW, NPCOL, 2, JMP )
874 CALL PB_INITMULADD( MULADD0, JMP, IMULADD )
878 CALL PB_SETLOCRAN( IASEED, ILOCBLK, JLOCBLK, ILOCOFF, JLOCOFF,
879 $ MYRDIST, MYCDIST, NPROW, NPCOL, JMP,
882 CALL PB_CLAGEN( 'upper
', AFORM, A( IIA, JJA ), LDA, LCMT00,
883 $ IRAN, MBLKS, IMBLOC, MB, LMBLOC, NBLKS, INBLOC,
884 $ NB, LNBLOC, JMP, IMULADD )
890 MAXMN = MAX( DESCA2( M_ ), DESCA2( N_ ) )
892 ALPHA = CMPLX( REAL( 2 * MAXMN ), ZERO )
894 ALPHA = CMPLX( REAL( MAXMN ), REAL( MAXMN ) )
897.GE.
IF( IOFFDA0 ) THEN
898 CALL PCLADOM( INPLACE, MIN( MAX( 0, M-IOFFDA ), N ), ALPHA,
899 $ A, MIN( IA+IOFFDA, IA+M-1 ), JA, DESCA )
901 CALL PCLADOM( INPLACE, MIN( M, MAX( 0, N+IOFFDA ) ), ALPHA,
902 $ A, IA, MIN( JA-IOFFDA, JA+N-1 ), DESCA )