3627
 3628
 3629
 3630
 3631
 3632
 3633
 3634      INTEGER            IA, INFO, JA, M, N
 3635
 3636
 3637      INTEGER            DESCA( * )
 3638      REAL               A( * ), PA( * )
 3639
 3640
 3641
 3642
 3643
 3644
 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      INTEGER            BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
 3758     $                   DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
 3759     $                   RSRC_
 3760      parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
 3761     $                   dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
 3762     $                   imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
 3763     $                   rsrc_ = 9, csrc_ = 10, lld_ = 11 )
 3764      REAL               ZERO
 3765      parameter( zero = 0.0e+0 )
 3766
 3767
 3768      LOGICAL            COLREP, ROWREP
 3769      INTEGER            I, IB, ICTXT, ICURCOL, II, IMBA, J, JB, JJ, KK,
 3770     $                   LDA, LDPA, LL, MPALL, MYCOL, MYROW, MYROWDIST,
 3771     $                   NPCOL, NPROW
 3772      REAL               EPS, ERR, ERRMAX
 3773
 3774
 3775      EXTERNAL           blacs_gridinfo, 
pserrset, sgamx2d
 
 3776
 3777
 3778      INTEGER            PB_NUMROC
 3779      REAL               PSLAMCH
 3781
 3782
 3784
 3785
 3786
 3787      info = 0
 3788      errmax = zero
 3789
 3790
 3791
 3792      IF( ( desca( m_ ).LE.0 ).OR.( desca( n_ ).LE.0 ) )
 3793     $   RETURN
 3794
 3795
 3796
 3797      ictxt = desca( ctxt_ )
 3798      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
 3799
 3801
 3802      mpall = 
pb_numroc( desca( m_ ), 1, desca( imb_ ), desca( mb_ ),
 
 3803     $                   myrow, desca( rsrc_ ), nprow )
 3804
 3805      lda    = desca( m_ )
 3806      ldpa   = desca( lld_ )
 3807
 3808      ii = 1
 3809      jj = 1
 3810      rowrep  = ( desca( rsrc_ ).EQ.-1 )
 3811      colrep  = ( desca( csrc_ ).EQ.-1 )
 3812      icurcol = desca( csrc_ )
 3813      IF( myrow.EQ.desca( rsrc_ ) .OR. rowrep ) THEN
 3814         imba = desca( imb_ )
 3815      ELSE
 3816         imba = desca( mb_ )
 3817      END IF
 3818      IF( rowrep ) THEN
 3819         myrowdist = 0
 3820      ELSE
 3821         myrowdist = mod( myrow - desca( rsrc_ ) + nprow, nprow )
 3822      END IF
 3823
 3824      IF( mycol.EQ.icurcol .OR. colrep ) THEN
 3825
 3826         j = 1
 3827         IF( myrowdist.EQ.0 ) THEN
 3828            i = 1
 3829         ELSE
 3830            i = desca( imb_ ) + ( myrowdist - 1 ) * desca( mb_ ) + 1
 3831         END IF
 3832         ib = 
min( 
max( 0, desca( m_ ) - i + 1 ), imba )
 
 3833         jb = 
min( desca( n_ ), desca( inb_ ) )
 
 3834
 3835         DO 20 kk = 0, jb-1
 3836            DO 10 ll = 0, ib-1
 3837               IF( i+ll.LT.ia .OR. i+ll.GT.ia+m-1 .OR.
 3838     $             j+kk.LT.ja .OR. j+kk.GT.ja+n-1 )
 3839     $            
CALL pserrset( err, errmax, a( i+ll+(j+kk-1)*lda ),
 
 3840     $                           pa( ii+ll+(jj+kk-1)*ldpa ) )
 3841   10       CONTINUE
 3842   20    CONTINUE
 3843         IF( rowrep ) THEN
 3844            i = i + imba
 3845         ELSE
 3846            i = i + imba + ( nprow - 1 ) * desca( mb_ )
 3847         END IF
 3848
 3849         DO 50 ii = imba + 1, mpall, desca( mb_ )
 3850            ib = 
