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