16685
16686
16687 CHARACTER*1 SCOPE
16688 INTEGER ICTXT, M, N, LDA, LDI, TESTNUM, MAXERR, NERR
16689
16690
16691 INTEGER RA(*), CA(*), ERRIBUF(6, MAXERR), ISEED(*)
16692 DOUBLE PRECISION A(LDA,*), ERRDBUF(2, MAXERR), VALS(*)
16693
16694
16695 INTEGER IBTMYPROC, IBTNPROCS, IBTSPNUM
16696 DOUBLE PRECISION DBTEPS, DBTABS
16697 DOUBLE PRECISION DBTRAN
16699
16700
16702
16703
16704 LOGICAL ERROR
16705 INTEGER NPROCS, NNODES, NPROW, NPCOL, MYROW, MYCOL, RAMX, CAMX
16706 INTEGER IAMX, I, J, K, H, DEST, NODE
16707 DOUBLE PRECISION EPS
16708
16709
16710
16713 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
16714 dest = myrow*nprocs + mycol
16715
16716
16717
16718 IF( scope .EQ. 'R' ) THEN
16719 nnodes = npcol
16720 DO 10 i = 0, nnodes-1
16721 node = myrow * nprocs + i
16722 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
16723 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
16724 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
16725 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
16726 10 CONTINUE
16727 ELSE IF( scope .EQ. 'C' ) THEN
16728 nnodes = nprow
16729 DO 20 i = 0, nnodes-1
16730 node = i * nprocs + mycol
16731 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
16732 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
16733 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
16734 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
16735 20 CONTINUE
16736 ELSE
16737 nnodes = nprow * npcol
16738 DO 30 i = 0, nnodes-1
16739 node = (i / npcol) * nprocs + mod(i, npcol)
16740 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
16741 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
16742 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
16743 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
16744 30 CONTINUE
16745 END IF
16746
16747 DO 100 j = 1, n
16748 DO 90 i = 1, m
16749 h = (j-1)*ldi + i
16750 vals(1) =
dbtran( iseed )
16751 iamx = 1
16752 IF( nnodes .GT. 1 ) THEN
16753 DO 40 k = 1, nnodes-1
16754 vals(k+1) =
dbtran( iseed(k*4+1) )
16756 $ iamx = k + 1
16757 40 CONTINUE
16758 END IF
16759
16760
16761
16762 IF( a(i,j) .NE. vals(iamx) ) THEN
16763
16764
16765
16766 IF( ldi .NE. -1 ) THEN
16767
16768
16769
16770 k =
ibtspnum( scope, ra(h), ca(h), npcol ) + 1
16771 IF( k.GT.0 .AND. k.LE.nnodes ) THEN
16773 IF( .NOT.error ) iamx = k
16774 ELSE
16775 error = .true.
16776 END IF
16777 ELSE
16778
16779
16780
16781
16782 error = (
dbtabs( a(i,j) ) .NE.
dbtabs( vals(iamx) ) )
16783 IF( .NOT.error ) THEN
16784 DO 50 k = 1, nnodes
16785 IF( vals(k) .EQ. a(i,j) ) GOTO 60
16786 50 CONTINUE
16787 error = .true.
16788 60 CONTINUE
16789 ENDIF
16790 END IF
16791
16792
16793
16794 IF( error ) THEN
16795 nerr = nerr + 1
16796 erribuf(1, nerr) = testnum
16797 erribuf(2, nerr) = nnodes
16798 erribuf(3, nerr) = dest
16799 erribuf(4, nerr) = i
16800 erribuf(5, nerr) = j
16801 erribuf(6, nerr) = 5
16802 errdbuf(1, nerr) = a(i,j)
16803 errdbuf(2, nerr) = vals(iamx)
16804 END IF
16805 END IF
16806
16807
16808
16809 IF( ldi .NE. -1 ) THEN
16810 k =
ibtspnum( scope, ra(h), ca(h), npcol ) + 1
16811 IF( k.NE.iamx ) THEN
16812
16813
16814
16815
16816
16817 IF( k.GT.nnodes .OR. k.LT.1 ) THEN
16818 error = .true.
16819 ELSE
16820 error = ( vals(k) .NE. vals(iamx) )
16821 END IF
16822 IF( error ) THEN
16823 CALL ibtspcoord( scope, iamx-1, myrow, mycol,
16824 $ npcol, ramx, camx )
16825 IF( ramx .NE. ra(h) ) THEN
16826 nerr = nerr + 1
16827 erribuf(1, nerr) = testnum
16828 erribuf(2, nerr) = nnodes
16829 erribuf(3, nerr) = dest
16830 erribuf(4, nerr) = i
16831 erribuf(5, nerr) = j
16832 erribuf(6, nerr) = -5
16833 errdbuf(1, nerr) = ra(h)
16834 errdbuf(2, nerr) = ramx
16835 END IF
16836 IF( camx .NE. ca(h) ) THEN
16837 nerr = nerr + 1
16838 erribuf(1, nerr) = testnum
16839 erribuf(2, nerr) = nnodes
16840 erribuf(3, nerr) = dest
16841 erribuf(4, nerr) = i
16842 erribuf(5, nerr) = j
16843 erribuf(6, nerr) = -15
16844 errdbuf(1, nerr) = ca(h)
16845 errdbuf(2, nerr) = camx
16846 END IF
16847 END IF
16848 END IF
16849 END IF
16850 90 CONTINUE
16851 100 CONTINUE
16852
16853 RETURN
16854
16855
16856
subroutine ibtspcoord(scope, pnum, myrow, mycol, npcol, prow, pcol)
double precision function dbtabs(val)
integer function ibtspnum(scope, prow, pcol, npcol)
double precision function dbteps()
double precision function dbtran(iseed)
integer function ibtnprocs()
integer function ibtmyproc()