min( mpall-ii+1, desca( mb_ ) )
 
 3851
 3852            DO 40 kk = 0, jb-1
 3853               DO 30 ll = 0, ib-1
 3854                  IF( i+ll.LT.ia .OR. i+ll.GT.ia+m-1 .OR.
 3855     $                j+kk.LT.ja .OR. j+kk.GT.ja+n-1 )
 3857     $                              a( i+ll+(j+kk-1)*lda ),
 3858     $                              pa( ii+ll+(jj+kk-1)*ldpa ) )
 3859   30          CONTINUE
 3860   40       CONTINUE
 3861
 3862            IF( rowrep ) THEN
 3863               i = i + desca( mb_ )
 3864            ELSE
 3865               i = i + nprow * desca( mb_ )
 3866            END IF
 3867
 3868   50    CONTINUE
 3869
 3870         jj = jj + jb
 3871
 3872      END IF
 3873
 3874      icurcol = mod( icurcol + 1, npcol )
 3875
 3876      DO 110 j = desca( inb_ ) + 1, desca( n_ ), desca( nb_ )
 3877         jb = 
min( desca( n_ ) - j + 1, desca( nb_ ) )
 
 3878
 3879         IF( mycol.EQ.icurcol .OR. colrep ) THEN
 3880
 3881            IF( myrowdist.EQ.0 ) THEN
 3882               i = 1
 3883            ELSE
 3884               i = desca( imb_ ) + ( myrowdist - 1 ) * desca( mb_ ) + 1
 3885            END IF
 3886
 3887            ii = 1
 3888            ib = 
min( 
max( 0, desca( m_ ) - i + 1 ), imba )
 
 3889            DO 70 kk = 0, jb-1
 3890               DO 60 ll = 0, ib-1
 3891                  IF( i+ll.LT.ia .OR. i+ll.GT.ia+m-1 .OR.
 3892     $                j+kk.LT.ja .OR. j+kk.GT.ja+n-1 )
 3894     $                              a( i+ll+(j+kk-1)*lda ),
 3895     $                              pa( ii+ll+(jj+kk-1)*ldpa ) )
 3896   60          CONTINUE
 3897   70       CONTINUE
 3898            IF( rowrep ) THEN
 3899               i = i + imba
 3900            ELSE
 3901               i = i + imba + ( nprow - 1 ) * desca( mb_ )
 3902            END IF
 3903
 3904            DO 100 ii = imba+1, mpall, desca( mb_ )
 3905               ib = 
min( mpall-ii+1, desca( mb_ ) )
 
 3906
 3907               DO 90 kk = 0, jb-1
 3908                  DO 80 ll = 0, ib-1
 3909                     IF( i+ll.LT.ia .OR. i+ll.GT.ia+m-1 .OR.
 3910     $                   j+kk.LT.ja .OR. j+kk.GT.ja+n-1 )
 3912     $                                 a( i+ll+(j+kk-1)*lda ),
 3913     $                                 pa( ii+ll+(jj+kk-1)*ldpa ) )
 3914   80             CONTINUE
 3915   90          CONTINUE
 3916
 3917               IF( rowrep ) THEN
 3918                  i = i + desca( mb_ )
 3919               ELSE
 3920                  i = i + nprow * desca( mb_ )
 3921               END IF
 3922
 3923  100       CONTINUE
 3924
 3925            jj = jj + jb
 3926
 3927         END IF
 3928
 3929         icurcol = mod( icurcol + 1, npcol )
 3930
 3931  110 CONTINUE
 3932
 3933      CALL sgamx2d( ictxt, 'All', ' ', 1, 1, errmax, 1, kk, ll, -1,
 3934     $              -1, -1 )
 3935
 3936      IF( errmax.GT.zero .AND. errmax.LE.eps ) THEN
 3937         info = 1
 3938      ELSE IF( errmax.GT.eps ) THEN
 3939         info = -1
 3940      END IF
 3941
 3942      RETURN
 3943
 3944
 3945
integer function pb_numroc(n, i, inb, nb, proc, srcproc, nprocs)
 
real function pslamch(ictxt, cmach)
 
subroutine pserrset(err, errmax, xtrue, x)