3633
 3634
 3635
 3636
 3637
 3638
 3639
 3640      INTEGER            IA, INFO, JA, M, N
 3641
 3642
 3643      INTEGER            DESCA( * )
 3644      COMPLEX            A( * ), PA( * )
 3645
 3646
 3647
 3648
 3649
 3650
 3651
 3652
 3653
 3654
 3655
 3656
 3657
 3658
 3659
 3660
 3661
 3662
 3663
 3664
 3665
 3666
 3667
 3668
 3669
 3670
 3671
 3672
 3673
 3674
 3675
 3676
 3677
 3678
 3679
 3680
 3681
 3682
 3683
 3684
 3685
 3686
 3687
 3688
 3689
 3690
 3691
 3692
 3693
 3694
 3695
 3696
 3697
 3698
 3699
 3700
 3701
 3702
 3703
 3704
 3705
 3706
 3707
 3708
 3709
 3710
 3711
 3712
 3713
 3714
 3715
 3716
 3717
 3718
 3719
 3720
 3721
 3722
 3723
 3724
 3725
 3726
 3727
 3728
 3729
 3730
 3731
 3732
 3733
 3734
 3735
 3736
 3737
 3738
 3739
 3740
 3741
 3742
 3743
 3744
 3745
 3746
 3747
 3748
 3749
 3750
 3751
 3752
 3753
 3754
 3755
 3756
 3757
 3758
 3759
 3760
 3761
 3762
 3763      INTEGER            BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
 3764     $                   DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
 3765     $                   RSRC_
 3766      parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
 3767     $                   dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
 3768     $                   imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
 3769     $                   rsrc_ = 9, csrc_ = 10, lld_ = 11 )
 3770      REAL               ZERO
 3771      parameter( zero = 0.0e+0 )
 3772
 3773
 3774      LOGICAL            COLREP, ROWREP
 3775      INTEGER            I, IB, ICTXT, ICURCOL, II, IMBA, J, JB, JJ, KK,
 3776     $                   LDA, LDPA, LL, MPALL, MYCOL, MYROW, MYROWDIST,
 3777     $                   NPCOL, NPROW
 3778      REAL               EPS, ERR, ERRMAX
 3779
 3780
 3781      EXTERNAL           blacs_gridinfo, 
pcerrset, sgamx2d
 
 3782
 3783
 3784      INTEGER            PB_NUMROC
 3785      REAL               PSLAMCH
 3787
 3788
 3790
 3791
 3792
 3793      info = 0
 3794      errmax = zero
 3795
 3796
 3797
 3798      IF( ( desca( m_ ).LE.0 ).OR.( desca( n_ ).LE.0 ) )
 3799     $   RETURN
 3800
 3801
 3802
 3803      ictxt = desca( ctxt_ )
 3804      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
 3805
 3807
 3808      mpall = 
pb_numroc( desca( m_ ), 1, desca( imb_ ), desca( mb_ ),
 
 3809     $                   myrow, desca( rsrc_ ), nprow )
 3810
 3811      lda    = desca( m_ )
 3812      ldpa   = desca( lld_ )
 3813
 3814      ii = 1
 3815      jj = 1
 3816      rowrep  = ( desca( rsrc_ ).EQ.-1 )
 3817      colrep  = ( desca( csrc_ ).EQ.-1 )
 3818      icurcol = desca( csrc_ )
 3819      IF( myrow.EQ.desca( rsrc_ ) .OR. rowrep ) THEN
 3820         imba = desca( imb_ )
 3821      ELSE
 3822         imba = desca( mb_ )
 3823      END IF
 3824      IF( rowrep ) THEN
 3825         myrowdist = 0
 3826      ELSE
 3827         myrowdist = mod( myrow - desca( rsrc_ ) + nprow, nprow )
 3828      END IF
 3829
 3830      IF( mycol.EQ.icurcol .OR. colrep ) THEN
 3831
 3832         j = 1
 3833         IF( myrowdist.EQ.0 ) THEN
 3834            i = 1
 3835         ELSE
 3836            i = desca( imb_ ) + ( myrowdist - 1 ) * desca( mb_ ) + 1
 3837         END IF
 3838         ib = 
min( 
max( 0, desca( m_ ) - i + 1 ), imba )
 
 3839         jb = 
min( desca( n_ ), desca( inb_ ) )
 
 3840
 3841         DO 20 kk = 0, jb-1
 3842            DO 10 ll = 0, ib-1
 3843               IF( i+ll.LT.ia .OR. i+ll.GT.ia+m-1 .OR.
 3844     $             j+kk.LT.ja .OR. j+kk.GT.ja+n-1 )
 3845     $            
