7508
7509
7510
7511
7512
7513
7514
7515 CHARACTER*1 UPLO
7516 INTEGER IA, JA, M, N
7517 COMPLEX ALPHA, BETA
7518
7519
7520 INTEGER DESCA( * )
7521 COMPLEX A( * )
7522
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 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
7653 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
7654 $ RSRC_
7655 parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
7656 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
7657 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
7658 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
7659
7660
7661 LOGICAL GODOWN, GOLEFT, ISCOLREP, ISROWREP, LOWER,
7662 $ UPPER
7663 INTEGER IACOL, IAROW, ICTXT, IIA, IIMAX, ILOW, IMB1,
7664 $ IMBLOC, INB1, INBLOC, IOFFA, IOFFD, IUPP, JJA,
7665 $ JJMAX, JOFFA, JOFFD, LCMT, LCMT00, LDA, LMBLOC,
7666 $ LNBLOC, LOW, M1, MB, MBLKD, MBLKS, MBLOC, MP,
7667 $ MRCOL, MRROW, MYCOL, MYROW, N1, NB, NBLKD,
7668 $ NBLKS, NBLOC, NPCOL, NPROW, NQ, PMB, QNB, TMP1,
7669 $ UPP
7670
7671
7672 INTEGER DESCA2( DLEN_ )
7673
7674
7677
7678
7679 LOGICAL LSAME
7681
7682
7684
7685
7686
7687 IF( m.EQ.0 .OR. n.EQ.0 )
7688 $ RETURN
7689
7690
7691
7693
7694
7695
7696 ictxt = desca2( ctxt_ )
7697 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
7698
7699 CALL pb_ainfog2l( m, n, ia, ja, desca2, nprow, npcol, myrow,
7700 $ mycol, imb1, inb1, mp, nq, iia, jja, iarow,
7701 $ iacol, mrrow, mrcol )
7702
7703 IF( mp.LE.0 .OR. nq.LE.0 )
7704 $ RETURN
7705
7706 isrowrep = ( desca2( rsrc_ ).LT.0 )
7707 iscolrep = ( desca2( csrc_ ).LT.0 )
7708 lda = desca2( lld_ )
7709
7710 upper = .NOT.(
lsame( uplo,
'L' ) )
7711 lower = .NOT.(
lsame( uplo,
'U' ) )
7712
7713 IF( ( ( lower.AND.upper ).AND.( alpha.EQ.beta ) ).OR.
7714 $ ( isrowrep .AND. iscolrep ) ) THEN
7715 IF( ( mp.GT.0 ).AND.( nq.GT.0 ) )
7716 $
CALL pb_claset( uplo, mp, nq, 0, alpha, beta,
7717 $ a( iia + ( jja - 1 ) * lda ), lda )
7718 RETURN
7719 END IF
7720
7721
7722
7723
7724 mb = desca2( mb_ )
7725 nb = desca2( nb_ )
7726 CALL pb_binfo( 0, mp, nq, imb1, inb1, mb, nb, mrrow, mrcol,
7727 $ lcmt00, mblks, nblks, imbloc, inbloc, lmbloc,
7728 $ lnbloc, ilow, low, iupp, upp )
7729
7730 ioffa = iia - 1
7731 joffa = jja - 1
7732 iimax = ioffa + mp
7733 jjmax = joffa + nq
7734
7735 IF( isrowrep ) THEN
7736 pmb = mb
7737 ELSE
7738 pmb = nprow * mb
7739 END IF
7740 IF( iscolrep ) THEN
7741 qnb = nb
7742 ELSE
7743 qnb = npcol * nb
7744 END IF
7745
7746 m1 = mp
7747 n1 = nq
7748
7749
7750
7751
7752 godown = ( lcmt00.GT.iupp )
7753 goleft = ( lcmt00.LT.ilow )
7754
7755 IF( .NOT.godown .AND. .NOT.goleft ) THEN
7756
7757
7758
7759 goleft = ( ( lcmt00 - ( iupp - upp + pmb ) ).LT.ilow )
7760 godown = .NOT.goleft
7761
7762 CALL pb_claset( uplo, imbloc, inbloc, lcmt00, alpha, beta,
7763 $ a( iia+joffa*lda ), lda )
7764 IF( godown ) THEN
7765 IF( upper .AND. nq.GT.inbloc )
7766 $
CALL pb_claset(
'All', imbloc, nq-inbloc, 0, alpha,
7767 $ alpha, a( iia+(joffa+inbloc)*lda ), lda )
7768 iia = iia + imbloc
7769 m1 = m1 - imbloc
7770 ELSE
7771 IF( lower .AND. mp.GT.imbloc )
7772 $
CALL pb_claset(
'All', mp-imbloc, inbloc, 0, alpha,
7773 $ alpha, a( iia+imbloc+joffa*lda ), lda )
7774 jja = jja + inbloc
7775 n1 = n1 - inbloc
7776 END IF
7777
7778 END IF
7779
7780 IF( godown ) THEN
7781
7782 lcmt00 = lcmt00 - ( iupp - upp + pmb )
7783 mblks = mblks - 1
7784 ioffa = ioffa + imbloc
7785
7786 10 CONTINUE
7787 IF( mblks.GT.0 .AND. lcmt00.GT.upp ) THEN
7788 lcmt00 = lcmt00 - pmb
7789 mblks = mblks - 1
7790 ioffa = ioffa + mb
7791 GO TO 10
7792 END IF
7793
7794 tmp1 =
min( ioffa, iimax ) - iia + 1
7795 IF( upper .AND. tmp1.GT.0 ) THEN
7796 CALL pb_claset(
'All', tmp1, n1, 0, alpha, alpha,
7797 $ a( iia+joffa*lda ), lda )
7798 iia = iia + tmp1
7799 m1 = m1 - tmp1
7800 END IF
7801
7802 IF( mblks.LE.0 )
7803 $ RETURN
7804
7805 lcmt = lcmt00
7806 mblkd = mblks
7807 ioffd = ioffa
7808
7809 mbloc = mb
7810 20 CONTINUE
7811 IF( mblkd.GT.0 .AND. lcmt.GE.ilow ) THEN
7812 IF( mblkd.EQ.1 )
7813 $ mbloc = lmbloc
7814 CALL pb_claset( uplo, mbloc, inbloc, lcmt, alpha, beta,
7815 $ a( ioffd+1+joffa*lda ), lda )
7816 lcmt00 = lcmt
7817 lcmt = lcmt - pmb
7818 mblks = mblkd
7819 mblkd = mblkd - 1
7820 ioffa = ioffd
7821 ioffd = ioffd + mbloc
7822 GO TO 20
7823 END IF
7824
7825 tmp1 = m1 - ioffd + iia - 1
7826 IF( lower .AND. tmp1.GT.0 )
7827 $
CALL pb_claset(
'ALL', tmp1, inbloc, 0, alpha, alpha,
7828 $ a( ioffd+1+joffa*lda ), lda )
7829
7830 tmp1 = ioffa - iia + 1
7831 m1 = m1 - tmp1
7832 n1 = n1 - inbloc
7833 lcmt00 = lcmt00 + low - ilow + qnb
7834 nblks = nblks - 1
7835 joffa = joffa + inbloc
7836
7837 IF( upper .AND. tmp1.GT.0 .AND. n1.GT.0 )
7838 $
CALL pb_claset(
'ALL', tmp1, n1, 0, alpha, alpha,
7839 $ a( iia+joffa*lda ), lda )
7840
7841 iia = ioffa + 1
7842 jja = joffa + 1
7843
7844 ELSE IF( goleft ) THEN
7845
7846 lcmt00 = lcmt00 + low - ilow + qnb
7847 nblks = nblks - 1
7848 joffa = joffa + inbloc
7849
7850 30 CONTINUE
7851 IF( nblks.GT.0 .AND. lcmt00.LT.low ) THEN
7852 lcmt00 = lcmt00 + qnb
7853 nblks = nblks - 1
7854 joffa = joffa + nb
7855 GO TO 30
7856 END IF
7857
7858 tmp1 =
min( joffa, jjmax ) - jja + 1
7859 IF( lower .AND. tmp1.GT.0 ) THEN
7860 CALL pb_claset(
'All', m1, tmp1, 0, alpha, alpha,
7861 $ a( iia+(jja-1)*lda ), lda )
7862 jja = jja + tmp1
7863 n1 = n1 - tmp1
7864 END IF
7865
7866 IF( nblks.LE.0 )
7867 $ RETURN
7868
7869 lcmt = lcmt00
7870 nblkd = nblks
7871 joffd = joffa
7872
7873 nbloc = nb
7874 40 CONTINUE
7875 IF( nblkd.GT.0 .AND. lcmt.LE.iupp ) THEN
7876 IF( nblkd.EQ.1 )
7877 $ nbloc = lnbloc
7878 CALL pb_claset( uplo, imbloc, nbloc, lcmt, alpha, beta,
7879 $ a( iia+joffd*lda ), lda )
7880 lcmt00 = lcmt
7881 lcmt = lcmt + qnb
7882 nblks = nblkd
7883 nblkd = nblkd - 1
7884 joffa = joffd
7885 joffd = joffd + nbloc
7886 GO TO 40
7887 END IF
7888
7889 tmp1 = n1 - joffd + jja - 1
7890 IF( upper .AND. tmp1.GT.0 )
7891 $
CALL pb_claset(
'All', imbloc, tmp1, 0, alpha, alpha,
7892 $ a( iia+joffd*lda ), lda )
7893
7894 tmp1 = joffa - jja + 1
7895 m1 = m1 - imbloc
7896 n1 = n1 - tmp1
7897 lcmt00 = lcmt00 - ( iupp - upp + pmb )
7898 mblks = mblks - 1
7899 ioffa = ioffa + imbloc
7900
7901 IF( lower .AND. m1.GT.0 .AND. tmp1.GT.0 )
7902 $
CALL pb_claset(
'All', m1, tmp1, 0, alpha, alpha,
7903 $ a( ioffa+1+(jja-1)*lda ), lda )
7904
7905 iia = ioffa + 1
7906 jja = joffa + 1
7907
7908 END IF
7909
7910 nbloc = nb
7911 50 CONTINUE
7912 IF( nblks.GT.0 ) THEN
7913 IF( nblks.EQ.1 )
7914 $ nbloc = lnbloc
7915 60 CONTINUE
7916 IF( mblks.GT.0 .AND. lcmt00.GT.upp ) THEN
7917 lcmt00 = lcmt00 - pmb
7918 mblks = mblks - 1
7919 ioffa = ioffa + mb
7920 GO TO 60
7921 END IF
7922
7923 tmp1 =
min( ioffa, iimax ) - iia + 1
7924 IF( upper .AND. tmp1.GT.0 ) THEN
7925 CALL pb_claset(
'All', tmp1, n1, 0, alpha, alpha,
7926 $ a( iia+joffa*lda ), lda )
7927 iia = iia + tmp1
7928 m1 = m1 - tmp1
7929 END IF
7930
7931 IF( mblks.LE.0 )
7932 $ RETURN
7933
7934 lcmt = lcmt00
7935 mblkd = mblks
7936 ioffd = ioffa
7937
7938 mbloc = mb
7939 70 CONTINUE
7940 IF( mblkd.GT.0 .AND. lcmt.GE.low ) THEN
7941 IF( mblkd.EQ.1 )
7942 $ mbloc = lmbloc
7943 CALL pb_claset( uplo, mbloc, nbloc, lcmt, alpha, beta,
7944 $ a( ioffd+1+joffa*lda ), lda )
7945 lcmt00 = lcmt
7946 lcmt = lcmt - pmb
7947 mblks = mblkd
7948 mblkd = mblkd - 1
7949 ioffa = ioffd
7950 ioffd = ioffd + mbloc
7951 GO TO 70
7952 END IF
7953
7954 tmp1 = m1 - ioffd + iia - 1
7955 IF( lower .AND. tmp1.GT.0 )
7956 $
CALL pb_claset(
'All', tmp1, nbloc, 0, alpha, alpha,
7957 $ a( ioffd+1+joffa*lda ), lda )
7958
7959 tmp1 =
min( ioffa, iimax ) - iia + 1
7960 m1 = m1 - tmp1
7961 n1 = n1 - nbloc
7962 lcmt00 = lcmt00 + qnb
7963 nblks = nblks - 1
7964 joffa = joffa + nbloc
7965
7966 IF( upper .AND. tmp1.GT.0 .AND. n1.GT.0 )
7967 $
CALL pb_claset(
'All', tmp1, n1, 0, alpha, alpha,
7968 $ a( iia+joffa*lda ), lda )
7969
7970 iia = ioffa + 1
7971 jja = joffa + 1
7972
7973 GO TO 50
7974
7975 END IF
7976
7977 RETURN
7978
7979
7980
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_claset(uplo, m, n, ioffd, alpha, beta, a, lda)