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

◆ schkamn()

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

Definition at line 19604 of file blacstest.f.

19607*
19608* .. Scalar Arguments ..
19609 CHARACTER*1 SCOPE
19610 INTEGER ICTXT, M, N, LDA, LDI, TESTNUM, MAXERR, NERR
19611* ..
19612* .. Array Arguments ..
19613 INTEGER RA(*), CA(*), ERRIBUF(6, MAXERR), ISEED(*)
19614 REAL A(LDA,*), ERRDBUF(2, MAXERR), VALS(*)
19615* ..
19616* .. External Functions ..
19617 INTEGER IBTMYPROC, IBTNPROCS, IBTSPNUM
19618 REAL SBTEPS, SBTABS
19619 REAL SBTRAN
19621* ..
19622* .. External Subroutines ..
19623 EXTERNAL ibtspcoord
19624* ..
19625* .. Local Scalars ..
19626 LOGICAL ERROR
19627 INTEGER NPROCS, NNODES, NPROW, NPCOL, MYROW, MYCOL, RAMN, CAMN
19628 INTEGER IAMN, I, J, K, H, DEST, NODE
19629 REAL EPS
19630* ..
19631* .. Executable Statements ..
19632*
19633 nprocs = ibtnprocs()
19634 eps = sbteps()
19635 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
19636 dest = myrow*nprocs + mycol
19637*
19638* Set up seeds to match those used by each proc's genmat call
19639*
19640 IF( scope .EQ. 'R' ) THEN
19641 nnodes = npcol
19642 DO 10 i = 0, nnodes-1
19643 node = myrow * nprocs + i
19644 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
19645 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
19646 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
19647 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
19648 10 CONTINUE
19649 ELSE IF( scope .EQ. 'C' ) THEN
19650 nnodes = nprow
19651 DO 20 i = 0, nnodes-1
19652 node = i * nprocs + mycol
19653 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
19654 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
19655 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
19656 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
19657 20 CONTINUE
19658 ELSE
19659 nnodes = nprow * npcol
19660 DO 30 i = 0, nnodes-1
19661 node = (i / npcol) * nprocs + mod(i, npcol)
19662 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
19663 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
19664 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
19665 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
19666 30 CONTINUE
19667 END IF
19668*
19669 DO 100 j = 1, n
19670 DO 90 i = 1, m
19671 h = (j-1)*ldi + i
19672 vals(1) = sbtran( iseed )
19673 iamn = 1
19674 IF( nnodes .GT. 1 ) THEN
19675 DO 40 k = 1, nnodes-1
19676 vals(k+1) = sbtran( iseed(k*4+1) )
19677 IF( sbtabs( vals(k+1) ) .LT. sbtabs( vals(iamn) ) )
19678 $ iamn = k + 1
19679 40 CONTINUE
19680 END IF
19681*
19682* If BLACS have not returned same value we've chosen
19683*
19684 IF( a(i,j) .NE. vals(iamn) ) THEN
19685*
19686* If we have RA and CA arrays
19687*
19688 IF( ldi .NE. -1 ) THEN
19689*
19690* Any number having the same absolute value is a valid max
19691*
19692 k = ibtspnum( scope, ra(h), ca(h), npcol ) + 1
19693 IF( k.GT.0 .AND. k.LE.nnodes ) THEN
19694 error = sbtabs( vals(k) ).NE.sbtabs( vals(iamn) )
19695 IF( .NOT.error ) iamn = k
19696 ELSE
19697 error = .true.
19698 END IF
19699 ELSE
19700*
19701* Error if BLACS answer not same absolute value, or if it
19702* was not really in the numbers being compared
19703*
19704 error = ( sbtabs( a(i,j) ) .NE. sbtabs( vals(iamn) ) )
19705 IF( .NOT.error ) THEN
19706 DO 50 k = 1, nnodes
19707 IF( vals(k) .EQ. a(i,j) ) GOTO 60
19708 50 CONTINUE
19709 error = .true.
19710 60 CONTINUE
19711 ENDIF
19712 END IF
19713*
19714* If the value is in error
19715*
19716 IF( error ) THEN
19717 nerr = nerr + 1
19718 erribuf(1, nerr) = testnum
19719 erribuf(2, nerr) = nnodes
19720 erribuf(3, nerr) = dest
19721 erribuf(4, nerr) = i
19722 erribuf(5, nerr) = j
19723 erribuf(6, nerr) = 5
19724 errdbuf(1, nerr) = a(i,j)
19725 errdbuf(2, nerr) = vals(iamn)
19726 END IF
19727 END IF
19728*
19729* If they are defined, make sure coordinate entries are OK
19730*
19731 IF( ldi .NE. -1 ) THEN
19732 k = ibtspnum( scope, ra(h), ca(h), npcol ) + 1
19733 IF( k.NE.iamn ) THEN
19734*
19735* Make sure more than one proc doesn't have exact same value
19736* (and therefore there may be more than one valid coordinate
19737* for a single value)
19738*
19739 IF( k.GT.nnodes .OR. k.LT.1 ) THEN
19740 error = .true.
19741 ELSE
19742 error = ( vals(k) .NE. vals(iamn) )
19743 END IF
19744 IF( error ) THEN
19745 CALL ibtspcoord( scope, iamn-1, myrow, mycol,
19746 $ npcol, ramn, camn )
19747 IF( ramn .NE. ra(h) ) THEN
19748 nerr = nerr + 1
19749 erribuf(1, nerr) = testnum
19750 erribuf(2, nerr) = nnodes
19751 erribuf(3, nerr) = dest
19752 erribuf(4, nerr) = i
19753 erribuf(5, nerr) = j
19754 erribuf(6, nerr) = -5
19755 errdbuf(1, nerr) = ra(h)
19756 errdbuf(2, nerr) = ramn
19757 END IF
19758 IF( camn .NE. ca(h) ) THEN
19759 nerr = nerr + 1
19760 erribuf(1, nerr) = testnum
19761 erribuf(2, nerr) = nnodes
19762 erribuf(3, nerr) = dest
19763 erribuf(4, nerr) = i
19764 erribuf(5, nerr) = j
19765 erribuf(6, nerr) = -15
19766 errdbuf(1, nerr) = ca(h)
19767 errdbuf(2, nerr) = camn
19768 END IF
19769 END IF
19770 END IF
19771 END IF
19772 90 CONTINUE
19773 100 CONTINUE
19774*
19775 RETURN
19776*
19777* End of SCHKAMN
19778*
subroutine ibtspcoord(scope, pnum, myrow, mycol, npcol, prow, pcol)
integer function ibtspnum(scope, prow, pcol, npcol)
real function sbtran(iseed)
Definition blacstest.f:7555
real function sbtabs(val)
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: