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

◆ schkamx()

subroutine schkamx ( 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 15867 of file blacstest.f.

15870*
15871* .. Scalar Arguments ..
15872 CHARACTER*1 SCOPE
15873 INTEGER ICTXT, M, N, LDA, LDI, TESTNUM, MAXERR, NERR
15874* ..
15875* .. Array Arguments ..
15876 INTEGER RA(*), CA(*), ERRIBUF(6, MAXERR), ISEED(*)
15877 REAL A(LDA,*), ERRDBUF(2, MAXERR), VALS(*)
15878* ..
15879* .. External Functions ..
15880 INTEGER IBTMYPROC, IBTNPROCS, IBTSPNUM
15881 REAL SBTEPS, SBTABS
15882 REAL SBTRAN
15884* ..
15885* .. External Subroutines ..
15886 EXTERNAL ibtspcoord
15887* ..
15888* .. Local Scalars ..
15889 LOGICAL ERROR
15890 INTEGER NPROCS, NNODES, NPROW, NPCOL, MYROW, MYCOL, RAMX, CAMX
15891 INTEGER IAMX, I, J, K, H, DEST, NODE
15892 REAL EPS
15893* ..
15894* .. Executable Statements ..
15895*
15896 nprocs = ibtnprocs()
15897 eps = sbteps()
15898 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
15899 dest = myrow*nprocs + mycol
15900*
15901* Set up seeds to match those used by each proc's genmat call
15902*
15903 IF( scope .EQ. 'R' ) THEN
15904 nnodes = npcol
15905 DO 10 i = 0, nnodes-1
15906 node = myrow * nprocs + i
15907 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
15908 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
15909 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
15910 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
15911 10 CONTINUE
15912 ELSE IF( scope .EQ. 'C' ) THEN
15913 nnodes = nprow
15914 DO 20 i = 0, nnodes-1
15915 node = i * nprocs + mycol
15916 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
15917 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
15918 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
15919 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
15920 20 CONTINUE
15921 ELSE
15922 nnodes = nprow * npcol
15923 DO 30 i = 0, nnodes-1
15924 node = (i / npcol) * nprocs + mod(i, npcol)
15925 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
15926 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
15927 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
15928 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
15929 30 CONTINUE
15930 END IF
15931*
15932 DO 100 j = 1, n
15933 DO 90 i = 1, m
15934 h = (j-1)*ldi + i
15935 vals(1) = sbtran( iseed )
15936 iamx = 1
15937 IF( nnodes .GT. 1 ) THEN
15938 DO 40 k = 1, nnodes-1
15939 vals(k+1) = sbtran( iseed(k*4+1) )
15940 IF( sbtabs( vals(k+1) ) .GT. sbtabs( vals(iamx) ) )
15941 $ iamx = k + 1
15942 40 CONTINUE
15943 END IF
15944*
15945* If BLACS have not returned same value we've chosen
15946*
15947 IF( a(i,j) .NE. vals(iamx) ) THEN
15948*
15949* If we have RA and CA arrays
15950*
15951 IF( ldi .NE. -1 ) THEN
15952*
15953* Any number having the same absolute value is a valid max
15954*
15955 k = ibtspnum( scope, ra(h), ca(h), npcol ) + 1
15956 IF( k.GT.0 .AND. k.LE.nnodes ) THEN
15957 error = sbtabs( vals(k) ).NE.sbtabs( vals(iamx) )
15958 IF( .NOT.error ) iamx = k
15959 ELSE
15960 error = .true.
15961 END IF
15962 ELSE
15963*
15964* Error if BLACS answer not same absolute value, or if it
15965* was not really in the numbers being compared
15966*
15967 error = ( sbtabs( a(i,j) ) .NE. sbtabs( vals(iamx) ) )
15968 IF( .NOT.error ) THEN
15969 DO 50 k = 1, nnodes
15970 IF( vals(k) .EQ. a(i,j) ) GOTO 60
15971 50 CONTINUE
15972 error = .true.
15973 60 CONTINUE
15974 ENDIF
15975 END IF
15976*
15977* If the value is in error
15978*
15979 IF( error ) THEN
15980 nerr = nerr + 1
15981 erribuf(1, nerr) = testnum
15982 erribuf(2, nerr) = nnodes
15983 erribuf(3, nerr) = dest
15984 erribuf(4, nerr) = i
15985 erribuf(5, nerr) = j
15986 erribuf(6, nerr) = 5
15987 errdbuf(1, nerr) = a(i,j)
15988 errdbuf(2, nerr) = vals(iamx)
15989 END IF
15990 END IF
15991*
15992* If they are defined, make sure coordinate entries are OK
15993*
15994 IF( ldi .NE. -1 ) THEN
15995 k = ibtspnum( scope, ra(h), ca(h), npcol ) + 1
15996 IF( k.NE.iamx ) THEN
15997*
15998* Make sure more than one proc doesn't have exact same value
15999* (and therefore there may be more than one valid coordinate
16000* for a single value)
16001*
16002 IF( k.GT.nnodes .OR. k.LT.1 ) THEN
16003 error = .true.
16004 ELSE
16005 error = ( vals(k) .NE. vals(iamx) )
16006 END IF
16007 IF( error ) THEN
16008 CALL ibtspcoord( scope, iamx-1, myrow, mycol,
16009 $ npcol, ramx, camx )
16010 IF( ramx .NE. ra(h) ) THEN
16011 nerr = nerr + 1
16012 erribuf(1, nerr) = testnum
16013 erribuf(2, nerr) = nnodes
16014 erribuf(3, nerr) = dest
16015 erribuf(4, nerr) = i
16016 erribuf(5, nerr) = j
16017 erribuf(6, nerr) = -5
16018 errdbuf(1, nerr) = ra(h)
16019 errdbuf(2, nerr) = ramx
16020 END IF
16021 IF( camx .NE. ca(h) ) THEN
16022 nerr = nerr + 1
16023 erribuf(1, nerr) = testnum
16024 erribuf(2, nerr) = nnodes
16025 erribuf(3, nerr) = dest
16026 erribuf(4, nerr) = i
16027 erribuf(5, nerr) = j
16028 erribuf(6, nerr) = -15
16029 errdbuf(1, nerr) = ca(h)
16030 errdbuf(2, nerr) = camx
16031 END IF
16032 END IF
16033 END IF
16034 END IF
16035 90 CONTINUE
16036 100 CONTINUE
16037*
16038 RETURN
16039*
16040* End of SCHKAMX
16041*
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: