436
  437
  438
  439
  440
  441
  442
  443
  444
  445
  446
  447
  448      DOUBLE PRECISION   ZERO
  449      parameter( zero = 0.0d0 )
  450
  451      DOUBLE PRECISION   EPS, THRESH
  452      INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER
  453      LOGICAL            FATAL, REWI, TRACE
  454      CHARACTER*13       SNAME
  455
  456      DOUBLE PRECISION   A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
  457     $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),
  458     $                   BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),
  459     $                   C( NMAX, NMAX ), CC( NMAX*NMAX ),
  460     $                   CS( NMAX*NMAX ), CT( NMAX ), G( NMAX )
  461      INTEGER            IDIM( NIDIM )
  462
  463      DOUBLE PRECISION   ALPHA, ALS, BETA, BLS, ERR, ERRMAX
  464      INTEGER            I, IA, IB, ICA, ICB, IK, IM, IN, K, KS, LAA,
  465     $                   LBB, LCC, LDA, LDAS, LDB, LDBS, LDC, LDCS, M,
  466     $                   MA, MB, MS, N, NA, NARGS, NB, NC, NS
  467      LOGICAL            NULL, RESET, SAME, TRANA, TRANB
  468      CHARACTER*1        TRANAS, TRANBS, TRANSA, TRANSB
  469      CHARACTER*3        ICH
  470
  471      LOGICAL            ISAME( 13 )
  472
  473      LOGICAL            LDE, LDERES
  475
  477
  478      INTRINSIC          max
  479
  480      INTEGER            INFOT, NOUTC
  481      LOGICAL             OK
  482
  483      COMMON             /infoc/infot, noutc, ok
  484
  485      DATA               ich/'NTC'/
  486
  487
  488      nargs = 13
  489      nc = 0
  490      reset = .true.
  491      errmax = zero
  492
  493      DO 110 im = 1, nidim
  494         m = idim( im )
  495
  496         DO 100 in = 1, nidim
  497            n = idim( in )
  498
  499            ldc = m
  500            IF( ldc.LT.nmax )
  501     $         ldc = ldc + 1
  502
  503            IF( ldc.GT.nmax )
  504     $         GO TO 100
  505            lcc = ldc*n
  506            null = n.LE.0.OR.m.LE.0
  507
  508            DO 90 ik = 1, nidim
  509               k = idim( ik )
  510
  511               DO 80 ica = 1, 3
  512                  transa = ich( ica: ica )
  513                  trana = transa.EQ.'T'.OR.transa.EQ.'C'
  514
  515                  IF( trana )THEN
  516                     ma = k
  517                     na = m
  518                  ELSE
  519                     ma = m
  520                     na = k
  521                  END IF
  522
  523                  lda = ma
  524                  IF( lda.LT.nmax )
  525     $               lda = lda + 1
  526
  527                  IF( lda.GT.nmax )
  528     $               GO TO 80
  529                  laa = lda*na
  530
  531
  532
  533                  CALL dmake( 
'GE', 
' ', 
' ', ma, na, a, nmax, aa, lda,
 
  534     $                        reset, zero )
  535
  536                  DO 70 icb = 1, 3
  537                     transb = ich( icb: icb )
  538                     tranb = transb.EQ.'T'.OR.transb.EQ.'C'
  539
  540                     IF( tranb )THEN
  541                        mb = n
  542                        nb = k
  543                     ELSE
  544                        mb = k
  545                        nb = n
  546                     END IF
  547
  548                     ldb = mb
  549                     IF( ldb.LT.nmax )
  550     $                  ldb = ldb + 1
  551
  552                     IF( ldb.GT.nmax )
  553     $                  GO TO 70
  554                     lbb = ldb*nb
  555
  556
  557
  558                     CALL dmake( 
'GE', 
' ', 
' ', mb, nb, b, nmax, bb,
 
  559     $                           ldb, reset, zero )
  560
  561                     DO 60 ia = 1, nalf
  562                        alpha = alf( ia )
  563
  564                        DO 50 ib = 1, nbet
  565                           beta = bet( ib )
  566
  567
  568
  569                           CALL dmake( 
'GE', 
' ', 
' ', m, n, c, nmax,
 
  570     $                                 cc, ldc, reset, zero )
  571
  572                           nc = nc + 1
  573
  574
  575
  576
  577                           tranas = transa
  578                           tranbs = transb
  579                           ms = m
  580                           ns = n
  581                           ks = k
  582                           als = alpha
  583                           DO 10 i = 1, laa
  584                              as( i ) = aa( i )
  585   10                      CONTINUE
  586                           ldas = lda
  587                           DO 20 i = 1, lbb
  588                              bs( i ) = bb( i )
  589   20                      CONTINUE
  590                           ldbs = ldb
  591                           bls = beta
  592                           DO 30 i = 1, lcc
  593                              cs( i ) = cc( i )
  594   30                      CONTINUE
  595                           ldcs = ldc
  596
  597
  598
  599                           IF( trace )
  600     $                        