CALL pcerrset( err, errmax, a( i+ll+(j+kk-1)*lda ),
 
 3846     $                           pa( ii+ll+(jj+kk-1)*ldpa ) )
 3847   10       CONTINUE
 3848   20    CONTINUE
 3849         IF( rowrep ) THEN
 3850            i = i + imba
 3851         ELSE
 3852            i = i + imba + ( nprow - 1 ) * desca( mb_ )
 3853         END IF
 3854
 3855         DO 50 ii = imba + 1, mpall, desca( mb_ )
 3856            ib = 
min( mpall-ii+1, desca( mb_ ) )
 
 3857
 3858            DO 40 kk = 0, jb-1
 3859               DO 30 ll = 0, ib-1
 3860                  IF( i+ll.LT.ia .OR. i+ll.GT.ia+m-1 .OR.
 3861     $                j+kk.LT.ja .OR. j+kk.GT.ja+n-1 )
 3863     $                              a( i+ll+(j+kk-1)*lda ),
 3864     $                              pa( ii+ll+(jj+kk-1)*ldpa ) )
 3865   30          CONTINUE
 3866   40       CONTINUE
 3867
 3868            IF( rowrep ) THEN
 3869               i = i + desca( mb_ )
 3870            ELSE
 3871               i = i + nprow * desca( mb_ )
 3872            END IF
 3873
 3874   50    CONTINUE
 3875
 3876         jj = jj + jb
 3877
 3878      END IF
 3879
 3880      icurcol = mod( icurcol + 1, npcol )
 3881
 3882      DO 110 j = desca( inb_ ) + 1, desca( n_ ), desca( nb_ )
 3883         jb = 
min( desca( n_ ) - j + 1, desca( nb_ ) )
 
 3884
 3885         IF( mycol.EQ.icurcol .OR. colrep ) THEN
 3886
 3887            IF( myrowdist.EQ.0 ) THEN
 3888               i = 1
 3889            ELSE
 3890               i = desca( imb_ ) + ( myrowdist - 1 ) * desca( mb_ ) + 1
 3891            END IF
 3892
 3893            ii = 1
 3894            ib = 
min( 
max( 0, desca( m_ ) - i + 1 ), imba )
 
 3895            DO 70 kk = 0, jb-1
 3896               DO 60 ll = 0, ib-1
 3897                  IF( i+ll.LT.ia .OR. i+ll.GT.ia+m-1 .OR.
 3898     $                j+kk.LT.ja .OR. j+kk.GT.ja+n-1 )
 3900     $                              a( i+ll+(j+kk-1)*lda ),
 3901     $                              pa( ii+ll+(jj+kk-1)*ldpa ) )
 3902   60          CONTINUE
 3903   70       CONTINUE
 3904            IF( rowrep ) THEN
 3905               i = i + imba
 3906            ELSE
 3907               i = i + imba + ( nprow - 1 ) * desca( mb_ )
 3908            END IF
 3909
 3910            DO 100 ii = imba+1, mpall, desca( mb_ )
 3911               ib = 
min( mpall-ii+1, desca( mb_ ) )
 
 3912
 3913               DO 90 kk = 0, jb-1
 3914                  DO 80 ll = 0, ib-1
 3915                     IF( i+ll.LT.ia .OR. i+ll.GT.ia+m-1 .OR.
 3916     $                   j+kk.LT.ja .OR. j+kk.GT.ja+n-1 )
 3918     $                                 a( i+ll+(j+kk-1)*lda ),
 3919     $                                 pa( ii+ll+(jj+kk-1)*ldpa ) )
 3920   80             CONTINUE
 3921   90          CONTINUE
 3922
 3923               IF( rowrep ) THEN
 3924                  i = i + desca( mb_ )
 3925               ELSE
 3926                  i = i + nprow * desca( mb_ )
 3927               END IF
 3928
 3929  100       CONTINUE
 3930
 3931            jj = jj + jb
 3932
 3933         END IF
 3934
 3935         icurcol = mod( icurcol + 1, npcol )
 3936
 3937  110 CONTINUE
 3938
 3939      CALL sgamx2d( ictxt, 'All', ' ', 1, 1, errmax, 1, kk, ll, -1,
 3940     $              -1, -1 )
 3941
 3942      IF( errmax.GT.zero .AND. errmax.LE.eps ) THEN
 3943         info = 1
 3944      ELSE IF( errmax.GT.eps ) THEN
 3945         info = -1
 3946      END IF
 3947
 3948      RETURN
 3949
 3950
 3951
integer function pb_numroc(n, i, inb, nb, proc, srcproc, nprocs)
 
subroutine pcerrset(err, errmax, xtrue, x)
 
real function pslamch(ictxt, cmach)