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

◆ zchkamn()

subroutine zchkamn ( character*1  scope,
integer  ictxt,
integer  m,
integer  n,
double 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,
double complex, dimension(2, maxerr)  errdbuf,
integer, dimension(*)  iseed,
double complex, dimension(*)  vals 
)

Definition at line 21544 of file blacstest.f.

21547*
21548* .. Scalar Arguments ..
21549 CHARACTER*1 SCOPE
21550 INTEGER ICTXT, M, N, LDA, LDI, TESTNUM, MAXERR, NERR
21551* ..
21552* .. Array Arguments ..
21553 INTEGER RA(*), CA(*), ERRIBUF(6, MAXERR), ISEED(*)
21554 DOUBLE COMPLEX A(LDA,*), ERRDBUF(2, MAXERR), VALS(*)
21555* ..
21556* .. External Functions ..
21557 INTEGER IBTMYPROC, IBTNPROCS, IBTSPNUM
21558 DOUBLE PRECISION DBTEPS, ZBTABS
21559 DOUBLE COMPLEX ZBTRAN
21561* ..
21562* .. External Subroutines ..
21563 EXTERNAL ibtspcoord
21564* ..
21565* .. Local Scalars ..
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* .. Executable Statements ..
21572*
21573 nprocs = ibtnprocs()
21574 eps = dbteps()
21575 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
21576 dest = myrow*nprocs + mycol
21577*
21578* Set up seeds to match those used by each proc's genmat call
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) )
21617 IF( zbtabs( vals(k+1) ) .LT. zbtabs( vals(iamn) ) )
21618 $ iamn = k + 1
21619 40 CONTINUE
21620 END IF
21621*
21622* If BLACS have not returned same value we've chosen
21623*
21624 IF( a(i,j) .NE. vals(iamn) ) THEN
21625*
21626* If we have RA and CA arrays
21627*
21628 IF( ldi .NE. -1 ) THEN
21629*
21630* Any number having the same absolute value is a valid max
21631*
21632 k = ibtspnum( scope, ra(h), ca(h), npcol ) + 1
21633 IF( k.GT.0 .AND. k.LE.nnodes ) THEN
21634 error = abs( zbtabs(vals(k)) - zbtabs(vals(iamn)) )
21635 $ .GT. 3*eps
21636 IF( .NOT.error ) iamn = k
21637 ELSE
21638 error = .true.
21639 END IF
21640 ELSE
21641*
21642* Error if BLACS answer not same absolute value, or if it
21643* was not really in the numbers being compared
21644*
21645 error = abs( zbtabs(a(i,j)) - zbtabs(vals(iamn)) )
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* If the value is in error
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* If they are defined, make sure coordinate entries are OK
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* Make sure more than one proc doesn't have exact same value
21678* (and therefore there may be more than one valid coordinate
21679* for a single value)
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* End of ZCHKAMN
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()
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: