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

◆ zchksum()

subroutine zchksum ( character*1  scope,
integer  ictxt,
integer  m,
integer  n,
double complex, dimension(lda,*)  a,
integer  lda,
integer  testnum,
integer  maxerr,
integer  nerr,
integer, dimension(6, maxerr)  erribuf,
double complex, dimension(2, maxerr)  errdbuf,
integer, dimension(*)  iseed 
)

Definition at line 14262 of file blacstest.f.

14264*
14265* .. Scalar Arguments ..
14266 CHARACTER*1 SCOPE
14267 INTEGER ICTXT, M, N, LDA, TESTNUM, MAXERR, NERR
14268* ..
14269* .. Array Arguments ..
14270 INTEGER ERRIBUF(6, MAXERR), ISEED(*)
14271 DOUBLE COMPLEX A(LDA,*), ERRDBUF(2, MAXERR)
14272* ..
14273* .. External Functions ..
14274 INTEGER IBTMYPROC, IBTNPROCS
14275 DOUBLE PRECISION DBTEPS
14276 DOUBLE COMPLEX ZBTRAN
14277 EXTERNAL ibtmyproc, ibtnprocs, dbteps, zbtran
14278* ..
14279* .. Local Scalars ..
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* .. Executable Statements ..
14287*
14288 nprocs = ibtnprocs()
14289 eps = dbteps()
14290 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
14291 dest = myrow*nprocs + mycol
14292*
14293* Set up seeds to match those used by each proc's genmat call
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* The error bound is figured by
14347* 2 * eps * (nnodes-1) * max(|max element|, |ans|).
14348* The 2 allows for errors in the distributed _AND_ local result.
14349* The eps is machine epsilon. The number of floating point adds
14350* is (nnodes - 1). We use the fact that 0.5 is the maximum element
14351* in order to save ourselves some computation.
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* End of ZCHKSUM
14377*
double complex function zbtran(iseed)
double precision function dbteps()
integer function ibtnprocs()
Definition btprim.f:81
integer function ibtmyproc()
Definition btprim.f:47
#define max(A, B)
Definition pcgemr.c:180
Here is the caller graph for this function: