20433
20434
20435
20436
20437
20438
20439
20440 INTEGER MEMLEN, NDEST, NGRID, NMAT, NSCOPE, NTOP, OUTNUM, RCLEN,
20441 $ TOPSCOHRNT, TOPSREPEAT, VERB
20442
20443
20444 CHARACTER*1 SCOPE0(NSCOPE), TOP0(NTOP)
20445 INTEGER M0(NMAT), N0(NMAT), LDAS0(NMAT), LDAD0(NMAT), LDI0(NMAT)
20446 INTEGER RDEST0(NDEST), CDEST0(NDEST), CONTEXT0(NGRID)
20447 INTEGER P0(NGRID), Q0(NGRID), ISEED(*), RMEM(RCLEN), CMEM(RCLEN)
20448 COMPLEX MEM(MEMLEN)
20449
20450
20451
20452
20453
20454
20455
20456
20457
20458
20459
20460
20461
20462
20463
20464
20465
20466
20467
20468
20469
20470
20471
20472
20473
20474
20475
20476
20477
20478
20479
20480
20481
20482
20483
20484
20485
20486
20487
20488
20489
20490
20491
20492
20493
20494
20495
20496
20497
20498
20499
20500
20501
20502
20503
20504
20505
20506
20507
20508
20509
20510
20511
20512
20513
20514
20515
20516
20517
20518
20519
20520
20521
20522
20523
20524
20525
20526
20527
20528
20529
20530
20531
20532
20533
20534
20535
20536
20537
20538
20539
20540
20541
20542
20543
20544
20545
20546
20547 LOGICAL ALLPASS, LSAME
20548 INTEGER IBTMYPROC, IBTNPROCS, IBTSIZEOF
20550
20551
20552 EXTERNAL blacs_gridinfo, cgamn2d
20554
20555
20556 CHARACTER*1 SCOPE, TOP
20557 LOGICAL INGRID, TESTOK, ALLRCV
20558 INTEGER APTR, CAPTR, CDEST, CDEST2, CONTEXT, CSIZE, ERRDPTR,
20559 $ ERRIPTR, I, IAM, ICHECKVAL, IDE, IGR, IMA, IPAD, IPOST,
20560 $ IPRE, ISC, ISIZE, ISTART, ISTOP, ITC, ITC1, ITC2, ITO,
20561 $ ITR, ITR1, ITR2, J, K, LDA, LDADST, LDASRC, LDI, M,
20562 $ MAXERR, MYCOL, MYROW, N, NERR, NFAIL, NPCOL, NPROW, NSKIP,
20563 $ PREAPTR, RAPTR, RDEST, RDEST2, SETWHAT, TESTNUM, VALPTR
20564 COMPLEX CHECKVAL
20565
20566
20567
20568
20569
20570 checkval =
cmplx( -0.91e0, -0.71e0 )
20572 checkval = iam * checkval
20575 icheckval = -iam
20576
20577
20578
20579 IF( iam .EQ. 0 ) THEN
20580 WRITE(outnum, *) ' '
20581 WRITE(outnum, *) ' '
20582 WRITE(outnum, 1000 )
20583 IF( verb .GT. 0 ) THEN
20584 WRITE(outnum,*) ' '
20585 WRITE(outnum, 2000) 'NSCOPE:', nscope
20586 WRITE(outnum, 3000) ' SCOPE:', ( scope0(i), i = 1, nscope )
20587 WRITE(outnum, 2000) 'TReps :', topsrepeat
20588 WRITE(outnum, 2000) 'TCohr :', topscohrnt
20589 WRITE(outnum, 2000) 'NTOP :', ntop
20590 WRITE(outnum, 3000) ' TOP :', ( top0(i), i = 1, ntop )
20591 WRITE(outnum, 2000) 'NMAT :', nmat
20592 WRITE(outnum, 2000) ' M :', ( m0(i), i = 1, nmat )
20593 WRITE(outnum, 2000) ' N :', ( n0(i), i = 1, nmat )
20594 WRITE(outnum, 2000) ' LDAS :', ( ldas0(i), i = 1, nmat )
20595 WRITE(outnum, 2000) ' LDAD :', ( ldad0(i), i = 1, nmat )
20596 WRITE(outnum, 2000) ' LDI :', ( ldi0(i), i = 1, nmat )
20597 WRITE(outnum, 2000) 'NDEST :', ndest
20598 WRITE(outnum, 2000) ' RDEST:',( rdest0(i), i = 1, ndest )
20599 WRITE(outnum, 2000) ' CDEST:',( cdest0(i), i = 1, ndest )
20600 WRITE(outnum, 2000) 'NGRIDS:', ngrid
20601 WRITE(outnum, 2000) ' P :', ( p0(i), i = 1, ngrid )
20602 WRITE(outnum, 2000) ' Q :', ( q0(i), i = 1, ngrid )
20603 WRITE(outnum, 2000) 'VERB :', verb
20604 WRITE(outnum,*) ' '
20605 END IF
20606 IF( verb .GT. 1 ) THEN
20607 WRITE(outnum,4000)
20608 WRITE(outnum,5000)
20609 END IF
20610 END IF
20611 IF (topsrepeat.EQ.0) THEN
20612 itr1 = 0
20613 itr2 = 0
20614 ELSE IF (topsrepeat.EQ.1) THEN
20615 itr1 = 1
20616 itr2 = 1
20617 ELSE
20618 itr1 = 0
20619 itr2 = 1
20620 END IF
20621
20622
20623
20624 i = 0
20625 DO 10 ima = 1, nmat
20626 ipad = 4 * m0(ima)
20627 k = n0(ima) * max0( ldas0(ima), ldad0(ima) ) + ipad
20628 IF( k .GT. i ) i = k
20629 10 CONTINUE
20631 maxerr = ( csize * (memlen-i) ) / ( csize*2 + isize*6 )
20632 IF( maxerr .LT. 1 ) THEN
20633 WRITE(outnum,*) 'ERROR: Not enough memory to run MIN tests.'
20634 CALL blacs_abort(-1, 1)
20635 END IF
20636 errdptr = i + 1
20637 erriptr = errdptr + maxerr
20638 nerr = 0
20639 testnum = 0
20640 nfail = 0
20641 nskip = 0
20642
20643
20644
20645 DO 90 igr = 1, ngrid
20646
20647
20648
20649 context = context0(igr)
20650 CALL blacs_gridinfo( context, nprow, npcol, myrow, mycol )
20651 ingrid = ( (myrow.LT.nprow) .AND. (mycol.LT.npcol) )
20652
20653 DO 80 isc = 1, nscope
20654 scope = scope0(isc)
20655 DO 70 ito = 1, ntop
20656 top = top0(ito)
20657
20658
20659
20660
20661 IF(
lsame(top,
'M') )
THEN
20662 setwhat = 13
20663 IF( scope .EQ. 'R' ) THEN
20664 istart = -(npcol - 1)
20665 istop = -istart
20666 ELSE IF (scope .EQ. 'C') THEN
20667 istart = -(nprow - 1)
20668 istop = -istart
20669 ELSE
20670 istart = -(nprow*npcol - 1)
20671 istop = -istart
20672 ENDIF
20673 ELSE IF(
lsame(top,
'T') )
THEN
20674 setwhat = 14
20675 istart = 1
20676 IF( scope .EQ. 'R' ) THEN
20677 istop = npcol - 1
20678 ELSE IF (scope .EQ. 'C') THEN
20679 istop = nprow - 1
20680 ELSE
20681 istop = nprow*npcol - 1
20682 ENDIF
20683 ELSE
20684 setwhat = 0
20685 istart = 1
20686 istop = 1
20687 ENDIF
20688 DO 60 ima = 1, nmat
20689 m = m0(ima)
20690 n = n0(ima)
20691 ldasrc = ldas0(ima)
20692 ldadst = ldad0(ima)
20693 ldi = ldi0(ima)
20694 ipre = 2 * m
20695 ipost = ipre
20696 preaptr = 1
20697 aptr = preaptr + ipre
20698
20699 DO 50 ide = 1, ndest
20700 testnum = testnum + 1
20701 rdest2 = rdest0(ide)
20702 cdest2 = cdest0(ide)
20703
20704
20705
20706
20707 allrcv = ( (rdest2.EQ.-1) .OR. (cdest2.EQ.-1) )
20708 IF( allrcv ) THEN
20709 rdest = nprow - 1
20710 cdest = npcol - 1
20711 IF (topscohrnt.EQ.0) THEN
20712 itr1 = 0
20713 itr2 = 0
20714 ELSE IF (topscohrnt.EQ.1) THEN
20715 itr1 = 1
20716 itr2 = 1
20717 ELSE
20718 itr1 = 0
20719 itr2 = 1
20720 END IF
20721 ELSE
20722 rdest = rdest2
20723 cdest = cdest2
20724 itc1 = 0
20725 itc2 = 0
20726 END IF
20727 IF( rdest.GE.p0(igr) .OR. cdest.GE.q0(igr) ) THEN
20728 nskip = nskip + 1
20729 GOTO 50
20730 END IF
20731
20732 IF( myrow.EQ.rdest .AND. mycol.EQ.cdest ) THEN
20733 lda = ldadst
20734 ELSE
20735 lda = ldasrc
20736 END IF
20737 valptr = aptr + ipost + n * lda
20738 IF( verb .GT. 1 ) THEN
20739 IF( iam .EQ. 0 ) THEN
20740 WRITE(outnum, 6000)
20741 $ testnum, 'RUNNING', scope, top, m, n,
20742 $ ldasrc, ldadst, ldi, rdest2, cdest2,
20743 $ nprow, npcol
20744 END IF
20745 END IF
20746
20747
20748
20749 testok = .true.
20750 IF( ingrid ) THEN
20751 IF( (myrow.EQ.rdest .AND. scope.EQ.'R') .OR.
20752 $ (mycol.EQ.cdest .AND. scope.EQ.'C') .OR.
20753 $ (scope .EQ. 'A') ) THEN
20754
20755 k = nerr
20756 DO 40 itr = itr1, itr2
20757 CALL blacs_set(context, 15, itr)
20758 DO 35 itc = itc1, itc2
20759 CALL blacs_set(context, 16, itc)
20760 DO 30 j = istart, istop
20761 IF( j.EQ.0) GOTO 30
20762 IF( setwhat.NE.0 )
20763 $ CALL blacs_set(context, setwhat, j)
20764
20765
20766
20767
20768 CALL cinitmat(
'G',
'-', m, n, mem(preaptr),
20769 $ lda, ipre, ipost,
20770 $ checkval, testnum,
20771 $ myrow, mycol )
20772
20773
20774
20775 IF( ldi .NE. -1 ) THEN
20776 DO 15 i = 1, n*ldi + ipre + ipost
20777 rmem(i) = icheckval
20778 cmem(i) = icheckval
20779 15 CONTINUE
20780 raptr = 1 + ipre
20781 captr = 1 + ipre
20782 ELSE
20783 DO 20 i = 1, ipre+ipost
20784 rmem(i) = icheckval
20785 cmem(i) = icheckval
20786 20 CONTINUE
20787 raptr = 1
20788 captr = 1
20789 END IF
20790
20791 CALL cgamn2d(context, scope, top, m, n,
20792 $ mem(aptr), lda, rmem(raptr),
20793 $ cmem(captr), ldi,
20794 $ rdest2, cdest2)
20795
20796
20797
20798
20799 IF( (myrow.EQ.rdest .AND. mycol.EQ.cdest)
20800 $ .OR. allrcv ) THEN
20802 $ mem(preaptr), lda, rdest,
20803 $ cdest, myrow, mycol,
20804 $ ipre, ipost, checkval,
20805 $ testnum, maxerr, nerr,
20806 $ mem(erriptr),mem(errdptr))
20807 CALL cchkamn(scope, context, m, n,
20808 $ mem(aptr), lda,
20809 $ rmem(raptr), cmem(captr),
20810 $ ldi, testnum, maxerr,nerr,
20811 $ mem(erriptr),mem(errdptr),
20812 $ iseed, mem(valptr))
20813 CALL crcchk(ipre, ipost, icheckval,
20814 $ m, n, rmem, cmem, ldi,
20815 $ myrow, mycol, testnum,
20816 $ maxerr, nerr,
20817 $ mem(erriptr), mem(errdptr))
20818 END IF
20819 30 CONTINUE
20820 CALL blacs_set(context, 16, 0)
20821 35 CONTINUE
20822 CALL blacs_set(context, 15, 0)
20823 40 CONTINUE
20824 testok = ( k .EQ. nerr )
20825 END IF
20826 END IF
20827
20828 IF( verb .GT. 1 ) THEN
20829 i = nerr
20831 $ mem(erriptr), mem(errdptr), iseed)
20832 IF( iam .EQ. 0 ) THEN
20833 IF( testok .AND. nerr.EQ.i ) THEN
20834 WRITE(outnum,6000)testnum,'PASSED ',
20835 $ scope, top, m, n, ldasrc,
20836 $ ldadst, ldi, rdest2, cdest2,
20837 $ nprow, npcol
20838 ELSE
20839 nfail = nfail + 1
20840 WRITE(outnum,6000)testnum,'FAILED ',
20841 $ scope, top, m, n, ldasrc,
20842 $ ldadst, ldi, rdest2, cdest2,
20843 $ nprow, npcol
20844 END IF
20845 END IF
20846
20847
20848
20849 nerr = 0
20850 END IF
20851 50 CONTINUE
20852 60 CONTINUE
20853 70 CONTINUE
20854 80 CONTINUE
20855 90 CONTINUE
20856
20857 IF( verb .LT. 2 ) THEN
20858 nfail = testnum
20859 CALL cbtcheckin( nfail, outnum, maxerr, nerr, mem(erriptr),
20860 $ mem(errdptr), iseed )
20861 END IF
20862 IF( iam .EQ. 0 ) THEN
20863 IF( verb .GT. 1 ) WRITE(outnum,*) ' '
20864 IF( nfail+nskip .EQ. 0 ) THEN
20865 WRITE(outnum, 7000 ) testnum
20866 ELSE
20867 WRITE(outnum, 8000 ) testnum, testnum-nskip-nfail,
20868 $ nskip, nfail
20869 END IF
20870 END IF
20871
20872
20873
20874 testok =
allpass( (nfail.EQ.0) )
20875
20876 1000 FORMAT('COMPLEX AMN TESTS: BEGIN.' )
20877 2000 FORMAT(1x,a7,3x,10i6)
20878 3000 FORMAT(1x,a7,3x,5x,a1,5x,a1,5x,a1,5x,a1,5x,a1,5x,a1,5x,a1,5x,a1,
20879 $ 5x,a1,5x,a1)
20880 4000 FORMAT(' TEST# STATUS SCOPE TOP M N LDAS LDAD LDI ',
20881 $ 'RDEST CDEST P Q')
20882 5000 FORMAT(' ----- ------- ----- --- ----- ----- ----- ----- ----- ',
20883 $ '----- ----- ---- ----')
20884 6000 FORMAT(i6,1x,a7,5x,a1,3x,a1,7i6,2i5)
20885 7000 FORMAT('COMPLEX AMN TESTS: PASSED ALL',
20886 $ i5, ' TESTS.')
20887 8000 FORMAT('COMPLEX AMN TESTS:',i5,' TESTS;',i5,' PASSED,',
20888 $ i5,' SKIPPED,',i5,' FAILED.')
20889
20890 RETURN
20891
20892
20893
subroutine crcchk(ipre, ipost, padval, m, n, ra, ca, ldi, myrow, mycol, testnum, maxerr, nerr, erribuf, errdbuf)
subroutine cchkpad(uplo, diag, m, n, mem, lda, rsrc, csrc, myrow, mycol, ipre, ipost, checkval, testnum, maxerr, nerr, erribuf, errdbuf)
logical function allpass(thistest)
subroutine cinitmat(uplo, diag, m, n, mem, lda, ipre, ipost, checkval, testnum, myrow, mycol)
subroutine cbtcheckin(nftests, outnum, maxerr, nerr, ierr, cval, tfailed)
subroutine cchkamn(scope, ictxt, m, n, a, lda, ra, ca, ldi, testnum, maxerr, nerr, erribuf, errdbuf, iseed, vals)
integer function ibtnprocs()
integer function ibtmyproc()
integer function ibtsizeof(type)