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

◆ dchkamn()

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

Definition at line 20250 of file blacstest.f.

20253*
20254* .. Scalar Arguments ..
20255 CHARACTER*1 SCOPE
20256 INTEGER ICTXT, M, N, LDA, LDI, TESTNUM, MAXERR, NERR
20257* ..
20258* .. Array Arguments ..
20259 INTEGER RA(*), CA(*), ERRIBUF(6, MAXERR), ISEED(*)
20260 DOUBLE PRECISION A(LDA,*), ERRDBUF(2, MAXERR), VALS(*)
20261* ..
20262* .. External Functions ..
20263 INTEGER IBTMYPROC, IBTNPROCS, IBTSPNUM
20264 DOUBLE PRECISION DBTEPS, DBTABS
20265 DOUBLE PRECISION DBTRAN
20267* ..
20268* .. External Subroutines ..
20269 EXTERNAL ibtspcoord
20270* ..
20271* .. Local Scalars ..
20272 LOGICAL ERROR
20273 INTEGER NPROCS, NNODES, NPROW, NPCOL, MYROW, MYCOL, RAMN, CAMN
20274 INTEGER IAMN, I, J, K, H, DEST, NODE
20275 DOUBLE PRECISION EPS
20276* ..
20277* .. Executable Statements ..
20278*
20279 nprocs = ibtnprocs()
20280 eps = dbteps()
20281 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
20282 dest = myrow*nprocs + mycol
20283*
20284* Set up seeds to match those used by each proc's genmat call
20285*
20286 IF( scope .EQ. 'R' ) THEN
20287 nnodes = npcol
20288 DO 10 i = 0, nnodes-1
20289 node = myrow * nprocs + i
20290 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
20291 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
20292 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
20293 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
20294 10 CONTINUE
20295 ELSE IF( scope .EQ. 'C' ) THEN
20296 nnodes = nprow
20297 DO 20 i = 0, nnodes-1
20298 node = i * nprocs + mycol
20299 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
20300 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
20301 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
20302 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
20303 20 CONTINUE
20304 ELSE
20305 nnodes = nprow * npcol
20306 DO 30 i = 0, nnodes-1
20307 node = (i / npcol) * nprocs + mod(i, npcol)
20308 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
20309 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
20310 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
20311 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
20312 30 CONTINUE
20313 END IF
20314*
20315 DO 100 j = 1, n
20316 DO 90 i = 1, m
20317 h = (j-1)*ldi + i
20318 vals(1) = dbtran( iseed )
20319 iamn = 1
20320 IF( nnodes .GT. 1 ) THEN
20321 DO 40 k = 1, nnodes-1
20322 vals(k+1) = dbtran( iseed(k*4+1) )
20323 IF( dbtabs( vals(k+1) ) .LT. dbtabs( vals(iamn) ) )
20324 $ iamn = k + 1
20325 40 CONTINUE
20326 END IF
20327*
20328* If BLACS have not returned same value we've chosen
20329*
20330 IF( a(i,j) .NE. vals(iamn) ) THEN
20331*
20332* If we have RA and CA arrays
20333*
20334 IF( ldi .NE. -1 ) THEN
20335*
20336* Any number having the same absolute value is a valid max
20337*
20338 k = ibtspnum( scope, ra(h), ca(h), npcol ) + 1
20339 IF( k.GT.0 .AND. k.LE.nnodes ) THEN
20340 error = dbtabs( vals(k) ).NE.dbtabs( vals(iamn) )
20341 IF( .NOT.error ) iamn = k
20342 ELSE
20343 error = .true.
20344 END IF
20345 ELSE
20346*
20347* Error if BLACS answer not same absolute value, or if it
20348* was not really in the numbers being compared
20349*
20350 error = ( dbtabs( a(i,j) ) .NE. dbtabs( vals(iamn) ) )
20351 IF( .NOT.error ) THEN
20352 DO 50 k = 1, nnodes
20353 IF( vals(k) .EQ. a(i,j) ) GOTO 60
20354 50 CONTINUE
20355 error = .true.
20356 60 CONTINUE
20357 ENDIF
20358 END IF
20359*
20360* If the value is in error
20361*
20362 IF( error ) THEN
20363 nerr = nerr + 1
20364 erribuf(1, nerr) = testnum
20365 erribuf(2, nerr) = nnodes
20366 erribuf(3, nerr) = dest
20367 erribuf(4, nerr) = i
20368 erribuf(5, nerr) = j
20369 erribuf(6, nerr) = 5
20370 errdbuf(1, nerr) = a(i,j)
20371 errdbuf(2, nerr) = vals(iamn)
20372 END IF
20373 END IF
20374*
20375* If they are defined, make sure coordinate entries are OK
20376*
20377 IF( ldi .NE. -1 ) THEN
20378 k = ibtspnum( scope, ra(h), ca(h), npcol ) + 1
20379 IF( k.NE.iamn ) THEN
20380*
20381* Make sure more than one proc doesn't have exact same value
20382* (and therefore there may be more than one valid coordinate
20383* for a single value)
20384*
20385 IF( k.GT.nnodes .OR. k.LT.1 ) THEN
20386 error = .true.
20387 ELSE
20388 error = ( vals(k) .NE. vals(iamn) )
20389 END IF
20390 IF( error ) THEN
20391 CALL ibtspcoord( scope, iamn-1, myrow, mycol,
20392 $ npcol, ramn, camn )
20393 IF( ramn .NE. ra(h) ) THEN
20394 nerr = nerr + 1
20395 erribuf(1, nerr) = testnum
20396 erribuf(2, nerr) = nnodes
20397 erribuf(3, nerr) = dest
20398 erribuf(4, nerr) = i
20399 erribuf(5, nerr) = j
20400 erribuf(6, nerr) = -5
20401 errdbuf(1, nerr) = ra(h)
20402 errdbuf(2, nerr) = ramn
20403 END IF
20404 IF( camn .NE. ca(h) ) THEN
20405 nerr = nerr + 1
20406 erribuf(1, nerr) = testnum
20407 erribuf(2, nerr) = nnodes
20408 erribuf(3, nerr) = dest
20409 erribuf(4, nerr) = i
20410 erribuf(5, nerr) = j
20411 erribuf(6, nerr) = -15
20412 errdbuf(1, nerr) = ca(h)
20413 errdbuf(2, nerr) = camn
20414 END IF
20415 END IF
20416 END IF
20417 END IF
20418 90 CONTINUE
20419 100 CONTINUE
20420*
20421 RETURN
20422*
20423* End of DCHKAMN
20424*
subroutine ibtspcoord(scope, pnum, myrow, mycol, npcol, prow, pcol)
double precision function dbtabs(val)
integer function ibtspnum(scope, prow, pcol, npcol)
double precision function dbteps()
double precision function dbtran(iseed)
Definition blacstest.f:8619
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: