14264
14265
14266 CHARACTER*1 SCOPE
14267 INTEGER ICTXT, M, N, LDA, TESTNUM, MAXERR, NERR
14268
14269
14270 INTEGER ERRIBUF(6, MAXERR), ISEED(*)
14271 DOUBLE COMPLEX A(LDA,*), ERRDBUF(2, MAXERR)
14272
14273
14274 INTEGER IBTMYPROC, IBTNPROCS
14275 DOUBLE PRECISION DBTEPS
14276 DOUBLE COMPLEX ZBTRAN
14278
14279
14280 LOGICAL NUMOK
14281 INTEGER NPROCS, NPROW, NPCOL, MYROW, MYCOL, NODE, NNODES, DEST
14282 INTEGER I, J, K
14283 DOUBLE COMPLEX ANS, TMP
14284 DOUBLE PRECISION EPS, ERRBND, RPOSNUM, RNEGNUM, IPOSNUM, INEGNUM
14285
14286
14287
14290 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
14291 dest = myrow*nprocs + mycol
14292
14293
14294
14295 IF( scope .EQ. 'R' ) THEN
14296 nnodes = npcol
14297 DO 10 i = 0, nnodes-1
14298 node = myrow * nprocs + i
14299 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
14300 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
14301 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
14302 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
14303 10 CONTINUE
14304 ELSE IF( scope .EQ. 'C' ) THEN
14305 nnodes = nprow
14306 DO 20 i = 0, nnodes-1
14307 node = i * nprocs + mycol
14308 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
14309 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
14310 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
14311 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
14312 20 CONTINUE
14313 ELSE
14314 nnodes = nprow * npcol
14315 DO 30 i = 0, nnodes-1
14316 node = (i / npcol) * nprocs + mod(i, npcol)
14317 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
14318 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
14319 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
14320 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
14321 30 CONTINUE
14322 END IF
14323
14324 DO 100 j = 1, n
14325 DO 90 i = 1, m
14326 ans = 0
14327 rposnum = 0
14328 rnegnum = 0
14329 iposnum = 0
14330 inegnum = 0
14331 DO 40 k = 0, nnodes-1
14332 tmp =
zbtran( iseed(k*4+1) )
14333 IF( dble( tmp ) .LT. 0 ) THEN
14334 rnegnum = rnegnum + dble( tmp )
14335 ELSE
14336 rposnum = rposnum + dble( tmp )
14337 END IF
14338 IF( dimag( tmp ) .LT. 0 ) THEN
14339 inegnum = inegnum + dimag( tmp )
14340 ELSE
14341 iposnum = iposnum + dimag( tmp )
14342 END IF
14343 ans = ans + tmp
14344 40 CONTINUE
14345
14346
14347
14348
14349
14350
14351
14352
14353 tmp = ans - a(i,j)
14354 errbnd = 2 * eps * nnodes *
max( rposnum, -rnegnum )
14355 numok = ( dble(tmp) .LE. errbnd )
14356 errbnd = 2 * eps * nnodes *
max( iposnum, -inegnum )
14357 numok = numok .AND. ( dimag(tmp) .LE. errbnd )
14358 IF( .NOT.numok ) THEN
14359 nerr = nerr + 1
14360 IF( nerr .LE. maxerr ) THEN
14361 erribuf(1, nerr) = testnum
14362 erribuf(2, nerr) = nnodes
14363 erribuf(3, nerr) = dest
14364 erribuf(4, nerr) = i
14365 erribuf(5, nerr) = j
14366 erribuf(6, nerr) = 5
14367 errdbuf(1, nerr) = a(i,j)
14368 errdbuf(2, nerr) = ans
14369 END IF
14370 END IF
14371 90 CONTINUE
14372 100 CONTINUE
14373
14374 RETURN
14375
14376
14377
double complex function zbtran(iseed)
double precision function dbteps()
integer function ibtnprocs()
integer function ibtmyproc()