21547
21548
21549 CHARACTER*1 SCOPE
21550 INTEGER ICTXT, M, N, LDA, LDI, TESTNUM, MAXERR, NERR
21551
21552
21553 INTEGER RA(*), CA(*), ERRIBUF(6, MAXERR), ISEED(*)
21554 DOUBLE COMPLEX A(LDA,*), ERRDBUF(2, MAXERR), VALS(*)
21555
21556
21557 INTEGER IBTMYPROC, IBTNPROCS, IBTSPNUM
21558 DOUBLE PRECISION DBTEPS, ZBTABS
21559 DOUBLE COMPLEX ZBTRAN
21561
21562
21564
21565
21566 LOGICAL ERROR
21567 INTEGER NPROCS, NNODES, NPROW, NPCOL, MYROW, MYCOL, RAMN, CAMN
21568 INTEGER IAMN, I, J, K, H, DEST, NODE
21569 DOUBLE PRECISION EPS
21570
21571
21572
21575 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
21576 dest = myrow*nprocs + mycol
21577
21578
21579
21580 IF( scope .EQ. 'R' ) THEN
21581 nnodes = npcol
21582 DO 10 i = 0, nnodes-1
21583 node = myrow * nprocs + i
21584 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
21585 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
21586 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
21587 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
21588 10 CONTINUE
21589 ELSE IF( scope .EQ. 'C' ) THEN
21590 nnodes = nprow
21591 DO 20 i = 0, nnodes-1
21592 node = i * nprocs + mycol
21593 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
21594 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
21595 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
21596 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
21597 20 CONTINUE
21598 ELSE
21599 nnodes = nprow * npcol
21600 DO 30 i = 0, nnodes-1
21601 node = (i / npcol) * nprocs + mod(i, npcol)
21602 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
21603 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
21604 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
21605 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
21606 30 CONTINUE
21607 END IF
21608
21609 DO 100 j = 1, n
21610 DO 90 i = 1, m
21611 h = (j-1)*ldi + i
21612 vals(1) =
zbtran( iseed )
21613 iamn = 1
21614 IF( nnodes .GT. 1 ) THEN
21615 DO 40 k = 1, nnodes-1
21616 vals(k+1) =
zbtran( iseed(k*4+1) )
21618 $ iamn = k + 1
21619 40 CONTINUE
21620 END IF
21621
21622
21623
21624 IF( a(i,j) .NE. vals(iamn) ) THEN
21625
21626
21627
21628 IF( ldi .NE. -1 ) THEN
21629
21630
21631
21632 k =
ibtspnum( scope, ra(h), ca(h), npcol ) + 1
21633 IF( k.GT.0 .AND. k.LE.nnodes ) THEN
21635 $ .GT. 3*eps
21636 IF( .NOT.error ) iamn = k
21637 ELSE
21638 error = .true.
21639 END IF
21640 ELSE
21641
21642
21643
21644
21646 $ .GT. 3*eps
21647 IF( .NOT.error ) THEN
21648 DO 50 k = 1, nnodes
21649 IF( vals(k) .EQ. a(i,j) ) GOTO 60
21650 50 CONTINUE
21651 error = .true.
21652 60 CONTINUE
21653 ENDIF
21654 END IF
21655
21656
21657
21658 IF( error ) THEN
21659 nerr = nerr + 1
21660 erribuf(1, nerr) = testnum
21661 erribuf(2, nerr) = nnodes
21662 erribuf(3, nerr) = dest
21663 erribuf(4, nerr) = i
21664 erribuf(5, nerr) = j
21665 erribuf(6, nerr) = 5
21666 errdbuf(1, nerr) = a(i,j)
21667 errdbuf(2, nerr) = vals(iamn)
21668 END IF
21669 END IF
21670
21671
21672
21673 IF( ldi .NE. -1 ) THEN
21674 k =
ibtspnum( scope, ra(h), ca(h), npcol ) + 1
21675 IF( k.NE.iamn ) THEN
21676
21677
21678
21679
21680
21681 IF( k.GT.nnodes .OR. k.LT.1 ) THEN
21682 error = .true.
21683 ELSE
21684 error = ( vals(k) .NE. vals(iamn) )
21685 END IF
21686 IF( error ) THEN
21687 CALL ibtspcoord( scope, iamn-1, myrow, mycol,
21688 $ npcol, ramn, camn )
21689 IF( ramn .NE. ra(h) ) THEN
21690 nerr = nerr + 1
21691 erribuf(1, nerr) = testnum
21692 erribuf(2, nerr) = nnodes
21693 erribuf(3, nerr) = dest
21694 erribuf(4, nerr) = i
21695 erribuf(5, nerr) = j
21696 erribuf(6, nerr) = -5
21697 errdbuf(1, nerr) = ra(h)
21698 errdbuf(2, nerr) = ramn
21699 END IF
21700 IF( camn .NE. ca(h) ) THEN
21701 nerr = nerr + 1
21702 erribuf(1, nerr) = testnum
21703 erribuf(2, nerr) = nnodes
21704 erribuf(3, nerr) = dest
21705 erribuf(4, nerr) = i
21706 erribuf(5, nerr) = j
21707 erribuf(6, nerr) = -15
21708 errdbuf(1, nerr) = ca(h)
21709 errdbuf(2, nerr) = camn
21710 END IF
21711 END IF
21712 END IF
21713 END IF
21714 90 CONTINUE
21715 100 CONTINUE
21716
21717 RETURN
21718
21719
21720
double complex function zbtran(iseed)
subroutine ibtspcoord(scope, pnum, myrow, mycol, npcol, prow, pcol)
integer function ibtspnum(scope, prow, pcol, npcol)
double precision function zbtabs(val)
double precision function dbteps()
integer function ibtnprocs()
integer function ibtmyproc()