6585
 6586
 6587
 6588
 6589
 6590
 6591
 6592      CHARACTER*1        TRANS, UPLO
 6593      INTEGER            IA, IC, INFO, JA, JC, M, N
 6594      DOUBLE PRECISION   ERR
 6595      COMPLEX*16         ALPHA, BETA
 6596
 6597
 6598      INTEGER            DESCA( * ), DESCC( * )
 6599      COMPLEX*16         A( * ), C( * ), PC( * )
 6600
 6601
 6602
 6603
 6604
 6605
 6606
 6607
 6608
 6609
 6610
 6611
 6612
 6613
 6614
 6615
 6616
 6617
 6618
 6619
 6620
 6621
 6622
 6623
 6624
 6625
 6626
 6627
 6628
 6629
 6630
 6631
 6632
 6633
 6634
 6635
 6636
 6637
 6638
 6639
 6640
 6641
 6642
 6643
 6644
 6645
 6646
 6647
 6648
 6649
 6650
 6651
 6652
 6653
 6654
 6655
 6656
 6657
 6658
 6659
 6660
 6661
 6662
 6663
 6664
 6665
 6666
 6667
 6668
 6669
 6670
 6671
 6672
 6673
 6674
 6675
 6676
 6677
 6678
 6679
 6680
 6681
 6682
 6683
 6684
 6685
 6686
 6687
 6688
 6689
 6690
 6691
 6692
 6693
 6694
 6695
 6696
 6697
 6698
 6699
 6700
 6701
 6702
 6703
 6704
 6705
 6706
 6707
 6708
 6709
 6710
 6711
 6712
 6713
 6714
 6715
 6716
 6717
 6718
 6719
 6720
 6721
 6722
 6723
 6724
 6725
 6726
 6727
 6728
 6729
 6730
 6731
 6732
 6733
 6734
 6735
 6736
 6737
 6738
 6739
 6740
 6741
 6742      INTEGER            BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
 6743     $                   DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
 6744     $                   RSRC_
 6745      parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
 6746     $                   dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
 6747     $                   imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
 6748     $                   rsrc_ = 9, csrc_ = 10, lld_ = 11 )
 6749      DOUBLE PRECISION   ZERO
 6750      parameter( zero = 0.0d+0 )
 6751
 6752
 6753      LOGICAL            COLREP, CTRAN, LOWER, NOTRAN, ROWREP, UPPER
 6754      INTEGER            I, ICCOL, ICROW, ICTXT, IIC, IOFFA, IOFFC, J,
 6755     $                   JJC, LDA, LDC, LDPC, MYCOL, MYROW, NPCOL,
 6756     $                   NPROW
 6757      DOUBLE PRECISION   ERR0, ERRI, PREC
 6758
 6759
 6760      EXTERNAL           blacs_gridinfo, dgamx2d, igsum2d, 
pb_infog2l,
 
 6762
 6763
 6764      LOGICAL            LSAME
 6765      DOUBLE PRECISION   PDLAMCH
 6767
 6768
 6769      INTRINSIC          abs, dconjg, 
max 
 6770
 6771
 6772
 6773      ictxt = descc( ctxt_ )
 6774      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
 6775
 6776      prec   = 
pdlamch( ictxt, 
'eps' )
 
 6777
 6778      upper  = 
lsame( uplo,  
'U' )
 
 6779      lower  = 
lsame( uplo,  
'L' )
 
 6780      notran = 
lsame( trans, 
'N' )
 
 6781      ctran  = 
lsame( trans, 
'C' )
 
 6782
 6783
 6784
 6785
 6786      info   = 0
 6787      err    = zero
 6788
 6789      lda    = 
max( 1, desca( m_   ) )
 
 6790      ldc    = 
max( 1, descc( m_   ) )
 
 6791      ldpc   = 
max( 1, descc( lld_ ) )
 
 6792      rowrep = ( descc( rsrc_ ).EQ.-1 )
 6793      colrep = ( descc( csrc_ ).EQ.-1 )
 6794
 6795      IF( notran ) THEN
 6796
 6797         DO 20 j = jc, jc + n - 1
 6798
 6799            ioffc = ic + ( j  - 1          ) * ldc
 6800            ioffa = ia + ( ja - 1 + j - jc ) * lda
 6801
 6802            DO 10 i = ic, ic + m - 1
 6803
 6804               IF( upper ) THEN
 6805                  IF( ( j - jc ).GE.( i - ic ) ) THEN
 6806                     CALL pzerraxpby( erri, alpha, a( ioffa ), beta,
 
 6807     $                                c( ioffc ), prec )
 6808                  ELSE
 6809                     erri = zero
 6810                  END IF
 6811               ELSE IF( lower ) THEN
 6812                  IF( ( j - jc ).LE.( i - ic ) ) THEN
 6813                     CALL pzerraxpby( erri, alpha, a( ioffa ), beta,
 
 6814     $                                c( ioffc ), prec )
 6815                  ELSE
 6816                     erri = zero
 6817                  END IF
 6818               ELSE
 6819                  CALL pzerraxpby( erri, alpha, a( ioffa ), beta,
 
 6820     $                             c( ioffc ), prec )
 6821               END IF
 6822
 6823               CALL pb_infog2l( i, j, descc, nprow, npcol, myrow, mycol,
 
 6824     $                          iic, jjc, icrow, iccol )
 6825               IF( ( myrow.EQ.icrow .OR. rowrep ) .AND.
 6826     $             ( mycol.EQ.iccol .OR. colrep ) ) THEN
 6827                  err0 = abs( pc( iic+(jjc-1)*ldpc )-c( ioffc ) )
 6828                  IF( err0.GT.erri )
 6829     $               info = 1
 6830                  err = 
