7509
7510
7511
7512
7513
7514
7515
7516 CHARACTER*1 UPLO
7517 INTEGER IA, JA, M, N
7518 COMPLEX*16 ALPHA, BETA
7519
7520
7521 INTEGER DESCA( * )
7522 COMPLEX*16 A( * )
7523
7524
7525
7526
7527
7528
7529
7530
7531
7532
7533
7534
7535
7536
7537
7538
7539
7540
7541
7542
7543
7544
7545
7546
7547
7548
7549
7550
7551
7552
7553
7554
7555
7556
7557
7558
7559
7560
7561
7562
7563
7564
7565
7566
7567
7568
7569
7570
7571
7572
7573
7574
7575
7576
7577
7578
7579
7580
7581
7582
7583
7584
7585
7586
7587
7588
7589
7590
7591
7592
7593
7594
7595
7596
7597
7598
7599
7600
7601
7602
7603
7604
7605
7606
7607
7608
7609
7610
7611
7612
7613
7614
7615
7616
7617
7618
7619
7620
7621
7622
7623
7624
7625
7626
7627
7628
7629
7630
7631
7632
7633
7634
7635
7636
7637
7638
7639
7640
7641
7642
7643
7644
7645
7646
7647
7648
7649
7650
7651
7652
7653 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
7654 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
7655 $ RSRC_
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 )
7660
7661
7662 LOGICAL GODOWN, GOLEFT, ISCOLREP, ISROWREP, LOWER,
7663 $ UPPER
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,
7670 $ UPP
7671
7672
7673 INTEGER DESCA2( DLEN_ )
7674
7675
7678
7679
7680 LOGICAL LSAME
7682
7683
7685
7686
7687
7688 IF( m.EQ.0 .OR. n.EQ.0 )
7689 $ RETURN
7690
7691
7692
7694
7695
7696
7697 ictxt = desca2( ctxt_ )
7698 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
7699
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 )
7703
7704 IF( mp.LE.0 .OR. nq.LE.0 )
7705 $ RETURN
7706
7707 isrowrep = ( desca2( rsrc_ ).LT.0 )
7708 iscolrep = ( desca2( csrc_ ).LT.0 )
7709 lda = desca2( lld_ )
7710
7711 upper = .NOT.(
lsame( uplo,
'L' ) )
7712 lower = .NOT.(
lsame( uplo,
'U' ) )
7713
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 )
7719 RETURN
7720 END IF
7721
7722
7723
7724
7725 mb = desca2( mb_ )
7726 nb = desca2( nb_ )
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 )
7730
7731 ioffa = iia - 1
7732 joffa = jja - 1
7733 iimax = ioffa + mp
7734 jjmax = joffa + nq
7735
7736 IF( isrowrep ) THEN
7737 pmb = mb
7738 ELSE
7739 pmb = nprow * mb
7740 END IF
7741 IF( iscolrep ) THEN
7742 qnb = nb
7743 ELSE
7744 qnb = npcol * nb
7745 END IF
7746
7747 m1 = mp
7748 n1 = nq
7749
7750
7751
7752
7753 godown = ( lcmt00.GT.iupp )
7754 goleft = ( lcmt00.LT.ilow )
7755
7756 IF( .NOT.godown .AND. .NOT.goleft ) THEN
7757
7758
7759
7760 goleft = ( ( lcmt00 - ( iupp - upp + pmb ) ).LT.ilow )
7761 godown = .NOT.goleft
7762
7763 CALL pb_zlaset( uplo, imbloc, inbloc, lcmt00, alpha, beta,
7764 $ a( iia+joffa*lda ), lda )
7765 IF( godown ) THEN
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 )
7769 iia = iia + imbloc
7770 m1 = m1 - imbloc
7771 ELSE
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 )
7775 jja = jja + inbloc
7776 n1 = n1 - inbloc
7777 END IF
7778
7779 END IF
7780
7781 IF( godown ) THEN
7782
7783 lcmt00 = lcmt00 - ( iupp - upp + pmb )
7784 mblks = mblks - 1
7785 ioffa = ioffa + imbloc
7786
7787 10 CONTINUE
7788 IF( mblks.GT.0 .AND. lcmt00.GT.upp ) THEN
7789 lcmt00 = lcmt00 - pmb
7790 mblks = mblks - 1
7791 ioffa = ioffa + mb
7792 GO TO 10
7793 END IF
7794
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 )
7799 iia = iia + tmp1
7800 m1 = m1 - tmp1
7801 END IF
7802
7803 IF( mblks.LE.0 )
7804 $ RETURN
7805
7806 lcmt = lcmt00
7807 mblkd = mblks
7808 ioffd = ioffa
7809
7810 mbloc = mb
7811 20 CONTINUE
7812 IF( mblkd.GT.0 .AND. lcmt.GE.ilow ) THEN
7813 IF( mblkd.EQ.1 )
7814 $ mbloc = lmbloc
7815 CALL pb_zlaset( uplo, mbloc, inbloc, lcmt, alpha, beta,
7816 $ a( ioffd+1+joffa*lda ), lda )
7817 lcmt00 = lcmt
7818 lcmt = lcmt - pmb
7819 mblks = mblkd
7820 mblkd = mblkd - 1
7821 ioffa = ioffd
7822 ioffd = ioffd + mbloc
7823 GO TO 20
7824 END IF
7825
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 )
7830
7831 tmp1 = ioffa - iia + 1
7832 m1 = m1 - tmp1
7833 n1 = n1 - inbloc
7834 lcmt00 = lcmt00 + low - ilow + qnb
7835 nblks = nblks - 1
7836 joffa = joffa + inbloc
7837
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 )
7841
7842 iia = ioffa + 1
7843 jja = joffa + 1
7844
7845 ELSE IF( goleft ) THEN
7846
7847 lcmt00 = lcmt00 + low - ilow + qnb
7848 nblks = nblks - 1
7849 joffa = joffa + inbloc
7850
7851 30 CONTINUE
7852 IF( nblks.GT.0 .AND. lcmt00.LT.low ) THEN
7853 lcmt00 = lcmt00 + qnb
7854 nblks = nblks - 1
7855 joffa = joffa + nb
7856 GO TO 30
7857 END IF
7858
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 )
7863 jja = jja + tmp1
7864 n1 = n1 - tmp1
7865 END IF
7866
7867 IF( nblks.LE.0 )
7868 $ RETURN
7869
7870 lcmt = lcmt00
7871 nblkd = nblks
7872 joffd = joffa
7873
7874 nbloc = nb
7875 40 CONTINUE
7876 IF( nblkd.GT.0 .AND. lcmt.LE.iupp ) THEN
7877 IF( nblkd.EQ.1 )
7878 $ nbloc = lnbloc
7879 CALL pb_zlaset( uplo, imbloc, nbloc, lcmt, alpha, beta,
7880 $ a( iia+joffd*lda ), lda )
7881 lcmt00 = lcmt
7882 lcmt = lcmt + qnb
7883 nblks = nblkd
7884 nblkd = nblkd - 1
7885 joffa = joffd
7886 joffd = joffd + nbloc
7887 GO TO 40
7888 END IF
7889
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 )
7894
7895 tmp1 = joffa - jja + 1
7896 m1 = m1 - imbloc
7897 n1 = n1 - tmp1
7898 lcmt00 = lcmt00 - ( iupp - upp + pmb )
7899 mblks = mblks - 1
7900 ioffa = ioffa + imbloc
7901
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 )
7905
7906 iia = ioffa + 1
7907 jja = joffa + 1
7908
7909 END IF
7910
7911 nbloc = nb
7912 50 CONTINUE
7913 IF( nblks.GT.0 ) THEN
7914 IF( nblks.EQ.1 )
7915 $ nbloc = lnbloc
7916 60 CONTINUE
7917 IF( mblks.GT.0 .AND. lcmt00.GT.upp ) THEN
7918 lcmt00 = lcmt00 - pmb
7919 mblks = mblks - 1
7920 ioffa = ioffa + mb
7921 GO TO 60
7922 END IF
7923
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 )
7928 iia = iia + tmp1
7929 m1 = m1 - tmp1
7930 END IF
7931
7932 IF( mblks.LE.0 )
7933 $ RETURN
7934
7935 lcmt = lcmt00
7936 mblkd = mblks
7937 ioffd = ioffa
7938
7939 mbloc = mb
7940 70 CONTINUE
7941 IF( mblkd.GT.0 .AND. lcmt.GE.low ) THEN
7942 IF( mblkd.EQ.1 )
7943 $ mbloc = lmbloc
7944 CALL pb_zlaset( uplo, mbloc, nbloc, lcmt, alpha, beta,
7945 $ a( ioffd+1+joffa*lda ), lda )
7946 lcmt00 = lcmt
7947 lcmt = lcmt - pmb
7948 mblks = mblkd
7949 mblkd = mblkd - 1
7950 ioffa = ioffd
7951 ioffd = ioffd + mbloc
7952 GO TO 70
7953 END IF
7954
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 )
7959
7960 tmp1 =
min( ioffa, iimax ) - iia + 1
7961 m1 = m1 - tmp1
7962 n1 = n1 - nbloc
7963 lcmt00 = lcmt00 + qnb
7964 nblks = nblks - 1
7965 joffa = joffa + nbloc
7966
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 )
7970
7971 iia = ioffa + 1
7972 jja = joffa + 1
7973
7974 GO TO 50
7975
7976 END IF
7977
7978 RETURN
7979
7980
7981
subroutine pb_ainfog2l(m, n, i, j, desc, nprow, npcol, myrow, mycol, imb1, inb1, mp, nq, ii, jj, prow, pcol, rprow, rpcol)
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_desctrans(descin, descout)
subroutine pb_zlaset(uplo, m, n, ioffd, alpha, beta, a, lda)