683
  684
  685
  686
  687
  688
  689
  690
  691
  692
  693
  694
  695      DOUBLE PRECISION   ZERO
  696      parameter( zero = 0.0d0 )
  697
  698      DOUBLE PRECISION   EPS, THRESH
  699      INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA
  700      LOGICAL            FATAL, REWI, TRACE
  701      CHARACTER*7        SNAME
  702
  703      DOUBLE PRECISION   A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
  704     $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),
  705     $                   BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),
  706     $                   C( NMAX, NMAX ), CC( NMAX*NMAX ),
  707     $                   CS( NMAX*NMAX ), CT( NMAX ), G( NMAX )
  708      INTEGER            IDIM( NIDIM )
  709
  710      DOUBLE PRECISION   ALPHA, ALS, BETA, BLS, ERR, ERRMAX
  711      INTEGER            I, IA, IB, ICS, ICU, IM, IN, LAA, LBB, LCC,
  712     $                   LDA, LDAS, LDB, LDBS, LDC, LDCS, M, MS, N, NA,
  713     $                   NARGS, NC, NS
  714      LOGICAL            LEFT, NULL, RESET, SAME
  715      CHARACTER*1        SIDE, SIDES, UPLO, UPLOS
  716      CHARACTER*2        ICHS, ICHU
  717
  718      LOGICAL            ISAME( 13 )
  719
  720      LOGICAL            LDE, LDERES
  722
  724
  725      INTRINSIC          max
  726
  727      INTEGER            INFOT, NOUTC
  728      LOGICAL            LERR, OK
  729
  730      COMMON             /infoc/infot, noutc, ok, lerr
  731
  732      DATA               ichs/'LR'/, ichu/'UL'/
  733
  734
  735      nargs = 12
  736      nc = 0
  737      reset = .true.
  738      errmax = zero
  739
  740      DO 100 im = 1, nidim
  741         m = idim( im )
  742
  743         DO 90 in = 1, nidim
  744            n = idim( in )
  745
  746            ldc = m
  747            IF( ldc.LT.nmax )
  748     $         ldc = ldc + 1
  749
  750            IF( ldc.GT.nmax )
  751     $         GO TO 90
  752            lcc = ldc*n
  753            null = n.LE.0.OR.m.LE.0
  754
  755
  756            ldb = m
  757            IF( ldb.LT.nmax )
  758     $         ldb = ldb + 1
  759
  760            IF( ldb.GT.nmax )
  761     $         GO TO 90
  762            lbb = ldb*n
  763
  764
  765
  766            CALL dmake( 
'GE', 
' ', 
' ', m, n, b, nmax, bb, ldb, reset,
 
  767     $                  zero )
  768
  769            DO 80 ics = 1, 2
  770               side = ichs( ics: ics )
  771               left = side.EQ.'L'
  772
  773               IF( left )THEN
  774                  na = m
  775               ELSE
  776                  na = n
  777               END IF
  778
  779               lda = na
  780               IF( lda.LT.nmax )
  781     $            lda = lda + 1
  782
  783               IF( lda.GT.nmax )
  784     $            GO TO 80
  785               laa = lda*na
  786
  787               DO 70 icu = 1, 2
  788                  uplo = ichu( icu: icu )
  789
  790
  791
  792                  CALL dmake( 
'SY', uplo, 
' ', na, na, a, nmax, aa, lda,
 
  793     $                        reset, zero )
  794
  795                  DO 60 ia = 1, nalf
  796                     alpha = alf( ia )
  797
  798                     DO 50 ib = 1, nbet
  799                        beta = bet( ib )
  800
  801
  802
  803                        CALL dmake( 
'GE', 
' ', 
' ', m, n, c, nmax, cc,
 
  804     $                              ldc, reset, zero )
  805
  806                        nc = nc + 1
  807
  808
  809
  810
  811                        sides = side
  812                        uplos = uplo
  813                        ms = m
  814                        ns = n
  815                        als = alpha
  816                        DO 10 i = 1, laa
  817                           as( i ) = aa( i )
  818   10                   CONTINUE
  819                        ldas = lda
  820                        DO 20 i = 1, lbb
  821                           bs( i ) = bb( i )
  822   20                   CONTINUE
  823                        ldbs = ldb
  824                        bls = beta
  825                        DO 30 i = 1, lcc
  826                           cs( i ) = cc( i )
  827   30                   CONTINUE
  828                        ldcs = ldc
  829
  830
  831
  832                        IF( trace )
  833     $                     WRITE( ntra, fmt = 9995 )nc, sname, side,
  834     $                     uplo, m, n, alpha, lda, ldb, beta, ldc
  835                        IF( rewi )
  836     $                     rewind ntra
  837                        CALL dsymm( side, uplo, m, n, alpha, aa, lda,
 
  838     $                              bb, ldb, beta, cc, ldc )
  839
  840
  841
  842                        IF( .NOT.ok )THEN
  843                           WRITE( nout, fmt = 9994 )
  844                           fatal = .true.
  845                           GO TO 110
  846                        END IF
  847
  848
  849
  850                        isame( 1 ) = sides.EQ.side
  851                        isame( 2 ) = uplos.EQ.uplo
  852                        isame( 3 ) = ms.EQ.m
  853                        isame( 4 ) = ns.EQ.n
  854                        isame( 5 ) = als.EQ.alpha
  855                        isame( 6 ) = 
