19787
19788
19789
19790
19791
19792
19793
19794 INTEGER MEMLEN, NDEST, NGRID, NMAT, NSCOPE, NTOP, OUTNUM, RCLEN,
19795 $ TOPSCOHRNT, TOPSREPEAT, VERB
19796
19797
19798 CHARACTER*1 SCOPE0(NSCOPE), TOP0(NTOP)
19799 INTEGER M0(NMAT), N0(NMAT), LDAS0(NMAT), LDAD0(NMAT), LDI0(NMAT)
19800 INTEGER RDEST0(NDEST), CDEST0(NDEST), CONTEXT0(NGRID)
19801 INTEGER P0(NGRID), Q0(NGRID), ISEED(*), RMEM(RCLEN), CMEM(RCLEN)
19802 DOUBLE PRECISION MEM(MEMLEN)
19803
19804
19805
19806
19807
19808
19809
19810
19811
19812
19813
19814
19815
19816
19817
19818
19819
19820
19821
19822
19823
19824
19825
19826
19827
19828
19829
19830
19831
19832
19833
19834
19835
19836
19837
19838
19839
19840
19841
19842
19843
19844
19845
19846
19847
19848
19849
19850
19851
19852
19853
19854
19855
19856
19857
19858
19859
19860
19861
19862
19863
19864
19865
19866
19867
19868
19869
19870
19871
19872
19873
19874
19875
19876
19877
19878
19879
19880
19881
19882
19883
19884
19885
19886
19887
19888
19889
19890
19891
19892
19893
19894
19895
19896
19897
19898
19899
19900
19901 LOGICAL ALLPASS, LSAME
19902 INTEGER IBTMYPROC, IBTNPROCS, IBTSIZEOF
19904
19905
19906 EXTERNAL blacs_gridinfo, dgamn2d
19908
19909
19910 CHARACTER*1 SCOPE, TOP
19911 LOGICAL INGRID, TESTOK, ALLRCV
19912 INTEGER APTR, CAPTR, CDEST, CDEST2, CONTEXT, DSIZE, ERRDPTR,
19913 $ ERRIPTR, I, IAM, ICHECKVAL, IDE, IGR, IMA, IPAD, IPOST,
19914 $ IPRE, ISC, ISIZE, ISTART, ISTOP, ITC, ITC1, ITC2, ITO,
19915 $ ITR, ITR1, ITR2, J, K, LDA, LDADST, LDASRC, LDI, M,
19916 $ MAXERR, MYCOL, MYROW, N, NERR, NFAIL, NPCOL, NPROW, NSKIP,
19917 $ PREAPTR, RAPTR, RDEST, RDEST2, SETWHAT, TESTNUM, VALPTR
19918 DOUBLE PRECISION CHECKVAL
19919
19920
19921
19922
19923
19924 checkval = -0.81d0
19926 checkval = iam * checkval
19929 icheckval = -iam
19930
19931
19932
19933 IF( iam .EQ. 0 ) THEN
19934 WRITE(outnum, *) ' '
19935 WRITE(outnum, *) ' '
19936 WRITE(outnum, 1000 )
19937 IF( verb .GT. 0 ) THEN
19938 WRITE(outnum,*) ' '
19939 WRITE(outnum, 2000) 'NSCOPE:', nscope
19940 WRITE(outnum, 3000) ' SCOPE:', ( scope0(i), i = 1, nscope )
19941 WRITE(outnum, 2000) 'TReps :', topsrepeat
19942 WRITE(outnum, 2000) 'TCohr :', topscohrnt
19943 WRITE(outnum, 2000) 'NTOP :', ntop
19944 WRITE(outnum, 3000) ' TOP :', ( top0(i), i = 1, ntop )
19945 WRITE(outnum, 2000) 'NMAT :', nmat
19946 WRITE(outnum, 2000) ' M :', ( m0(i), i = 1, nmat )
19947 WRITE(outnum, 2000) ' N :', ( n0(i), i = 1, nmat )
19948 WRITE(outnum, 2000) ' LDAS :', ( ldas0(i), i = 1, nmat )
19949 WRITE(outnum, 2000) ' LDAD :', ( ldad0(i), i = 1, nmat )
19950 WRITE(outnum, 2000) ' LDI :', ( ldi0(i), i = 1, nmat )
19951 WRITE(outnum, 2000) 'NDEST :', ndest
19952 WRITE(outnum, 2000) ' RDEST:',( rdest0(i), i = 1, ndest )
19953 WRITE(outnum, 2000) ' CDEST:',( cdest0(i), i = 1, ndest )
19954 WRITE(outnum, 2000) 'NGRIDS:', ngrid
19955 WRITE(outnum, 2000) ' P :', ( p0(i), i = 1, ngrid )
19956 WRITE(outnum, 2000) ' Q :', ( q0(i), i = 1, ngrid )
19957 WRITE(outnum, 2000) 'VERB :', verb
19958 WRITE(outnum,*) ' '
19959 END IF
19960 IF( verb .GT. 1 ) THEN
19961 WRITE(outnum,4000)
19962 WRITE(outnum,5000)
19963 END IF
19964 END IF
19965 IF (topsrepeat.EQ.0) THEN
19966 itr1 = 0
19967 itr2 = 0
19968 ELSE IF (topsrepeat.EQ.1) THEN
19969 itr1 = 1
19970 itr2 = 1
19971 ELSE
19972 itr1 = 0
19973 itr2 = 1
19974 END IF
19975
19976
19977
19978 i = 0
19979 DO 10 ima = 1, nmat
19980 ipad = 4 * m0(ima)
19981 k = n0(ima) * max0( ldas0(ima), ldad0(ima) ) + ipad
19982 IF( k .GT. i ) i = k
19983 10 CONTINUE
19985 maxerr = ( dsize * (memlen-i) ) / ( dsize*2 + isize*6 )
19986 IF( maxerr .LT. 1 ) THEN
19987 WRITE(outnum,*) 'ERROR: Not enough memory to run MIN tests.'
19988 CALL blacs_abort(-1, 1)
19989 END IF
19990 errdptr = i + 1
19991 erriptr = errdptr + maxerr
19992 nerr = 0
19993 testnum = 0
19994 nfail = 0
19995 nskip = 0
19996
19997
19998
19999 DO 90 igr = 1, ngrid
20000
20001
20002
20003 context = context0(igr)
20004 CALL blacs_gridinfo( context, nprow, npcol, myrow, mycol )
20005 ingrid = ( (myrow.LT.nprow) .AND. (mycol.LT.npcol) )
20006
20007 DO 80 isc = 1, nscope
20008 scope = scope0(isc)
20009 DO 70 ito = 1, ntop
20010 top = top0(ito)
20011
20012
20013
20014
20015 IF(
lsame(top,
'M') )
THEN
20016 setwhat = 13
20017 IF( scope .EQ. 'R' ) THEN
20018 istart = -(npcol - 1)
20019 istop = -istart
20020 ELSE IF (scope .EQ. 'C') THEN
20021 istart = -(nprow - 1)
20022 istop = -istart
20023 ELSE
20024 istart = -(nprow*npcol - 1)
20025 istop = -istart
20026 ENDIF
20027 ELSE IF(
lsame(top,
'T') )
THEN
20028 setwhat = 14
20029 istart = 1
20030 IF( scope .EQ. 'R' ) THEN
20031 istop = npcol - 1
20032 ELSE IF (scope .EQ. 'C') THEN
20033 istop = nprow - 1
20034 ELSE
20035 istop = nprow*npcol - 1
20036 ENDIF
20037 ELSE
20038 setwhat = 0
20039 istart = 1
20040 istop = 1
20041 ENDIF
20042 DO 60 ima = 1, nmat
20043 m = m0(ima)
20044 n = n0(ima)
20045 ldasrc = ldas0(ima)
20046 ldadst = ldad0(ima)
20047 ldi = ldi0(ima)
20048 ipre = 2 * m
20049 ipost = ipre
20050 preaptr = 1
20051 aptr = preaptr + ipre
20052
20053 DO 50 ide = 1, ndest
20054 testnum = testnum + 1
20055 rdest2 = rdest0(ide)
20056 cdest2 = cdest0(ide)
20057
20058
20059
20060
20061 allrcv = ( (rdest2.EQ.-1) .OR. (cdest2.EQ.-1) )
20062 IF( allrcv ) THEN
20063 rdest = nprow - 1
20064 cdest = npcol - 1
20065 IF (topscohrnt.EQ.0) THEN
20066 itr1 = 0
20067 itr2 = 0
20068 ELSE IF (topscohrnt.EQ.1) THEN
20069 itr1 = 1
20070 itr2 = 1
20071 ELSE
20072 itr1 = 0
20073 itr2 = 1
20074 END IF
20075 ELSE
20076 rdest = rdest2
20077 cdest = cdest2
20078 itc1 = 0
20079 itc2 = 0
20080 END IF
20081 IF( rdest.GE.p0(igr) .OR. cdest.GE.q0(igr) ) THEN
20082 nskip = nskip + 1
20083 GOTO 50
20084 END IF
20085
20086 IF( myrow.EQ.rdest .AND. mycol.EQ.cdest ) THEN
20087 lda = ldadst
20088 ELSE
20089 lda = ldasrc
20090 END IF
20091 valptr = aptr + ipost + n * lda
20092 IF( verb .GT. 1 ) THEN
20093 IF( iam .EQ. 0 ) THEN
20094 WRITE(outnum, 6000)
20095 $ testnum, 'RUNNING', scope, top, m, n,
20096 $ ldasrc, ldadst, ldi, rdest2, cdest2,
20097 $ nprow, npcol
20098 END IF
20099 END IF
20100
20101
20102
20103 testok = .true.
20104 IF( ingrid ) THEN
20105 IF( (myrow.EQ.rdest .AND. scope.EQ.'R') .OR.
20106 $ (mycol.EQ.cdest .AND. scope.EQ.'C') .OR.
20107 $ (scope .EQ. 'A') ) THEN
20108
20109 k = nerr
20110 DO 40 itr = itr1, itr2
20111 CALL blacs_set(context, 15, itr)
20112 DO 35 itc = itc1, itc2
20113 CALL blacs_set(context, 16, itc)
20114 DO 30 j = istart, istop
20115 IF( j.EQ.0) GOTO 30
20116 IF( setwhat.NE.0 )
20117 $ CALL blacs_set(context, setwhat, j)
20118
20119
20120
20121
20122 CALL dinitmat(
'G',
'-', m, n, mem(preaptr),
20123 $ lda, ipre, ipost,
20124 $ checkval, testnum,
20125 $ myrow, mycol )
20126
20127
20128
20129 IF( ldi .NE. -1 ) THEN
20130 DO 15 i = 1, n*ldi + ipre + ipost
20131 rmem(i) = icheckval
20132 cmem(i) = icheckval
20133 15 CONTINUE
20134 raptr = 1 + ipre
20135 captr = 1 + ipre
20136 ELSE
20137 DO 20 i = 1, ipre+ipost
20138 rmem(i) = icheckval
20139 cmem(i) = icheckval
20140 20 CONTINUE
20141 raptr = 1
20142 captr = 1
20143 END IF
20144
20145 CALL dgamn2d(context, scope, top, m, n,
20146 $ mem(aptr), lda, rmem(raptr),
20147 $ cmem(captr), ldi,
20148 $ rdest2, cdest2)
20149
20150
20151
20152
20153 IF( (myrow.EQ.rdest .AND. mycol.EQ.cdest)
20154 $ .OR. allrcv ) THEN
20156 $ mem(preaptr), lda, rdest,
20157 $ cdest, myrow, mycol,
20158 $ ipre, ipost, checkval,
20159 $ testnum, maxerr, nerr,
20160 $ mem(erriptr),mem(errdptr))
20161 CALL dchkamn(scope, context, m, n,
20162 $ mem(aptr), lda,
20163 $ rmem(raptr), cmem(captr),
20164 $ ldi, testnum, maxerr,nerr,
20165 $ mem(erriptr),mem(errdptr),
20166 $ iseed, mem(valptr))
20167 CALL drcchk(ipre, ipost, icheckval,
20168 $ m, n, rmem, cmem, ldi,
20169 $ myrow, mycol, testnum,
20170 $ maxerr, nerr,
20171 $ mem(erriptr), mem(errdptr))
20172 END IF
20173 30 CONTINUE
20174 CALL blacs_set(context, 16, 0)
20175 35 CONTINUE
20176 CALL blacs_set(context, 15, 0)
20177 40 CONTINUE
20178 testok = ( k .EQ. nerr )
20179 END IF
20180 END IF
20181
20182 IF( verb .GT. 1 ) THEN
20183 i = nerr
20185 $ mem(erriptr), mem(errdptr), iseed)
20186 IF( iam .EQ. 0 ) THEN
20187 IF( testok .AND. nerr.EQ.i ) THEN
20188 WRITE(outnum,6000)testnum,'PASSED ',
20189 $ scope, top, m, n, ldasrc,
20190 $ ldadst, ldi, rdest2, cdest2,
20191 $ nprow, npcol
20192 ELSE
20193 nfail = nfail + 1
20194 WRITE(outnum,6000)testnum,'FAILED ',
20195 $ scope, top, m, n, ldasrc,
20196 $ ldadst, ldi, rdest2, cdest2,
20197 $ nprow, npcol
20198 END IF
20199 END IF
20200
20201
20202
20203 nerr = 0
20204 END IF
20205 50 CONTINUE
20206 60 CONTINUE
20207 70 CONTINUE
20208 80 CONTINUE
20209 90 CONTINUE
20210
20211 IF( verb .LT. 2 ) THEN
20212 nfail = testnum
20213 CALL dbtcheckin( nfail, outnum, maxerr, nerr, mem(erriptr),
20214 $ mem(errdptr), iseed )
20215 END IF
20216 IF( iam .EQ. 0 ) THEN
20217 IF( verb .GT. 1 ) WRITE(outnum,*) ' '
20218 IF( nfail+nskip .EQ. 0 ) THEN
20219 WRITE(outnum, 7000 ) testnum
20220 ELSE
20221 WRITE(outnum, 8000 ) testnum, testnum-nskip-nfail,
20222 $ nskip, nfail
20223 END IF
20224 END IF
20225
20226
20227
20228 testok =
allpass( (nfail.EQ.0) )
20229
20230 1000 FORMAT('DOUBLE PRECISION AMN TESTS: BEGIN.' )
20231 2000 FORMAT(1x,a7,3x,10i6)
20232 3000 FORMAT(1x,a7,3x,5x,a1,5x,a1,5x,a1,5x,a1,5x,a1,5x,a1,5x,a1,5x,a1,
20233 $ 5x,a1,5x,a1)
20234 4000 FORMAT(' TEST# STATUS SCOPE TOP M N LDAS LDAD LDI ',
20235 $ 'RDEST CDEST P Q')
20236 5000 FORMAT(' ----- ------- ----- --- ----- ----- ----- ----- ----- ',
20237 $ '----- ----- ---- ----')
20238 6000 FORMAT(i6,1x,a7,5x,a1,3x,a1,7i6,2i5)
20239 7000 FORMAT('DOUBLE PRECISION AMN TESTS: PASSED ALL',
20240 $ i5, ' TESTS.')
20241 8000 FORMAT('DOUBLE PRECISION AMN TESTS:',i5,' TESTS;',i5,' PASSED,',
20242 $ i5,' SKIPPED,',i5,' FAILED.')
20243
20244 RETURN
20245
20246
20247
logical function allpass(thistest)
subroutine dchkpad(uplo, diag, m, n, mem, lda, rsrc, csrc, myrow, mycol, ipre, ipost, checkval, testnum, maxerr, nerr, erribuf, errdbuf)
subroutine drcchk(ipre, ipost, padval, m, n, ra, ca, ldi, myrow, mycol, testnum, maxerr, nerr, erribuf, errdbuf)
subroutine dinitmat(uplo, diag, m, n, mem, lda, ipre, ipost, checkval, testnum, myrow, mycol)
subroutine dchkamn(scope, ictxt, m, n, a, lda, ra, ca, ldi, testnum, maxerr, nerr, erribuf, errdbuf, iseed, vals)
subroutine dbtcheckin(nftests, outnum, maxerr, nerr, ierr, dval, tfailed)
integer function ibtnprocs()
integer function ibtmyproc()
integer function ibtsizeof(type)