max( err, err0 )
 
 6831               END IF
 6832
 6833               ioffa = ioffa + 1
 6834               ioffc = ioffc + 1
 6835
 6836   10       CONTINUE
 6837
 6838   20    CONTINUE
 6839
 6840      ELSE IF( ctran ) THEN
 6841
 6842         DO 40 j = jc, jc + n - 1
 6843
 6844            ioffc = ic +              ( j  - 1 ) * ldc
 6845            ioffa = ia + ( j - jc ) + ( ja - 1 ) * lda
 6846
 6847            DO 30 i = ic, ic + m - 1
 6848
 6849               IF( upper ) THEN
 6850                  IF( ( j - jc ).GE.( i - ic ) ) THEN
 6851                     CALL pzerraxpby( erri, alpha, dconjg( a( ioffa ) ),
 
 6852     $                                beta, c( ioffc ), prec )
 6853                  ELSE
 6854                     erri = zero
 6855                  END IF
 6856               ELSE IF( lower ) THEN
 6857                  IF( ( j - jc ).LE.( i - ic ) ) THEN
 6858                     CALL pzerraxpby( erri, alpha, dconjg( a( ioffa ) ),
 
 6859     $                                beta, c( ioffc ), prec )
 6860                  ELSE
 6861                     erri = zero
 6862                  END IF
 6863               ELSE
 6864                  CALL pzerraxpby( erri, alpha, dconjg( a( ioffa ) ),
 
 6865     $                             beta, c( ioffc ), prec )
 6866               END IF
 6867
 6868               CALL pb_infog2l( i, j, descc, nprow, npcol, myrow, mycol,
 
 6869     $                          iic, jjc, icrow, iccol )
 6870               IF( ( myrow.EQ.icrow .OR. rowrep ) .AND.
 6871     $             ( mycol.EQ.iccol .OR. colrep ) ) THEN
 6872                  err0 = abs( pc( iic+(jjc-1)*ldpc )-c( ioffc ) )
 6873                  IF( err0.GT.erri )
 6874     $               info = 1
 6875                  err = 
max( err, err0 )
 
 6876               END IF
 6877
 6878               ioffc = ioffc + 1
 6879               ioffa = ioffa + lda
 6880
 6881   30       CONTINUE
 6882
 6883   40    CONTINUE
 6884
 6885      ELSE
 6886
 6887         DO 60 j = jc, jc + n - 1
 6888
 6889            ioffc = ic +              ( j  - 1 ) * ldc
 6890            ioffa = ia + ( j - jc ) + ( ja - 1 ) * lda
 6891
 6892            DO 50 i = ic, ic + m - 1
 6893
 6894               IF( upper ) THEN
 6895                  IF( ( j - jc ).GE.( i - ic ) ) THEN
 6896                     CALL pzerraxpby( erri, alpha, a( ioffa ), beta,
 
 6897     $                                c( ioffc ), prec )
 6898                  ELSE
 6899                     erri = zero
 6900                  END IF
 6901               ELSE IF( lower ) THEN
 6902                  IF( ( j - jc ).LE.( i - ic ) ) THEN
 6903                     CALL pzerraxpby( erri, alpha, a( ioffa ), beta,
 
 6904     $                                c( ioffc ), prec )
 6905                  ELSE
 6906                     erri = zero
 6907                  END IF
 6908               ELSE
 6909                  CALL pzerraxpby( erri, alpha, a( ioffa ), beta,
 
 6910     $                             c( ioffc ), prec )
 6911               END IF
 6912
 6913               CALL pb_infog2l( i, j, descc, nprow, npcol, myrow, mycol,
 
 6914     $                          iic, jjc, icrow, iccol )
 6915               IF( ( myrow.EQ.icrow .OR. rowrep ) .AND.
 6916     $             ( mycol.EQ.iccol .OR. colrep ) ) THEN
 6917                  err0 = abs( pc( iic+(jjc-1)*ldpc )-c( ioffc ) )
 6918                  IF( err0.GT.erri )
 6919     $               info = 1
 6920                  err = 
max( err, err0 )
 
 6921               END IF
 6922
 6923               ioffc = ioffc + 1
 6924               ioffa = ioffa + lda
 6925
 6926   50       CONTINUE
 6927
 6928   60    CONTINUE
 6929
 6930      END IF
 6931
 6932
 6933
 6934      CALL igsum2d( ictxt, 'All', ' ', 1, 1, info, 1, -1, mycol )
 6935      CALL dgamx2d( ictxt, 'All', ' ', 1, 1, err, 1, i, j, -1, -1,
 6936     $              mycol )
 6937
 6938      RETURN
 6939
 6940
 6941
subroutine pb_infog2l(i, j, desc, nprow, npcol, myrow, mycol, ii, jj, prow, pcol)
 
double precision function pdlamch(ictxt, cmach)
 
subroutine pzerraxpby(errbnd, alpha, x, beta, y, prec)