lde( as, aa, laa )
 
  856                        isame( 7 ) = ldas.EQ.lda
  857                        isame( 8 ) = 
lde( bs, bb, lbb )
 
  858                        isame( 9 ) = ldbs.EQ.ldb
  859                        isame( 10 ) = bls.EQ.beta
  860                        IF( null )THEN
  861                           isame( 11 ) = 
lde( cs, cc, lcc )
 
  862                        ELSE
  863                           isame( 11 ) = 
lderes( 
'GE', 
' ', m, n, cs,
 
  864     $                                   cc, ldc )
  865                        END IF
  866                        isame( 12 ) = ldcs.EQ.ldc
  867
  868
  869
  870
  871                        same = .true.
  872                        DO 40 i = 1, nargs
  873                           same = same.AND.isame( i )
  874                           IF( .NOT.isame( i ) )
  875     $                        WRITE( nout, fmt = 9998 )i
  876   40                   CONTINUE
  877                        IF( .NOT.same )THEN
  878                           fatal = .true.
  879                           GO TO 110
  880                        END IF
  881
  882                        IF( .NOT.null )THEN
  883
  884
  885
  886                           IF( left )THEN
  887                              CALL dmmch( 
'N', 
'N', m, n, m, alpha, a,
 
  888     $                                    nmax, b, nmax, beta, c, nmax,
  889     $                                    ct, g, cc, ldc, eps, err,
  890     $                                    fatal, nout, .true. )
  891                           ELSE
  892                              CALL dmmch( 
'N', 
'N', m, n, n, alpha, b,
 
  893     $                                    nmax, a, nmax, beta, c, nmax,
  894     $                                    ct, g, cc, ldc, eps, err,
  895     $                                    fatal, nout, .true. )
  896                           END IF
  897                           errmax = max( errmax, err )
  898
  899
  900                           IF( fatal )
  901     $                        GO TO 110
  902                        END IF
  903
  904   50                CONTINUE
  905
  906   60             CONTINUE
  907
  908   70          CONTINUE
  909
  910   80       CONTINUE
  911
  912   90    CONTINUE
  913
  914  100 CONTINUE
  915
  916
  917
  918      IF( errmax.LT.thresh )THEN
  919         WRITE( nout, fmt = 9999 )sname, nc
  920      ELSE
  921         WRITE( nout, fmt = 9997 )sname, nc, errmax
  922      END IF
  923      GO TO 120
  924
  925  110 CONTINUE
  926      WRITE( nout, fmt = 9996 )sname
  927      WRITE( nout, fmt = 9995 )nc, sname, side, uplo, m, n, alpha, lda,
  928     $   ldb, beta, ldc
  929
  930  120 CONTINUE
  931      RETURN
  932
  933 9999 FORMAT( ' ', a6, ' PASSED THE COMPUTATIONAL TESTS (', i6, ' CALL',
  934     $      'S)' )
  935 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', i2, ' WAS CH',
  936     $      'ANGED INCORRECTLY *******' )
  937 9997 FORMAT( ' ', a6, ' COMPLETED THE COMPUTATIONAL TESTS (', i6, ' C',
  938     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', f8.2,
  939     $      ' - SUSPECT *******' )
  940 9996 FORMAT( ' ******* ', a6, ' FAILED ON CALL NUMBER:' )
  941 9995 FORMAT( 1x, i6, ': ', a6, '(', 2( '''', a1, ''',' ), 2( i3, ',' ),
  942     $      f4.1, ', A,', i3, ', B,', i3, ',', f4.1, ', C,', i3, ')   ',
  943     $      ' .' )
  944 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
  945     $      '******' )
  946
  947
  948
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)
subroutine dsymm(side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)
DSYMM