20253
20254
20255 CHARACTER*1 SCOPE
20256 INTEGER ICTXT, M, N, LDA, LDI, TESTNUM, MAXERR, NERR
20257
20258
20259 INTEGER RA(*), CA(*), ERRIBUF(6, MAXERR), ISEED(*)
20260 DOUBLE PRECISION A(LDA,*), ERRDBUF(2, MAXERR), VALS(*)
20261
20262
20263 INTEGER IBTMYPROC, IBTNPROCS, IBTSPNUM
20264 DOUBLE PRECISION DBTEPS, DBTABS
20265 DOUBLE PRECISION DBTRAN
20267
20268
20270
20271
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
20278
20281 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
20282 dest = myrow*nprocs + mycol
20283
20284
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) )
20324 $ iamn = k + 1
20325 40 CONTINUE
20326 END IF
20327
20328
20329
20330 IF( a(i,j) .NE. vals(iamn) ) THEN
20331
20332
20333
20334 IF( ldi .NE. -1 ) THEN
20335
20336
20337
20338 k =
ibtspnum( scope, ra(h), ca(h), npcol ) + 1
20339 IF( k.GT.0 .AND. k.LE.nnodes ) THEN
20341 IF( .NOT.error ) iamn = k
20342 ELSE
20343 error = .true.
20344 END IF
20345 ELSE
20346
20347
20348
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
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
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
20382
20383
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
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)
integer function ibtnprocs()
integer function ibtmyproc()