CALL dprcn1(ntra, nc, sname, iorder,
 
  601     $                        transa, transb, m, n, k, alpha, lda,
  602     $                        ldb, beta, ldc)
  603                           IF( rewi )
  604     $                        rewind ntra
  605                           CALL cdgemm( iorder, transa, transb, m, n,
  606     $                                   k, alpha, aa, lda, bb, ldb,
  607     $                   beta, cc, ldc )
  608
  609
  610
  611                           IF( .NOT.ok )THEN
  612                              WRITE( nout, fmt = 9994 )
  613                              fatal = .true.
  614                              GO TO 120
  615                           END IF
  616
  617
  618
  619                           isame( 1 ) = transa.EQ.tranas
  620                           isame( 2 ) = transb.EQ.tranbs
  621                           isame( 3 ) = ms.EQ.m
  622                           isame( 4 ) = ns.EQ.n
  623                           isame( 5 ) = ks.EQ.k
  624                           isame( 6 ) = als.EQ.alpha
  625                           isame( 7 ) = 
lde( as, aa, laa )
 
  626                           isame( 8 ) = ldas.EQ.lda
  627                           isame( 9 ) = 
lde( bs, bb, lbb )
 
  628                           isame( 10 ) = ldbs.EQ.ldb
  629                           isame( 11 ) = bls.EQ.beta
  630                           IF( null )THEN
  631                              isame( 12 ) = 
lde( cs, cc, lcc )
 
  632                           ELSE
  633                              isame( 12 ) = 
lderes( 
'GE', 
' ', m, n, cs,
 
  634     $                                      cc, ldc )
  635                           END IF
  636                           isame( 13 ) = ldcs.EQ.ldc
  637
  638
  639
  640
  641                           same = .true.
  642                           DO 40 i = 1, nargs
  643                              same = same.AND.isame( i )
  644                              IF( .NOT.isame( i ) )
  645     $                           WRITE( nout, fmt = 9998 )i
  646   40                      CONTINUE
  647                           IF( .NOT.same )THEN
  648                              fatal = .true.
  649                              GO TO 120
  650                           END IF
  651
  652                           IF( .NOT.null )THEN
  653
  654
  655
  656                              CALL dmmch( transa, transb, m, n, k,
 
  657     $                                    alpha, a, nmax, b, nmax, beta,
  658     $                                    c, nmax, ct, g, cc, ldc, eps,
  659     $                                    err, fatal, nout, .true. )
  660                              errmax = max( errmax, err )
  661
  662
  663                              IF( fatal )
  664     $                           GO TO 120
  665                           END IF
  666
  667   50                   CONTINUE
  668
  669   60                CONTINUE
  670
  671   70             CONTINUE
  672
  673   80          CONTINUE
  674
  675   90       CONTINUE
  676
  677  100    CONTINUE
  678
  679  110 CONTINUE
  680
  681
  682
  683      IF( errmax.LT.thresh )THEN
  684         IF ( iorder.EQ.0) WRITE( nout, fmt = 10000 )sname, nc
  685         IF ( iorder.EQ.1) WRITE( nout, fmt = 10001 )sname, nc
  686      ELSE
  687         IF ( iorder.EQ.0) WRITE( nout, fmt = 10002 )sname, nc, errmax
  688         IF ( iorder.EQ.1) WRITE( nout, fmt = 10003 )sname, nc, errmax
  689      END IF
  690      GO TO 130
  691
  692  120 CONTINUE
  693      WRITE( nout, fmt = 9996 )sname
  694      CALL dprcn1(nout, nc, sname, iorder, transa, transb,
 
  695     $           m, n, k, alpha, lda, ldb, beta, ldc)
  696
  697  130 CONTINUE
  698      RETURN
  699
  70010003 FORMAT( ' ', a13,' COMPLETED THE ROW-MAJOR    COMPUTATIONAL ',
  701     $ 'TESTS (', i6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  702     $ 'RATIO ', f8.2, ' - SUSPECT *******' )
  70310002 FORMAT( ' ', a13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
  704     $ 'TESTS (', i6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
  705     $ 'RATIO ', f8.2, ' - SUSPECT *******' )
  70610001 FORMAT( ' ', a13,' PASSED THE ROW-MAJOR    COMPUTATIONAL TESTS',
  707     $ ' (', i6, ' CALL', 'S)' )
  70810000 FORMAT( ' ', a13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
  709     $ ' (', i6, ' CALL', 'S)' )
  710 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', i2, ' WAS CH',
  711     $      'ANGED INCORRECTLY *******' )
  712 9996 FORMAT( ' ******* ', a13,' FAILED ON CALL NUMBER:' )
  713 9995 FORMAT( 1x, i6, ': ', a13,'(''', a1, ''',''', a1, ''',',
  714     $      3( i3, ',' ), f4.1, ', A,', i3, ', B,', i3, ',', f4.1, ', ',
  715     $      'C,', i3, ').' )
  716 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
  717     $      '******' )
  718
  719
  720
subroutine dprcn1(nout, nc, sname, iorder, transa, transb, m, n, k, alpha, lda, ldb, beta, ldc)
logical function lde(ri, rj, lr)
logical function lderes(type, uplo, m, n, aa, as, lda)
subroutine dmake(type, uplo, diag, m, n, a, nmax, aa, lda, kl, ku, reset, transl)
subroutine dmmch(transa, transb, m, n, kk, alpha, a, lda, b, ldb, beta, c, ldc, ct, g, cc, ldcc, eps, err, fatal, nout, mv)