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

◆ dchkamx()

subroutine dchkamx ( 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 16682 of file blacstest.f.

16685*
16686* .. Scalar Arguments ..
16687 CHARACTER*1 SCOPE
16688 INTEGER ICTXT, M, N, LDA, LDI, TESTNUM, MAXERR, NERR
16689* ..
16690* .. Array Arguments ..
16691 INTEGER RA(*), CA(*), ERRIBUF(6, MAXERR), ISEED(*)
16692 DOUBLE PRECISION A(LDA,*), ERRDBUF(2, MAXERR), VALS(*)
16693* ..
16694* .. External Functions ..
16695 INTEGER IBTMYPROC, IBTNPROCS, IBTSPNUM
16696 DOUBLE PRECISION DBTEPS, DBTABS
16697 DOUBLE PRECISION DBTRAN
16699* ..
16700* .. External Subroutines ..
16701 EXTERNAL ibtspcoord
16702* ..
16703* .. Local Scalars ..
16704 LOGICAL ERROR
16705 INTEGER NPROCS, NNODES, NPROW, NPCOL, MYROW, MYCOL, RAMX, CAMX
16706 INTEGER IAMX, I, J, K, H, DEST, NODE
16707 DOUBLE PRECISION EPS
16708* ..
16709* .. Executable Statements ..
16710*
16711 nprocs = ibtnprocs()
16712 eps = dbteps()
16713 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
16714 dest = myrow*nprocs + mycol
16715*
16716* Set up seeds to match those used by each proc's genmat call
16717*
16718 IF( scope .EQ. 'R' ) THEN
16719 nnodes = npcol
16720 DO 10 i = 0, nnodes-1
16721 node = myrow * nprocs + i
16722 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
16723 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
16724 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
16725 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
16726 10 CONTINUE
16727 ELSE IF( scope .EQ. 'C' ) THEN
16728 nnodes = nprow
16729 DO 20 i = 0, nnodes-1
16730 node = i * nprocs + mycol
16731 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
16732 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
16733 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
16734 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
16735 20 CONTINUE
16736 ELSE
16737 nnodes = nprow * npcol
16738 DO 30 i = 0, nnodes-1
16739 node = (i / npcol) * nprocs + mod(i, npcol)
16740 iseed(i*4+1) = mod( 1002 + testnum*5 + node*3, 4096 )
16741 iseed(i*4+2) = mod( 2027 + testnum*7 + node, 4096 )
16742 iseed(i*4+3) = mod( 1234 + testnum + node*3, 4096 )
16743 iseed(i*4+4) = mod( 4311 + testnum*10 + node*2, 4096 )
16744 30 CONTINUE
16745 END IF
16746*
16747 DO 100 j = 1, n
16748 DO 90 i = 1, m
16749 h = (j-1)*ldi + i
16750 vals(1) = dbtran( iseed )
16751 iamx = 1
16752 IF( nnodes .GT. 1 ) THEN
16753 DO 40 k = 1, nnodes-1
16754 vals(k+1) = dbtran( iseed(k*4+1) )
16755 IF( dbtabs( vals(k+1) ) .GT. dbtabs( vals(iamx) ) )
16756 $ iamx = k + 1
16757 40 CONTINUE
16758 END IF
16759*
16760* If BLACS have not returned same value we've chosen
16761*
16762 IF( a(i,j) .NE. vals(iamx) ) THEN
16763*
16764* If we have RA and CA arrays
16765*
16766 IF( ldi .NE. -1 ) THEN
16767*
16768* Any number having the same absolute value is a valid max
16769*
16770 k = ibtspnum( scope, ra(h), ca(h), npcol ) + 1
16771 IF( k.GT.0 .AND. k.LE.nnodes ) THEN
16772 error = dbtabs( vals(k) ).NE.dbtabs( vals(iamx) )
16773 IF( .NOT.error ) iamx = k
16774 ELSE
16775 error = .true.
16776 END IF
16777 ELSE
16778*
16779* Error if BLACS answer not same absolute value, or if it
16780* was not really in the numbers being compared
16781*
16782 error = ( dbtabs( a(i,j) ) .NE. dbtabs( vals(iamx) ) )
16783 IF( .NOT.error ) THEN
16784 DO 50 k = 1, nnodes
16785 IF( vals(k) .EQ. a(i,j) ) GOTO 60
16786 50 CONTINUE
16787 error = .true.
16788 60 CONTINUE
16789 ENDIF
16790 END IF
16791*
16792* If the value is in error
16793*
16794 IF( error ) THEN
16795 nerr = nerr + 1
16796 erribuf(1, nerr) = testnum
16797 erribuf(2, nerr) = nnodes
16798 erribuf(3, nerr) = dest
16799 erribuf(4, nerr) = i
16800 erribuf(5, nerr) = j
16801 erribuf(6, nerr) = 5
16802 errdbuf(1, nerr) = a(i,j)
16803 errdbuf(2, nerr) = vals(iamx)
16804 END IF
16805 END IF
16806*
16807* If they are defined, make sure coordinate entries are OK
16808*
16809 IF( ldi .NE. -1 ) THEN
16810 k = ibtspnum( scope, ra(h), ca(h), npcol ) + 1
16811 IF( k.NE.iamx ) THEN
16812*
16813* Make sure more than one proc doesn't have exact same value
16814* (and therefore there may be more than one valid coordinate
16815* for a single value)
16816*
16817 IF( k.GT.nnodes .OR. k.LT.1 ) THEN
16818 error = .true.
16819 ELSE
16820 error = ( vals(k) .NE. vals(iamx) )
16821 END IF
16822 IF( error ) THEN
16823 CALL ibtspcoord( scope, iamx-1, myrow, mycol,
16824 $ npcol, ramx, camx )
16825 IF( ramx .NE. ra(h) ) THEN
16826 nerr = nerr + 1
16827 erribuf(1, nerr) = testnum
16828 erribuf(2, nerr) = nnodes
16829 erribuf(3, nerr) = dest
16830 erribuf(4, nerr) = i
16831 erribuf(5, nerr) = j
16832 erribuf(6, nerr) = -5
16833 errdbuf(1, nerr) = ra(h)
16834 errdbuf(2, nerr) = ramx
16835 END IF
16836 IF( camx .NE. ca(h) ) THEN
16837 nerr = nerr + 1
16838 erribuf(1, nerr) = testnum
16839 erribuf(2, nerr) = nnodes
16840 erribuf(3, nerr) = dest
16841 erribuf(4, nerr) = i
16842 erribuf(5, nerr) = j
16843 erribuf(6, nerr) = -15
16844 errdbuf(1, nerr) = ca(h)
16845 errdbuf(2, nerr) = camx
16846 END IF
16847 END IF
16848 END IF
16849 END IF
16850 90 CONTINUE
16851 100 CONTINUE
16852*
16853 RETURN
16854*
16855* End of DCHKAMX
16856*
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: