SCALAPACK 2.2.2
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches

◆ cchkamx()

subroutine cchkamx ( character*1  scope,
integer  ictxt,
integer  m,
integer  n,
complex, dimension(lda,*)  a,
integer  lda,
integer, dimension(*)  ra,
integer, dimension(*)  ca,
integer  ldi,
integer  testnum,
integer  maxerr,
integer  nerr,
integer, dimension(6, maxerr)  erribuf,
complex, dimension(2, maxerr)  errdbuf,
integer, dimension(*)  iseed,
complex, dimension(*)  vals 
)

Definition at line 17497 of file blacstest.f.

17500*
17501* .. Scalar Arguments ..
17502 CHARACTER*1 SCOPE
17503 INTEGER ICTXT, M, N, LDA, LDI, TESTNUM, MAXERR, NERR
17504* ..
17505* .. Array Arguments ..
17506 INTEGER RA(*), CA(*), ERRIBUF(6, MAXERR), ISEED(*)
17507 COMPLEX A(LDA,*), ERRDBUF(2, MAXERR), VALS(*)
17508* ..
17509* .. External Functions ..
17510 INTEGER IBTMYPROC, IBTNPROCS, IBTSPNUM
17511 REAL SBTEPS, CBTABS
17512 COMPLEX CBTRAN
17514* ..
17515* .. External Subroutines ..
17516 EXTERNAL ibtspcoord
17517* ..
17518* .. Local Scalars ..
17519 LOGICAL ERROR
17520 INTEGER NPROCS, NNODES, NPROW, NPCOL, MYROW, MYCOL, RAMX, CAMX
17521 INTEGER IAMX, I, J, K, H, DEST, NODE
17522 REAL EPS
17523* ..
17524* .. Executable Statements ..
17525*
17526 nprocs = ibtnprocs()
17527 eps = sbteps()
17528 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
17529 dest = myrow*nprocs + mycol
17530*
17531* Set up seeds to match those used by each proc's genmat call
17532*
17533 IF( scope .EQ. 'R' ) THEN
17534 nnodes = npcol
17535 DO 10 i = 0, nnodes-1
17536 node = myrow * nprocs + i
17537 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
17538 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
17539 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
17540 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
17541 10 CONTINUE
17542 ELSE IF( scope .EQ. 'C' ) THEN
17543 nnodes = nprow
17544 DO 20 i = 0, nnodes-1
17545 node = i * nprocs + mycol
17546 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
17547 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
17548 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
17549 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
17550 20 CONTINUE
17551 ELSE
17552 nnodes = nprow * npcol
17553 DO 30 i = 0, nnodes-1
17554 node = (i / npcol) * nprocs + mod(i, npcol)
17555 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
17556 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
17557 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
17558 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
17559 30 CONTINUE
17560 END IF
17561*
17562 DO 100 j = 1, n
17563 DO 90 i = 1, m
17564 h = (j-1)*ldi + i
17565 vals(1) = cbtran( iseed )
17566 iamx = 1
17567 IF( nnodes .GT. 1 ) THEN
17568 DO 40 k = 1, nnodes-1
17569 vals(k+1) = cbtran( iseed(k*4+1) )
17570 IF( cbtabs( vals(k+1) ) .GT. cbtabs( vals(iamx) ) )
17571 $ iamx = k + 1
17572 40 CONTINUE
17573 END IF
17574*
17575* If BLACS have not returned same value we've chosen
17576*
17577 IF( a(i,j) .NE. vals(iamx) ) THEN
17578*
17579* If we have RA and CA arrays
17580*
17581 IF( ldi .NE. -1 ) THEN
17582*
17583* Any number having the same absolute value is a valid max
17584*
17585 k = ibtspnum( scope, ra(h), ca(h), npcol ) + 1
17586 IF( k.GT.0 .AND. k.LE.nnodes ) THEN
17587 error = abs( cbtabs(vals(k)) - cbtabs(vals(iamx)) )
17588 $ .GT. 3*eps
17589 IF( .NOT.error ) iamx = k
17590 ELSE
17591 error = .true.
17592 END IF
17593 ELSE
17594*
17595* Error if BLACS answer not same absolute value, or if it
17596* was not really in the numbers being compared
17597*
17598 error = abs( cbtabs(a(i,j)) - cbtabs(vals(iamx)) )
17599 $ .GT. 3*eps
17600 IF( .NOT.error ) THEN
17601 DO 50 k = 1, nnodes
17602 IF( vals(k) .EQ. a(i,j) ) GOTO 60
17603 50 CONTINUE
17604 error = .true.
17605 60 CONTINUE
17606 ENDIF
17607 END IF
17608*
17609* If the value is in error
17610*
17611 IF( error ) THEN
17612 nerr = nerr + 1
17613 erribuf(1, nerr) = testnum
17614 erribuf(2, nerr) = nnodes
17615 erribuf(3, nerr) = dest
17616 erribuf(4, nerr) = i
17617 erribuf(5, nerr) = j
17618 erribuf(6, nerr) = 5
17619 errdbuf(1, nerr) = a(i,j)
17620 errdbuf(2, nerr) = vals(iamx)
17621 END IF
17622 END IF
17623*
17624* If they are defined, make sure coordinate entries are OK
17625*
17626 IF( ldi .NE. -1 ) THEN
17627 k = ibtspnum( scope, ra(h), ca(h), npcol ) + 1
17628 IF( k.NE.iamx ) THEN
17629*
17630* Make sure more than one proc doesn't have exact same value
17631* (and therefore there may be more than one valid coordinate
17632* for a single value)
17633*
17634 IF( k.GT.nnodes .OR. k.LT.1 ) THEN
17635 error = .true.
17636 ELSE
17637 error = ( vals(k) .NE. vals(iamx) )
17638 END IF
17639 IF( error ) THEN
17640 CALL ibtspcoord( scope, iamx-1, myrow, mycol,
17641 $ npcol, ramx, camx )
17642 IF( ramx .NE. ra(h) ) THEN
17643 nerr = nerr + 1
17644 erribuf(1, nerr) = testnum
17645 erribuf(2, nerr) = nnodes
17646 erribuf(3, nerr) = dest
17647 erribuf(4, nerr) = i
17648 erribuf(5, nerr) = j
17649 erribuf(6, nerr) = -5
17650 errdbuf(1, nerr) = ra(h)
17651 errdbuf(2, nerr) = ramx
17652 END IF
17653 IF( camx .NE. ca(h) ) THEN
17654 nerr = nerr + 1
17655 erribuf(1, nerr) = testnum
17656 erribuf(2, nerr) = nnodes
17657 erribuf(3, nerr) = dest
17658 erribuf(4, nerr) = i
17659 erribuf(5, nerr) = j
17660 erribuf(6, nerr) = -15
17661 errdbuf(1, nerr) = ca(h)
17662 errdbuf(2, nerr) = camx
17663 END IF
17664 END IF
17665 END IF
17666 END IF
17667 90 CONTINUE
17668 100 CONTINUE
17669*
17670 RETURN
17671*
17672* End of CCHKAMX
17673*
complex function cbtran(iseed)
Definition blacstest.f:9683
subroutine ibtspcoord(scope, pnum, myrow, mycol, npcol, prow, pcol)
real function cbtabs(val)
integer function ibtspnum(scope, prow, pcol, npcol)
real function sbteps()
integer function ibtnprocs()
Definition btprim.f:81
integer function ibtmyproc()
Definition btprim.f:47
Here is the call graph for this function:
Here is the caller graph for this function: