6584
6585
6586
6587
6588
6589
6590
6591 CHARACTER*1 TRANS, UPLO
6592 INTEGER IA, IC, INFO, JA, JC, M, N
6593 REAL ERR
6594 COMPLEX ALPHA, BETA
6595
6596
6597 INTEGER DESCA( * ), DESCC( * )
6598 COMPLEX A( * ), C( * ), PC( * )
6599
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 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
6742 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
6743 $ RSRC_
6744 parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
6745 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
6746 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
6747 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
6748 REAL ZERO
6749 parameter( zero = 0.0e+0 )
6750
6751
6752 LOGICAL COLREP, CTRAN, LOWER, NOTRAN, ROWREP, UPPER
6753 INTEGER I, ICCOL, ICROW, ICTXT, IIC, IOFFA, IOFFC, J,
6754 $ JJC, LDA, LDC, LDPC, MYCOL, MYROW, NPCOL,
6755 $ NPROW
6756 REAL ERR0, ERRI, PREC
6757
6758
6759 EXTERNAL blacs_gridinfo, igsum2d,
pb_infog2l,
6761
6762
6763 LOGICAL LSAME
6764 REAL PSLAMCH
6766
6767
6768 INTRINSIC abs, conjg,
max
6769
6770
6771
6772 ictxt = descc( ctxt_ )
6773 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
6774
6775 prec =
pslamch( ictxt,
'eps' )
6776
6777 upper =
lsame( uplo,
'U' )
6778 lower =
lsame( uplo,
'L' )
6779 notran =
lsame( trans,
'N' )
6780 ctran =
lsame( trans,
'C' )
6781
6782
6783
6784
6785 info = 0
6786 err = zero
6787
6788 lda =
max( 1, desca( m_ ) )
6789 ldc =
max( 1, descc( m_ ) )
6790 ldpc =
max( 1, descc( lld_ ) )
6791 rowrep = ( descc( rsrc_ ).EQ.-1 )
6792 colrep = ( descc( csrc_ ).EQ.-1 )
6793
6794 IF( notran ) THEN
6795
6796 DO 20 j = jc, jc + n - 1
6797
6798 ioffc = ic + ( j - 1 ) * ldc
6799 ioffa = ia + ( ja - 1 + j - jc ) * lda
6800
6801 DO 10 i = ic, ic + m - 1
6802
6803 IF( upper ) THEN
6804 IF( ( j - jc ).GE.( i - ic ) ) THEN
6805 CALL pcerraxpby( erri, alpha, a( ioffa ), beta,
6806 $ c( ioffc ), prec )
6807 ELSE
6808 erri = zero
6809 END IF
6810 ELSE IF( lower ) THEN
6811 IF( ( j - jc ).LE.( i - ic ) ) THEN
6812 CALL pcerraxpby( erri, alpha, a( ioffa ), beta,
6813 $ c( ioffc ), prec )
6814 ELSE
6815 erri = zero
6816 END IF
6817 ELSE
6818 CALL pcerraxpby( erri, alpha, a( ioffa ), beta,
6819 $ c( ioffc ), prec )
6820 END IF
6821
6822 CALL pb_infog2l( i, j, descc, nprow, npcol, myrow, mycol,
6823 $ iic, jjc, icrow, iccol )
6824 IF( ( myrow.EQ.icrow .OR. rowrep ) .AND.
6825 $ ( mycol.EQ.iccol .OR. colrep ) ) THEN
6826 err0 = abs( pc( iic+(jjc-1)*ldpc )-c( ioffc ) )
6827 IF( err0.GT.erri )
6828 $ info = 1
6829 err =
max( err, err0 )
6830 END IF
6831
6832 ioffa = ioffa + 1
6833 ioffc = ioffc + 1
6834
6835 10 CONTINUE
6836
6837 20 CONTINUE
6838
6839 ELSE IF( ctran ) THEN
6840
6841 DO 40 j = jc, jc + n - 1
6842
6843 ioffc = ic + ( j - 1 ) * ldc
6844 ioffa = ia + ( j - jc ) + ( ja - 1 ) * lda
6845
6846 DO 30 i = ic, ic + m - 1
6847
6848 IF( upper ) THEN
6849 IF( ( j - jc ).GE.( i - ic ) ) THEN
6850 CALL pcerraxpby( erri, alpha, conjg( a( ioffa ) ),
6851 $ beta, c( ioffc ), prec )
6852 ELSE
6853 erri = zero
6854 END IF
6855 ELSE IF( lower ) THEN
6856 IF( ( j - jc ).LE.( i - ic ) ) THEN
6857 CALL pcerraxpby( erri, alpha, conjg( a( ioffa ) ),
6858 $ beta, c( ioffc ), prec )
6859 ELSE
6860 erri = zero
6861 END IF
6862 ELSE
6863 CALL pcerraxpby( erri, alpha, conjg( a( ioffa ) ),
6864 $ beta, c( ioffc ), prec )
6865 END IF
6866
6867 CALL pb_infog2l( i, j, descc, nprow, npcol, myrow, mycol,
6868 $ iic, jjc, icrow, iccol )
6869 IF( ( myrow.EQ.icrow .OR. rowrep ) .AND.
6870 $ ( mycol.EQ.iccol .OR. colrep ) ) THEN
6871 err0 = abs( pc( iic+(jjc-1)*ldpc )-c( ioffc ) )
6872 IF( err0.GT.erri )
6873 $ info = 1
6874 err =
max( err, err0 )
6875 END IF
6876
6877 ioffc = ioffc + 1
6878 ioffa = ioffa + lda
6879
6880 30 CONTINUE
6881
6882 40 CONTINUE
6883
6884 ELSE
6885
6886 DO 60 j = jc, jc + n - 1
6887
6888 ioffc = ic + ( j - 1 ) * ldc
6889 ioffa = ia + ( j - jc ) + ( ja - 1 ) * lda
6890
6891 DO 50 i = ic, ic + m - 1
6892
6893 IF( upper ) THEN
6894 IF( ( j - jc ).GE.( i - ic ) ) THEN
6895 CALL pcerraxpby( erri, alpha, a( ioffa ), beta,
6896 $ c( ioffc ), prec )
6897 ELSE
6898 erri = zero
6899 END IF
6900 ELSE IF( lower ) THEN
6901 IF( ( j - jc ).LE.( i - ic ) ) THEN
6902 CALL pcerraxpby( erri, alpha, a( ioffa ), beta,
6903 $ c( ioffc ), prec )
6904 ELSE
6905 erri = zero
6906 END IF
6907 ELSE
6908 CALL pcerraxpby( erri, alpha, a( ioffa ), beta,
6909 $ c( ioffc ), prec )
6910 END IF
6911
6912 CALL pb_infog2l( i, j, descc, nprow, npcol, myrow, mycol,
6913 $ iic, jjc, icrow, iccol )
6914 IF( ( myrow.EQ.icrow .OR. rowrep ) .AND.
6915 $ ( mycol.EQ.iccol .OR. colrep ) ) THEN
6916 err0 = abs( pc( iic+(jjc-1)*ldpc )-c( ioffc ) )
6917 IF( err0.GT.erri )
6918 $ info = 1
6919 err =
max( err, err0 )
6920 END IF
6921
6922 ioffc = ioffc + 1
6923 ioffa = ioffa + lda
6924
6925 50 CONTINUE
6926
6927 60 CONTINUE
6928
6929 END IF
6930
6931
6932
6933 CALL igsum2d( ictxt, 'All', ' ', 1, 1, info, 1, -1, mycol )
6934 CALL sgamx2d( ictxt, 'All', ' ', 1, 1, err, 1, i, j, -1, -1,
6935 $ mycol )
6936
6937 RETURN
6938
6939
6940
subroutine pb_infog2l(i, j, desc, nprow, npcol, myrow, mycol, ii, jj, prow, pcol)
subroutine pcerraxpby(errbnd, alpha, x, beta, y, prec)
real function pslamch(ictxt, cmach)