Home | History | Annotate | Download | only in testing
      1 *> \brief \b DBLAT3
      2 *
      3 *  =========== DOCUMENTATION ===========
      4 *
      5 * Online html documentation available at 
      6 *            http://www.netlib.org/lapack/explore-html/ 
      7 *
      8 *  Definition:
      9 *  ===========
     10 *
     11 *       PROGRAM DBLAT3
     12 * 
     13 *
     14 *> \par Purpose:
     15 *  =============
     16 *>
     17 *> \verbatim
     18 *>
     19 *> Test program for the DOUBLE PRECISION Level 3 Blas.
     20 *>
     21 *> The program must be driven by a short data file. The first 14 records
     22 *> of the file are read using list-directed input, the last 6 records
     23 *> are read using the format ( A6, L2 ). An annotated example of a data
     24 *> file can be obtained by deleting the first 3 characters from the
     25 *> following 20 lines:
     26 *> 'dblat3.out'      NAME OF SUMMARY OUTPUT FILE
     27 *> 6                 UNIT NUMBER OF SUMMARY FILE
     28 *> 'DBLAT3.SNAP'     NAME OF SNAPSHOT OUTPUT FILE
     29 *> -1                UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0)
     30 *> F        LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD.
     31 *> F        LOGICAL FLAG, T TO STOP ON FAILURES.
     32 *> T        LOGICAL FLAG, T TO TEST ERROR EXITS.
     33 *> 16.0     THRESHOLD VALUE OF TEST RATIO
     34 *> 6                 NUMBER OF VALUES OF N
     35 *> 0 1 2 3 5 9       VALUES OF N
     36 *> 3                 NUMBER OF VALUES OF ALPHA
     37 *> 0.0 1.0 0.7       VALUES OF ALPHA
     38 *> 3                 NUMBER OF VALUES OF BETA
     39 *> 0.0 1.0 1.3       VALUES OF BETA
     40 *> DGEMM  T PUT F FOR NO TEST. SAME COLUMNS.
     41 *> DSYMM  T PUT F FOR NO TEST. SAME COLUMNS.
     42 *> DTRMM  T PUT F FOR NO TEST. SAME COLUMNS.
     43 *> DTRSM  T PUT F FOR NO TEST. SAME COLUMNS.
     44 *> DSYRK  T PUT F FOR NO TEST. SAME COLUMNS.
     45 *> DSYR2K T PUT F FOR NO TEST. SAME COLUMNS.
     46 *>
     47 *> Further Details
     48 *> ===============
     49 *>
     50 *> See:
     51 *>
     52 *>    Dongarra J. J., Du Croz J. J., Duff I. S. and Hammarling S.
     53 *>    A Set of Level 3 Basic Linear Algebra Subprograms.
     54 *>
     55 *>    Technical Memorandum No.88 (Revision 1), Mathematics and
     56 *>    Computer Science Division, Argonne National Laboratory, 9700
     57 *>    South Cass Avenue, Argonne, Illinois 60439, US.
     58 *>
     59 *> -- Written on 8-February-1989.
     60 *>    Jack Dongarra, Argonne National Laboratory.
     61 *>    Iain Duff, AERE Harwell.
     62 *>    Jeremy Du Croz, Numerical Algorithms Group Ltd.
     63 *>    Sven Hammarling, Numerical Algorithms Group Ltd.
     64 *>
     65 *>    10-9-00:  Change STATUS='NEW' to 'UNKNOWN' so that the testers
     66 *>              can be run multiple times without deleting generated
     67 *>              output files (susan)
     68 *> \endverbatim
     69 *
     70 *  Authors:
     71 *  ========
     72 *
     73 *> \author Univ. of Tennessee 
     74 *> \author Univ. of California Berkeley 
     75 *> \author Univ. of Colorado Denver 
     76 *> \author NAG Ltd. 
     77 *
     78 *> \date April 2012
     79 *
     80 *> \ingroup double_blas_testing
     81 *
     82 *  =====================================================================
     83       PROGRAM DBLAT3
     84 *
     85 *  -- Reference BLAS test routine (version 3.4.1) --
     86 *  -- Reference BLAS is a software package provided by Univ. of Tennessee,    --
     87 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
     88 *     April 2012
     89 *
     90 *  =====================================================================
     91 *
     92 *     .. Parameters ..
     93       INTEGER            NIN
     94       PARAMETER          ( NIN = 5 )
     95       INTEGER            NSUBS
     96       PARAMETER          ( NSUBS = 6 )
     97       DOUBLE PRECISION   ZERO, ONE
     98       PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
     99       INTEGER            NMAX
    100       PARAMETER          ( NMAX = 65 )
    101       INTEGER            NIDMAX, NALMAX, NBEMAX
    102       PARAMETER          ( NIDMAX = 9, NALMAX = 7, NBEMAX = 7 )
    103 *     .. Local Scalars ..
    104       DOUBLE PRECISION   EPS, ERR, THRESH
    105       INTEGER            I, ISNUM, J, N, NALF, NBET, NIDIM, NOUT, NTRA
    106       LOGICAL            FATAL, LTESTT, REWI, SAME, SFATAL, TRACE,
    107      $                   TSTERR
    108       CHARACTER*1        TRANSA, TRANSB
    109       CHARACTER*6        SNAMET
    110       CHARACTER*32       SNAPS, SUMMRY
    111 *     .. Local Arrays ..
    112       DOUBLE PRECISION   AA( NMAX*NMAX ), AB( NMAX, 2*NMAX ),
    113      $                   ALF( NALMAX ), AS( NMAX*NMAX ),
    114      $                   BB( NMAX*NMAX ), BET( NBEMAX ),
    115      $                   BS( NMAX*NMAX ), C( NMAX, NMAX ),
    116      $                   CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ),
    117      $                   G( NMAX ), W( 2*NMAX )
    118       INTEGER            IDIM( NIDMAX )
    119       LOGICAL            LTEST( NSUBS )
    120       CHARACTER*6        SNAMES( NSUBS )
    121 *     .. External Functions ..
    122       DOUBLE PRECISION   DDIFF
    123       LOGICAL            LDE
    124       EXTERNAL           DDIFF, LDE
    125 *     .. External Subroutines ..
    126       EXTERNAL           DCHK1, DCHK2, DCHK3, DCHK4, DCHK5, DCHKE, DMMCH
    127 *     .. Intrinsic Functions ..
    128       INTRINSIC          MAX, MIN
    129 *     .. Scalars in Common ..
    130       INTEGER            INFOT, NOUTC
    131       LOGICAL            LERR, OK
    132       CHARACTER*6        SRNAMT
    133 *     .. Common blocks ..
    134       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
    135       COMMON             /SRNAMC/SRNAMT
    136 *     .. Data statements ..
    137       DATA               SNAMES/'DGEMM ', 'DSYMM ', 'DTRMM ', 'DTRSM ',
    138      $                   'DSYRK ', 'DSYR2K'/
    139 *     .. Executable Statements ..
    140 *
    141 *     Read name and unit number for summary output file and open file.
    142 *
    143       READ( NIN, FMT = * )SUMMRY
    144       READ( NIN, FMT = * )NOUT
    145       OPEN( NOUT, FILE = SUMMRY, STATUS = 'UNKNOWN' )
    146       NOUTC = NOUT
    147 *
    148 *     Read name and unit number for snapshot output file and open file.
    149 *
    150       READ( NIN, FMT = * )SNAPS
    151       READ( NIN, FMT = * )NTRA
    152       TRACE = NTRA.GE.0
    153       IF( TRACE )THEN
    154          OPEN( NTRA, FILE = SNAPS, STATUS = 'UNKNOWN' )
    155       END IF
    156 *     Read the flag that directs rewinding of the snapshot file.
    157       READ( NIN, FMT = * )REWI
    158       REWI = REWI.AND.TRACE
    159 *     Read the flag that directs stopping on any failure.
    160       READ( NIN, FMT = * )SFATAL
    161 *     Read the flag that indicates whether error exits are to be tested.
    162       READ( NIN, FMT = * )TSTERR
    163 *     Read the threshold value of the test ratio
    164       READ( NIN, FMT = * )THRESH
    165 *
    166 *     Read and check the parameter values for the tests.
    167 *
    168 *     Values of N
    169       READ( NIN, FMT = * )NIDIM
    170       IF( NIDIM.LT.1.OR.NIDIM.GT.NIDMAX )THEN
    171          WRITE( NOUT, FMT = 9997 )'N', NIDMAX
    172          GO TO 220
    173       END IF
    174       READ( NIN, FMT = * )( IDIM( I ), I = 1, NIDIM )
    175       DO 10 I = 1, NIDIM
    176          IF( IDIM( I ).LT.0.OR.IDIM( I ).GT.NMAX )THEN
    177             WRITE( NOUT, FMT = 9996 )NMAX
    178             GO TO 220
    179          END IF
    180    10 CONTINUE
    181 *     Values of ALPHA
    182       READ( NIN, FMT = * )NALF
    183       IF( NALF.LT.1.OR.NALF.GT.NALMAX )THEN
    184          WRITE( NOUT, FMT = 9997 )'ALPHA', NALMAX
    185          GO TO 220
    186       END IF
    187       READ( NIN, FMT = * )( ALF( I ), I = 1, NALF )
    188 *     Values of BETA
    189       READ( NIN, FMT = * )NBET
    190       IF( NBET.LT.1.OR.NBET.GT.NBEMAX )THEN
    191          WRITE( NOUT, FMT = 9997 )'BETA', NBEMAX
    192          GO TO 220
    193       END IF
    194       READ( NIN, FMT = * )( BET( I ), I = 1, NBET )
    195 *
    196 *     Report values of parameters.
    197 *
    198       WRITE( NOUT, FMT = 9995 )
    199       WRITE( NOUT, FMT = 9994 )( IDIM( I ), I = 1, NIDIM )
    200       WRITE( NOUT, FMT = 9993 )( ALF( I ), I = 1, NALF )
    201       WRITE( NOUT, FMT = 9992 )( BET( I ), I = 1, NBET )
    202       IF( .NOT.TSTERR )THEN
    203          WRITE( NOUT, FMT = * )
    204          WRITE( NOUT, FMT = 9984 )
    205       END IF
    206       WRITE( NOUT, FMT = * )
    207       WRITE( NOUT, FMT = 9999 )THRESH
    208       WRITE( NOUT, FMT = * )
    209 *
    210 *     Read names of subroutines and flags which indicate
    211 *     whether they are to be tested.
    212 *
    213       DO 20 I = 1, NSUBS
    214          LTEST( I ) = .FALSE.
    215    20 CONTINUE
    216    30 READ( NIN, FMT = 9988, END = 60 )SNAMET, LTESTT
    217       DO 40 I = 1, NSUBS
    218          IF( SNAMET.EQ.SNAMES( I ) )
    219      $      GO TO 50
    220    40 CONTINUE
    221       WRITE( NOUT, FMT = 9990 )SNAMET
    222       STOP
    223    50 LTEST( I ) = LTESTT
    224       GO TO 30
    225 *
    226    60 CONTINUE
    227       CLOSE ( NIN )
    228 *
    229 *     Compute EPS (the machine precision).
    230 *
    231       EPS = EPSILON(ZERO)
    232       WRITE( NOUT, FMT = 9998 )EPS
    233 *
    234 *     Check the reliability of DMMCH using exact data.
    235 *
    236       N = MIN( 32, NMAX )
    237       DO 100 J = 1, N
    238          DO 90 I = 1, N
    239             AB( I, J ) = MAX( I - J + 1, 0 )
    240    90    CONTINUE
    241          AB( J, NMAX + 1 ) = J
    242          AB( 1, NMAX + J ) = J
    243          C( J, 1 ) = ZERO
    244   100 CONTINUE
    245       DO 110 J = 1, N
    246          CC( J ) = J*( ( J + 1 )*J )/2 - ( ( J + 1 )*J*( J - 1 ) )/3
    247   110 CONTINUE
    248 *     CC holds the exact result. On exit from DMMCH CT holds
    249 *     the result computed by DMMCH.
    250       TRANSA = 'N'
    251       TRANSB = 'N'
    252       CALL DMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,
    253      $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,
    254      $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )
    255       SAME = LDE( CC, CT, N )
    256       IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN
    257          WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR
    258          STOP
    259       END IF
    260       TRANSB = 'T'
    261       CALL DMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,
    262      $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,
    263      $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )
    264       SAME = LDE( CC, CT, N )
    265       IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN
    266          WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR
    267          STOP
    268       END IF
    269       DO 120 J = 1, N
    270          AB( J, NMAX + 1 ) = N - J + 1
    271          AB( 1, NMAX + J ) = N - J + 1
    272   120 CONTINUE
    273       DO 130 J = 1, N
    274          CC( N - J + 1 ) = J*( ( J + 1 )*J )/2 -
    275      $                     ( ( J + 1 )*J*( J - 1 ) )/3
    276   130 CONTINUE
    277       TRANSA = 'T'
    278       TRANSB = 'N'
    279       CALL DMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,
    280      $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,
    281      $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )
    282       SAME = LDE( CC, CT, N )
    283       IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN
    284          WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR
    285          STOP
    286       END IF
    287       TRANSB = 'T'
    288       CALL DMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,
    289      $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,
    290      $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )
    291       SAME = LDE( CC, CT, N )
    292       IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN
    293          WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR
    294          STOP
    295       END IF
    296 *
    297 *     Test each subroutine in turn.
    298 *
    299       DO 200 ISNUM = 1, NSUBS
    300          WRITE( NOUT, FMT = * )
    301          IF( .NOT.LTEST( ISNUM ) )THEN
    302 *           Subprogram is not to be tested.
    303             WRITE( NOUT, FMT = 9987 )SNAMES( ISNUM )
    304          ELSE
    305             SRNAMT = SNAMES( ISNUM )
    306 *           Test error exits.
    307             IF( TSTERR )THEN
    308                CALL DCHKE( ISNUM, SNAMES( ISNUM ), NOUT )
    309                WRITE( NOUT, FMT = * )
    310             END IF
    311 *           Test computations.
    312             INFOT = 0
    313             OK = .TRUE.
    314             FATAL = .FALSE.
    315             GO TO ( 140, 150, 160, 160, 170, 180 )ISNUM
    316 *           Test DGEMM, 01.
    317   140       CALL DCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
    318      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
    319      $                  NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
    320      $                  CC, CS, CT, G )
    321             GO TO 190
    322 *           Test DSYMM, 02.
    323   150       CALL DCHK2( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
    324      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
    325      $                  NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
    326      $                  CC, CS, CT, G )
    327             GO TO 190
    328 *           Test DTRMM, 03, DTRSM, 04.
    329   160       CALL DCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
    330      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NMAX, AB,
    331      $                  AA, AS, AB( 1, NMAX + 1 ), BB, BS, CT, G, C )
    332             GO TO 190
    333 *           Test DSYRK, 05.
    334   170       CALL DCHK4( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
    335      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
    336      $                  NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
    337      $                  CC, CS, CT, G )
    338             GO TO 190
    339 *           Test DSYR2K, 06.
    340   180       CALL DCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
    341      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
    342      $                  NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W )
    343             GO TO 190
    344 *
    345   190       IF( FATAL.AND.SFATAL )
    346      $         GO TO 210
    347          END IF
    348   200 CONTINUE
    349       WRITE( NOUT, FMT = 9986 )
    350       GO TO 230
    351 *
    352   210 CONTINUE
    353       WRITE( NOUT, FMT = 9985 )
    354       GO TO 230
    355 *
    356   220 CONTINUE
    357       WRITE( NOUT, FMT = 9991 )
    358 *
    359   230 CONTINUE
    360       IF( TRACE )
    361      $   CLOSE ( NTRA )
    362       CLOSE ( NOUT )
    363       STOP
    364 *
    365  9999 FORMAT( ' ROUTINES PASS COMPUTATIONAL TESTS IF TEST RATIO IS LES',
    366      $      'S THAN', F8.2 )
    367  9998 FORMAT( ' RELATIVE MACHINE PRECISION IS TAKEN TO BE', 1P, D9.1 )
    368  9997 FORMAT( ' NUMBER OF VALUES OF ', A, ' IS LESS THAN 1 OR GREATER ',
    369      $      'THAN ', I2 )
    370  9996 FORMAT( ' VALUE OF N IS LESS THAN 0 OR GREATER THAN ', I2 )
    371  9995 FORMAT( ' TESTS OF THE DOUBLE PRECISION LEVEL 3 BLAS', //' THE F',
    372      $      'OLLOWING PARAMETER VALUES WILL BE USED:' )
    373  9994 FORMAT( '   FOR N              ', 9I6 )
    374  9993 FORMAT( '   FOR ALPHA          ', 7F6.1 )
    375  9992 FORMAT( '   FOR BETA           ', 7F6.1 )
    376  9991 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM',
    377      $      /' ******* TESTS ABANDONED *******' )
    378  9990 FORMAT( ' SUBPROGRAM NAME ', A6, ' NOT RECOGNIZED', /' ******* T',
    379      $      'ESTS ABANDONED *******' )
    380  9989 FORMAT( ' ERROR IN DMMCH -  IN-LINE DOT PRODUCTS ARE BEING EVALU',
    381      $      'ATED WRONGLY.', /' DMMCH WAS CALLED WITH TRANSA = ', A1,
    382      $      ' AND TRANSB = ', A1, /' AND RETURNED SAME = ', L1, ' AND ',
    383      $      'ERR = ', F12.3, '.', /' THIS MAY BE DUE TO FAULTS IN THE ',
    384      $      'ARITHMETIC OR THE COMPILER.', /' ******* TESTS ABANDONED ',
    385      $      '*******' )
    386  9988 FORMAT( A6, L2 )
    387  9987 FORMAT( 1X, A6, ' WAS NOT TESTED' )
    388  9986 FORMAT( /' END OF TESTS' )
    389  9985 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' )
    390  9984 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' )
    391 *
    392 *     End of DBLAT3.
    393 *
    394       END
    395       SUBROUTINE DCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
    396      $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,
    397      $                  A, AA, AS, B, BB, BS, C, CC, CS, CT, G )
    398 *
    399 *  Tests DGEMM.
    400 *
    401 *  Auxiliary routine for test program for Level 3 Blas.
    402 *
    403 *  -- Written on 8-February-1989.
    404 *     Jack Dongarra, Argonne National Laboratory.
    405 *     Iain Duff, AERE Harwell.
    406 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
    407 *     Sven Hammarling, Numerical Algorithms Group Ltd.
    408 *
    409 *     .. Parameters ..
    410       DOUBLE PRECISION   ZERO
    411       PARAMETER          ( ZERO = 0.0D0 )
    412 *     .. Scalar Arguments ..
    413       DOUBLE PRECISION   EPS, THRESH
    414       INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA
    415       LOGICAL            FATAL, REWI, TRACE
    416       CHARACTER*6        SNAME
    417 *     .. Array Arguments ..
    418       DOUBLE PRECISION   A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
    419      $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),
    420      $                   BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),
    421      $                   C( NMAX, NMAX ), CC( NMAX*NMAX ),
    422      $                   CS( NMAX*NMAX ), CT( NMAX ), G( NMAX )
    423       INTEGER            IDIM( NIDIM )
    424 *     .. Local Scalars ..
    425       DOUBLE PRECISION   ALPHA, ALS, BETA, BLS, ERR, ERRMAX
    426       INTEGER            I, IA, IB, ICA, ICB, IK, IM, IN, K, KS, LAA,
    427      $                   LBB, LCC, LDA, LDAS, LDB, LDBS, LDC, LDCS, M,
    428      $                   MA, MB, MS, N, NA, NARGS, NB, NC, NS
    429       LOGICAL            NULL, RESET, SAME, TRANA, TRANB
    430       CHARACTER*1        TRANAS, TRANBS, TRANSA, TRANSB
    431       CHARACTER*3        ICH
    432 *     .. Local Arrays ..
    433       LOGICAL            ISAME( 13 )
    434 *     .. External Functions ..
    435       LOGICAL            LDE, LDERES
    436       EXTERNAL           LDE, LDERES
    437 *     .. External Subroutines ..
    438       EXTERNAL           DGEMM, DMAKE, DMMCH
    439 *     .. Intrinsic Functions ..
    440       INTRINSIC          MAX
    441 *     .. Scalars in Common ..
    442       INTEGER            INFOT, NOUTC
    443       LOGICAL            LERR, OK
    444 *     .. Common blocks ..
    445       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
    446 *     .. Data statements ..
    447       DATA               ICH/'NTC'/
    448 *     .. Executable Statements ..
    449 *
    450       NARGS = 13
    451       NC = 0
    452       RESET = .TRUE.
    453       ERRMAX = ZERO
    454 *
    455       DO 110 IM = 1, NIDIM
    456          M = IDIM( IM )
    457 *
    458          DO 100 IN = 1, NIDIM
    459             N = IDIM( IN )
    460 *           Set LDC to 1 more than minimum value if room.
    461             LDC = M
    462             IF( LDC.LT.NMAX )
    463      $         LDC = LDC + 1
    464 *           Skip tests if not enough room.
    465             IF( LDC.GT.NMAX )
    466      $         GO TO 100
    467             LCC = LDC*N
    468             NULL = N.LE.0.OR.M.LE.0
    469 *
    470             DO 90 IK = 1, NIDIM
    471                K = IDIM( IK )
    472 *
    473                DO 80 ICA = 1, 3
    474                   TRANSA = ICH( ICA: ICA )
    475                   TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C'
    476 *
    477                   IF( TRANA )THEN
    478                      MA = K
    479                      NA = M
    480                   ELSE
    481                      MA = M
    482                      NA = K
    483                   END IF
    484 *                 Set LDA to 1 more than minimum value if room.
    485                   LDA = MA
    486                   IF( LDA.LT.NMAX )
    487      $               LDA = LDA + 1
    488 *                 Skip tests if not enough room.
    489                   IF( LDA.GT.NMAX )
    490      $               GO TO 80
    491                   LAA = LDA*NA
    492 *
    493 *                 Generate the matrix A.
    494 *
    495                   CALL DMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA,
    496      $                        RESET, ZERO )
    497 *
    498                   DO 70 ICB = 1, 3
    499                      TRANSB = ICH( ICB: ICB )
    500                      TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C'
    501 *
    502                      IF( TRANB )THEN
    503                         MB = N
    504                         NB = K
    505                      ELSE
    506                         MB = K
    507                         NB = N
    508                      END IF
    509 *                    Set LDB to 1 more than minimum value if room.
    510                      LDB = MB
    511                      IF( LDB.LT.NMAX )
    512      $                  LDB = LDB + 1
    513 *                    Skip tests if not enough room.
    514                      IF( LDB.GT.NMAX )
    515      $                  GO TO 70
    516                      LBB = LDB*NB
    517 *
    518 *                    Generate the matrix B.
    519 *
    520                      CALL DMAKE( 'GE', ' ', ' ', MB, NB, B, NMAX, BB,
    521      $                           LDB, RESET, ZERO )
    522 *
    523                      DO 60 IA = 1, NALF
    524                         ALPHA = ALF( IA )
    525 *
    526                         DO 50 IB = 1, NBET
    527                            BETA = BET( IB )
    528 *
    529 *                          Generate the matrix C.
    530 *
    531                            CALL DMAKE( 'GE', ' ', ' ', M, N, C, NMAX,
    532      $                                 CC, LDC, RESET, ZERO )
    533 *
    534                            NC = NC + 1
    535 *
    536 *                          Save every datum before calling the
    537 *                          subroutine.
    538 *
    539                            TRANAS = TRANSA
    540                            TRANBS = TRANSB
    541                            MS = M
    542                            NS = N
    543                            KS = K
    544                            ALS = ALPHA
    545                            DO 10 I = 1, LAA
    546                               AS( I ) = AA( I )
    547    10                      CONTINUE
    548                            LDAS = LDA
    549                            DO 20 I = 1, LBB
    550                               BS( I ) = BB( I )
    551    20                      CONTINUE
    552                            LDBS = LDB
    553                            BLS = BETA
    554                            DO 30 I = 1, LCC
    555                               CS( I ) = CC( I )
    556    30                      CONTINUE
    557                            LDCS = LDC
    558 *
    559 *                          Call the subroutine.
    560 *
    561                            IF( TRACE )
    562      $                        WRITE( NTRA, FMT = 9995 )NC, SNAME,
    563      $                        TRANSA, TRANSB, M, N, K, ALPHA, LDA, LDB,
    564      $                        BETA, LDC
    565                            IF( REWI )
    566      $                        REWIND NTRA
    567                            CALL DGEMM( TRANSA, TRANSB, M, N, K, ALPHA,
    568      $                                 AA, LDA, BB, LDB, BETA, CC, LDC )
    569 *
    570 *                          Check if error-exit was taken incorrectly.
    571 *
    572                            IF( .NOT.OK )THEN
    573                               WRITE( NOUT, FMT = 9994 )
    574                               FATAL = .TRUE.
    575                               GO TO 120
    576                            END IF
    577 *
    578 *                          See what data changed inside subroutines.
    579 *
    580                            ISAME( 1 ) = TRANSA.EQ.TRANAS
    581                            ISAME( 2 ) = TRANSB.EQ.TRANBS
    582                            ISAME( 3 ) = MS.EQ.M
    583                            ISAME( 4 ) = NS.EQ.N
    584                            ISAME( 5 ) = KS.EQ.K
    585                            ISAME( 6 ) = ALS.EQ.ALPHA
    586                            ISAME( 7 ) = LDE( AS, AA, LAA )
    587                            ISAME( 8 ) = LDAS.EQ.LDA
    588                            ISAME( 9 ) = LDE( BS, BB, LBB )
    589                            ISAME( 10 ) = LDBS.EQ.LDB
    590                            ISAME( 11 ) = BLS.EQ.BETA
    591                            IF( NULL )THEN
    592                               ISAME( 12 ) = LDE( CS, CC, LCC )
    593                            ELSE
    594                               ISAME( 12 ) = LDERES( 'GE', ' ', M, N, CS,
    595      $                                      CC, LDC )
    596                            END IF
    597                            ISAME( 13 ) = LDCS.EQ.LDC
    598 *
    599 *                          If data was incorrectly changed, report
    600 *                          and return.
    601 *
    602                            SAME = .TRUE.
    603                            DO 40 I = 1, NARGS
    604                               SAME = SAME.AND.ISAME( I )
    605                               IF( .NOT.ISAME( I ) )
    606      $                           WRITE( NOUT, FMT = 9998 )I
    607    40                      CONTINUE
    608                            IF( .NOT.SAME )THEN
    609                               FATAL = .TRUE.
    610                               GO TO 120
    611                            END IF
    612 *
    613                            IF( .NOT.NULL )THEN
    614 *
    615 *                             Check the result.
    616 *
    617                               CALL DMMCH( TRANSA, TRANSB, M, N, K,
    618      $                                    ALPHA, A, NMAX, B, NMAX, BETA,
    619      $                                    C, NMAX, CT, G, CC, LDC, EPS,
    620      $                                    ERR, FATAL, NOUT, .TRUE. )
    621                               ERRMAX = MAX( ERRMAX, ERR )
    622 *                             If got really bad answer, report and
    623 *                             return.
    624                               IF( FATAL )
    625      $                           GO TO 120
    626                            END IF
    627 *
    628    50                   CONTINUE
    629 *
    630    60                CONTINUE
    631 *
    632    70             CONTINUE
    633 *
    634    80          CONTINUE
    635 *
    636    90       CONTINUE
    637 *
    638   100    CONTINUE
    639 *
    640   110 CONTINUE
    641 *
    642 *     Report result.
    643 *
    644       IF( ERRMAX.LT.THRESH )THEN
    645          WRITE( NOUT, FMT = 9999 )SNAME, NC
    646       ELSE
    647          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
    648       END IF
    649       GO TO 130
    650 *
    651   120 CONTINUE
    652       WRITE( NOUT, FMT = 9996 )SNAME
    653       WRITE( NOUT, FMT = 9995 )NC, SNAME, TRANSA, TRANSB, M, N, K,
    654      $   ALPHA, LDA, LDB, BETA, LDC
    655 *
    656   130 CONTINUE
    657       RETURN
    658 *
    659  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
    660      $      'S)' )
    661  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
    662      $      'ANGED INCORRECTLY *******' )
    663  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
    664      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
    665      $      ' - SUSPECT *******' )
    666  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
    667  9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',''', A1, ''',',
    668      $      3( I3, ',' ), F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', ',
    669      $      'C,', I3, ').' )
    670  9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
    671      $      '******' )
    672 *
    673 *     End of DCHK1.
    674 *
    675       END
    676       SUBROUTINE DCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
    677      $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,
    678      $                  A, AA, AS, B, BB, BS, C, CC, CS, CT, G )
    679 *
    680 *  Tests DSYMM.
    681 *
    682 *  Auxiliary routine for test program for Level 3 Blas.
    683 *
    684 *  -- Written on 8-February-1989.
    685 *     Jack Dongarra, Argonne National Laboratory.
    686 *     Iain Duff, AERE Harwell.
    687 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
    688 *     Sven Hammarling, Numerical Algorithms Group Ltd.
    689 *
    690 *     .. Parameters ..
    691       DOUBLE PRECISION   ZERO
    692       PARAMETER          ( ZERO = 0.0D0 )
    693 *     .. Scalar Arguments ..
    694       DOUBLE PRECISION   EPS, THRESH
    695       INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA
    696       LOGICAL            FATAL, REWI, TRACE
    697       CHARACTER*6        SNAME
    698 *     .. Array Arguments ..
    699       DOUBLE PRECISION   A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
    700      $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),
    701      $                   BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),
    702      $                   C( NMAX, NMAX ), CC( NMAX*NMAX ),
    703      $                   CS( NMAX*NMAX ), CT( NMAX ), G( NMAX )
    704       INTEGER            IDIM( NIDIM )
    705 *     .. Local Scalars ..
    706       DOUBLE PRECISION   ALPHA, ALS, BETA, BLS, ERR, ERRMAX
    707       INTEGER            I, IA, IB, ICS, ICU, IM, IN, LAA, LBB, LCC,
    708      $                   LDA, LDAS, LDB, LDBS, LDC, LDCS, M, MS, N, NA,
    709      $                   NARGS, NC, NS
    710       LOGICAL            LEFT, NULL, RESET, SAME
    711       CHARACTER*1        SIDE, SIDES, UPLO, UPLOS
    712       CHARACTER*2        ICHS, ICHU
    713 *     .. Local Arrays ..
    714       LOGICAL            ISAME( 13 )
    715 *     .. External Functions ..
    716       LOGICAL            LDE, LDERES
    717       EXTERNAL           LDE, LDERES
    718 *     .. External Subroutines ..
    719       EXTERNAL           DMAKE, DMMCH, DSYMM
    720 *     .. Intrinsic Functions ..
    721       INTRINSIC          MAX
    722 *     .. Scalars in Common ..
    723       INTEGER            INFOT, NOUTC
    724       LOGICAL            LERR, OK
    725 *     .. Common blocks ..
    726       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
    727 *     .. Data statements ..
    728       DATA               ICHS/'LR'/, ICHU/'UL'/
    729 *     .. Executable Statements ..
    730 *
    731       NARGS = 12
    732       NC = 0
    733       RESET = .TRUE.
    734       ERRMAX = ZERO
    735 *
    736       DO 100 IM = 1, NIDIM
    737          M = IDIM( IM )
    738 *
    739          DO 90 IN = 1, NIDIM
    740             N = IDIM( IN )
    741 *           Set LDC to 1 more than minimum value if room.
    742             LDC = M
    743             IF( LDC.LT.NMAX )
    744      $         LDC = LDC + 1
    745 *           Skip tests if not enough room.
    746             IF( LDC.GT.NMAX )
    747      $         GO TO 90
    748             LCC = LDC*N
    749             NULL = N.LE.0.OR.M.LE.0
    750 *
    751 *           Set LDB to 1 more than minimum value if room.
    752             LDB = M
    753             IF( LDB.LT.NMAX )
    754      $         LDB = LDB + 1
    755 *           Skip tests if not enough room.
    756             IF( LDB.GT.NMAX )
    757      $         GO TO 90
    758             LBB = LDB*N
    759 *
    760 *           Generate the matrix B.
    761 *
    762             CALL DMAKE( 'GE', ' ', ' ', M, N, B, NMAX, BB, LDB, RESET,
    763      $                  ZERO )
    764 *
    765             DO 80 ICS = 1, 2
    766                SIDE = ICHS( ICS: ICS )
    767                LEFT = SIDE.EQ.'L'
    768 *
    769                IF( LEFT )THEN
    770                   NA = M
    771                ELSE
    772                   NA = N
    773                END IF
    774 *              Set LDA to 1 more than minimum value if room.
    775                LDA = NA
    776                IF( LDA.LT.NMAX )
    777      $            LDA = LDA + 1
    778 *              Skip tests if not enough room.
    779                IF( LDA.GT.NMAX )
    780      $            GO TO 80
    781                LAA = LDA*NA
    782 *
    783                DO 70 ICU = 1, 2
    784                   UPLO = ICHU( ICU: ICU )
    785 *
    786 *                 Generate the symmetric matrix A.
    787 *
    788                   CALL DMAKE( 'SY', UPLO, ' ', NA, NA, A, NMAX, AA, LDA,
    789      $                        RESET, ZERO )
    790 *
    791                   DO 60 IA = 1, NALF
    792                      ALPHA = ALF( IA )
    793 *
    794                      DO 50 IB = 1, NBET
    795                         BETA = BET( IB )
    796 *
    797 *                       Generate the matrix C.
    798 *
    799                         CALL DMAKE( 'GE', ' ', ' ', M, N, C, NMAX, CC,
    800      $                              LDC, RESET, ZERO )
    801 *
    802                         NC = NC + 1
    803 *
    804 *                       Save every datum before calling the
    805 *                       subroutine.
    806 *
    807                         SIDES = SIDE
    808                         UPLOS = UPLO
    809                         MS = M
    810                         NS = N
    811                         ALS = ALPHA
    812                         DO 10 I = 1, LAA
    813                            AS( I ) = AA( I )
    814    10                   CONTINUE
    815                         LDAS = LDA
    816                         DO 20 I = 1, LBB
    817                            BS( I ) = BB( I )
    818    20                   CONTINUE
    819                         LDBS = LDB
    820                         BLS = BETA
    821                         DO 30 I = 1, LCC
    822                            CS( I ) = CC( I )
    823    30                   CONTINUE
    824                         LDCS = LDC
    825 *
    826 *                       Call the subroutine.
    827 *
    828                         IF( TRACE )
    829      $                     WRITE( NTRA, FMT = 9995 )NC, SNAME, SIDE,
    830      $                     UPLO, M, N, ALPHA, LDA, LDB, BETA, LDC
    831                         IF( REWI )
    832      $                     REWIND NTRA
    833                         CALL DSYMM( SIDE, UPLO, M, N, ALPHA, AA, LDA,
    834      $                              BB, LDB, BETA, CC, LDC )
    835 *
    836 *                       Check if error-exit was taken incorrectly.
    837 *
    838                         IF( .NOT.OK )THEN
    839                            WRITE( NOUT, FMT = 9994 )
    840                            FATAL = .TRUE.
    841                            GO TO 110
    842                         END IF
    843 *
    844 *                       See what data changed inside subroutines.
    845 *
    846                         ISAME( 1 ) = SIDES.EQ.SIDE
    847                         ISAME( 2 ) = UPLOS.EQ.UPLO
    848                         ISAME( 3 ) = MS.EQ.M
    849                         ISAME( 4 ) = NS.EQ.N
    850                         ISAME( 5 ) = ALS.EQ.ALPHA
    851                         ISAME( 6 ) = LDE( AS, AA, LAA )
    852                         ISAME( 7 ) = LDAS.EQ.LDA
    853                         ISAME( 8 ) = LDE( BS, BB, LBB )
    854                         ISAME( 9 ) = LDBS.EQ.LDB
    855                         ISAME( 10 ) = BLS.EQ.BETA
    856                         IF( NULL )THEN
    857                            ISAME( 11 ) = LDE( CS, CC, LCC )
    858                         ELSE
    859                            ISAME( 11 ) = LDERES( 'GE', ' ', M, N, CS,
    860      $                                   CC, LDC )
    861                         END IF
    862                         ISAME( 12 ) = LDCS.EQ.LDC
    863 *
    864 *                       If data was incorrectly changed, report and
    865 *                       return.
    866 *
    867                         SAME = .TRUE.
    868                         DO 40 I = 1, NARGS
    869                            SAME = SAME.AND.ISAME( I )
    870                            IF( .NOT.ISAME( I ) )
    871      $                        WRITE( NOUT, FMT = 9998 )I
    872    40                   CONTINUE
    873                         IF( .NOT.SAME )THEN
    874                            FATAL = .TRUE.
    875                            GO TO 110
    876                         END IF
    877 *
    878                         IF( .NOT.NULL )THEN
    879 *
    880 *                          Check the result.
    881 *
    882                            IF( LEFT )THEN
    883                               CALL DMMCH( 'N', 'N', M, N, M, ALPHA, A,
    884      $                                    NMAX, B, NMAX, BETA, C, NMAX,
    885      $                                    CT, G, CC, LDC, EPS, ERR,
    886      $                                    FATAL, NOUT, .TRUE. )
    887                            ELSE
    888                               CALL DMMCH( 'N', 'N', M, N, N, ALPHA, B,
    889      $                                    NMAX, A, NMAX, BETA, C, NMAX,
    890      $                                    CT, G, CC, LDC, EPS, ERR,
    891      $                                    FATAL, NOUT, .TRUE. )
    892                            END IF
    893                            ERRMAX = MAX( ERRMAX, ERR )
    894 *                          If got really bad answer, report and
    895 *                          return.
    896                            IF( FATAL )
    897      $                        GO TO 110
    898                         END IF
    899 *
    900    50                CONTINUE
    901 *
    902    60             CONTINUE
    903 *
    904    70          CONTINUE
    905 *
    906    80       CONTINUE
    907 *
    908    90    CONTINUE
    909 *
    910   100 CONTINUE
    911 *
    912 *     Report result.
    913 *
    914       IF( ERRMAX.LT.THRESH )THEN
    915          WRITE( NOUT, FMT = 9999 )SNAME, NC
    916       ELSE
    917          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
    918       END IF
    919       GO TO 120
    920 *
    921   110 CONTINUE
    922       WRITE( NOUT, FMT = 9996 )SNAME
    923       WRITE( NOUT, FMT = 9995 )NC, SNAME, SIDE, UPLO, M, N, ALPHA, LDA,
    924      $   LDB, BETA, LDC
    925 *
    926   120 CONTINUE
    927       RETURN
    928 *
    929  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
    930      $      'S)' )
    931  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
    932      $      'ANGED INCORRECTLY *******' )
    933  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
    934      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
    935      $      ' - SUSPECT *******' )
    936  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
    937  9995 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),
    938      $      F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', C,', I3, ')   ',
    939      $      ' .' )
    940  9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
    941      $      '******' )
    942 *
    943 *     End of DCHK2.
    944 *
    945       END
    946       SUBROUTINE DCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
    947      $                  FATAL, NIDIM, IDIM, NALF, ALF, NMAX, A, AA, AS,
    948      $                  B, BB, BS, CT, G, C )
    949 *
    950 *  Tests DTRMM and DTRSM.
    951 *
    952 *  Auxiliary routine for test program for Level 3 Blas.
    953 *
    954 *  -- Written on 8-February-1989.
    955 *     Jack Dongarra, Argonne National Laboratory.
    956 *     Iain Duff, AERE Harwell.
    957 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
    958 *     Sven Hammarling, Numerical Algorithms Group Ltd.
    959 *
    960 *     .. Parameters ..
    961       DOUBLE PRECISION   ZERO, ONE
    962       PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
    963 *     .. Scalar Arguments ..
    964       DOUBLE PRECISION   EPS, THRESH
    965       INTEGER            NALF, NIDIM, NMAX, NOUT, NTRA
    966       LOGICAL            FATAL, REWI, TRACE
    967       CHARACTER*6        SNAME
    968 *     .. Array Arguments ..
    969       DOUBLE PRECISION   A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
    970      $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),
    971      $                   BB( NMAX*NMAX ), BS( NMAX*NMAX ),
    972      $                   C( NMAX, NMAX ), CT( NMAX ), G( NMAX )
    973       INTEGER            IDIM( NIDIM )
    974 *     .. Local Scalars ..
    975       DOUBLE PRECISION   ALPHA, ALS, ERR, ERRMAX
    976       INTEGER            I, IA, ICD, ICS, ICT, ICU, IM, IN, J, LAA, LBB,
    977      $                   LDA, LDAS, LDB, LDBS, M, MS, N, NA, NARGS, NC,
    978      $                   NS
    979       LOGICAL            LEFT, NULL, RESET, SAME
    980       CHARACTER*1        DIAG, DIAGS, SIDE, SIDES, TRANAS, TRANSA, UPLO,
    981      $                   UPLOS
    982       CHARACTER*2        ICHD, ICHS, ICHU
    983       CHARACTER*3        ICHT
    984 *     .. Local Arrays ..
    985       LOGICAL            ISAME( 13 )
    986 *     .. External Functions ..
    987       LOGICAL            LDE, LDERES
    988       EXTERNAL           LDE, LDERES
    989 *     .. External Subroutines ..
    990       EXTERNAL           DMAKE, DMMCH, DTRMM, DTRSM
    991 *     .. Intrinsic Functions ..
    992       INTRINSIC          MAX
    993 *     .. Scalars in Common ..
    994       INTEGER            INFOT, NOUTC
    995       LOGICAL            LERR, OK
    996 *     .. Common blocks ..
    997       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
    998 *     .. Data statements ..
    999       DATA               ICHU/'UL'/, ICHT/'NTC'/, ICHD/'UN'/, ICHS/'LR'/
   1000 *     .. Executable Statements ..
   1001 *
   1002       NARGS = 11
   1003       NC = 0
   1004       RESET = .TRUE.
   1005       ERRMAX = ZERO
   1006 *     Set up zero matrix for DMMCH.
   1007       DO 20 J = 1, NMAX
   1008          DO 10 I = 1, NMAX
   1009             C( I, J ) = ZERO
   1010    10    CONTINUE
   1011    20 CONTINUE
   1012 *
   1013       DO 140 IM = 1, NIDIM
   1014          M = IDIM( IM )
   1015 *
   1016          DO 130 IN = 1, NIDIM
   1017             N = IDIM( IN )
   1018 *           Set LDB to 1 more than minimum value if room.
   1019             LDB = M
   1020             IF( LDB.LT.NMAX )
   1021      $         LDB = LDB + 1
   1022 *           Skip tests if not enough room.
   1023             IF( LDB.GT.NMAX )
   1024      $         GO TO 130
   1025             LBB = LDB*N
   1026             NULL = M.LE.0.OR.N.LE.0
   1027 *
   1028             DO 120 ICS = 1, 2
   1029                SIDE = ICHS( ICS: ICS )
   1030                LEFT = SIDE.EQ.'L'
   1031                IF( LEFT )THEN
   1032                   NA = M
   1033                ELSE
   1034                   NA = N
   1035                END IF
   1036 *              Set LDA to 1 more than minimum value if room.
   1037                LDA = NA
   1038                IF( LDA.LT.NMAX )
   1039      $            LDA = LDA + 1
   1040 *              Skip tests if not enough room.
   1041                IF( LDA.GT.NMAX )
   1042      $            GO TO 130
   1043                LAA = LDA*NA
   1044 *
   1045                DO 110 ICU = 1, 2
   1046                   UPLO = ICHU( ICU: ICU )
   1047 *
   1048                   DO 100 ICT = 1, 3
   1049                      TRANSA = ICHT( ICT: ICT )
   1050 *
   1051                      DO 90 ICD = 1, 2
   1052                         DIAG = ICHD( ICD: ICD )
   1053 *
   1054                         DO 80 IA = 1, NALF
   1055                            ALPHA = ALF( IA )
   1056 *
   1057 *                          Generate the matrix A.
   1058 *
   1059                            CALL DMAKE( 'TR', UPLO, DIAG, NA, NA, A,
   1060      $                                 NMAX, AA, LDA, RESET, ZERO )
   1061 *
   1062 *                          Generate the matrix B.
   1063 *
   1064                            CALL DMAKE( 'GE', ' ', ' ', M, N, B, NMAX,
   1065      $                                 BB, LDB, RESET, ZERO )
   1066 *
   1067                            NC = NC + 1
   1068 *
   1069 *                          Save every datum before calling the
   1070 *                          subroutine.
   1071 *
   1072                            SIDES = SIDE
   1073                            UPLOS = UPLO
   1074                            TRANAS = TRANSA
   1075                            DIAGS = DIAG
   1076                            MS = M
   1077                            NS = N
   1078                            ALS = ALPHA
   1079                            DO 30 I = 1, LAA
   1080                               AS( I ) = AA( I )
   1081    30                      CONTINUE
   1082                            LDAS = LDA
   1083                            DO 40 I = 1, LBB
   1084                               BS( I ) = BB( I )
   1085    40                      CONTINUE
   1086                            LDBS = LDB
   1087 *
   1088 *                          Call the subroutine.
   1089 *
   1090                            IF( SNAME( 4: 5 ).EQ.'MM' )THEN
   1091                               IF( TRACE )
   1092      $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,
   1093      $                           SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,
   1094      $                           LDA, LDB
   1095                               IF( REWI )
   1096      $                           REWIND NTRA
   1097                               CALL DTRMM( SIDE, UPLO, TRANSA, DIAG, M,
   1098      $                                    N, ALPHA, AA, LDA, BB, LDB )
   1099                            ELSE IF( SNAME( 4: 5 ).EQ.'SM' )THEN
   1100                               IF( TRACE )
   1101      $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,
   1102      $                           SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,
   1103      $                           LDA, LDB
   1104                               IF( REWI )
   1105      $                           REWIND NTRA
   1106                               CALL DTRSM( SIDE, UPLO, TRANSA, DIAG, M,
   1107      $                                    N, ALPHA, AA, LDA, BB, LDB )
   1108                            END IF
   1109 *
   1110 *                          Check if error-exit was taken incorrectly.
   1111 *
   1112                            IF( .NOT.OK )THEN
   1113                               WRITE( NOUT, FMT = 9994 )
   1114                               FATAL = .TRUE.
   1115                               GO TO 150
   1116                            END IF
   1117 *
   1118 *                          See what data changed inside subroutines.
   1119 *
   1120                            ISAME( 1 ) = SIDES.EQ.SIDE
   1121                            ISAME( 2 ) = UPLOS.EQ.UPLO
   1122                            ISAME( 3 ) = TRANAS.EQ.TRANSA
   1123                            ISAME( 4 ) = DIAGS.EQ.DIAG
   1124                            ISAME( 5 ) = MS.EQ.M
   1125                            ISAME( 6 ) = NS.EQ.N
   1126                            ISAME( 7 ) = ALS.EQ.ALPHA
   1127                            ISAME( 8 ) = LDE( AS, AA, LAA )
   1128                            ISAME( 9 ) = LDAS.EQ.LDA
   1129                            IF( NULL )THEN
   1130                               ISAME( 10 ) = LDE( BS, BB, LBB )
   1131                            ELSE
   1132                               ISAME( 10 ) = LDERES( 'GE', ' ', M, N, BS,
   1133      $                                      BB, LDB )
   1134                            END IF
   1135                            ISAME( 11 ) = LDBS.EQ.LDB
   1136 *
   1137 *                          If data was incorrectly changed, report and
   1138 *                          return.
   1139 *
   1140                            SAME = .TRUE.
   1141                            DO 50 I = 1, NARGS
   1142                               SAME = SAME.AND.ISAME( I )
   1143                               IF( .NOT.ISAME( I ) )
   1144      $                           WRITE( NOUT, FMT = 9998 )I
   1145    50                      CONTINUE
   1146                            IF( .NOT.SAME )THEN
   1147                               FATAL = .TRUE.
   1148                               GO TO 150
   1149                            END IF
   1150 *
   1151                            IF( .NOT.NULL )THEN
   1152                               IF( SNAME( 4: 5 ).EQ.'MM' )THEN
   1153 *
   1154 *                                Check the result.
   1155 *
   1156                                  IF( LEFT )THEN
   1157                                     CALL DMMCH( TRANSA, 'N', M, N, M,
   1158      $                                          ALPHA, A, NMAX, B, NMAX,
   1159      $                                          ZERO, C, NMAX, CT, G,
   1160      $                                          BB, LDB, EPS, ERR,
   1161      $                                          FATAL, NOUT, .TRUE. )
   1162                                  ELSE
   1163                                     CALL DMMCH( 'N', TRANSA, M, N, N,
   1164      $                                          ALPHA, B, NMAX, A, NMAX,
   1165      $                                          ZERO, C, NMAX, CT, G,
   1166      $                                          BB, LDB, EPS, ERR,
   1167      $                                          FATAL, NOUT, .TRUE. )
   1168                                  END IF
   1169                               ELSE IF( SNAME( 4: 5 ).EQ.'SM' )THEN
   1170 *
   1171 *                                Compute approximation to original
   1172 *                                matrix.
   1173 *
   1174                                  DO 70 J = 1, N
   1175                                     DO 60 I = 1, M
   1176                                        C( I, J ) = BB( I + ( J - 1 )*
   1177      $                                             LDB )
   1178                                        BB( I + ( J - 1 )*LDB ) = ALPHA*
   1179      $                                    B( I, J )
   1180    60                               CONTINUE
   1181    70                            CONTINUE
   1182 *
   1183                                  IF( LEFT )THEN
   1184                                     CALL DMMCH( TRANSA, 'N', M, N, M,
   1185      $                                          ONE, A, NMAX, C, NMAX,
   1186      $                                          ZERO, B, NMAX, CT, G,
   1187      $                                          BB, LDB, EPS, ERR,
   1188      $                                          FATAL, NOUT, .FALSE. )
   1189                                  ELSE
   1190                                     CALL DMMCH( 'N', TRANSA, M, N, N,
   1191      $                                          ONE, C, NMAX, A, NMAX,
   1192      $                                          ZERO, B, NMAX, CT, G,
   1193      $                                          BB, LDB, EPS, ERR,
   1194      $                                          FATAL, NOUT, .FALSE. )
   1195                                  END IF
   1196                               END IF
   1197                               ERRMAX = MAX( ERRMAX, ERR )
   1198 *                             If got really bad answer, report and
   1199 *                             return.
   1200                               IF( FATAL )
   1201      $                           GO TO 150
   1202                            END IF
   1203 *
   1204    80                   CONTINUE
   1205 *
   1206    90                CONTINUE
   1207 *
   1208   100             CONTINUE
   1209 *
   1210   110          CONTINUE
   1211 *
   1212   120       CONTINUE
   1213 *
   1214   130    CONTINUE
   1215 *
   1216   140 CONTINUE
   1217 *
   1218 *     Report result.
   1219 *
   1220       IF( ERRMAX.LT.THRESH )THEN
   1221          WRITE( NOUT, FMT = 9999 )SNAME, NC
   1222       ELSE
   1223          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
   1224       END IF
   1225       GO TO 160
   1226 *
   1227   150 CONTINUE
   1228       WRITE( NOUT, FMT = 9996 )SNAME
   1229       WRITE( NOUT, FMT = 9995 )NC, SNAME, SIDE, UPLO, TRANSA, DIAG, M,
   1230      $   N, ALPHA, LDA, LDB
   1231 *
   1232   160 CONTINUE
   1233       RETURN
   1234 *
   1235  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
   1236      $      'S)' )
   1237  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
   1238      $      'ANGED INCORRECTLY *******' )
   1239  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
   1240      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
   1241      $      ' - SUSPECT *******' )
   1242  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
   1243  9995 FORMAT( 1X, I6, ': ', A6, '(', 4( '''', A1, ''',' ), 2( I3, ',' ),
   1244      $      F4.1, ', A,', I3, ', B,', I3, ')        .' )
   1245  9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
   1246      $      '******' )
   1247 *
   1248 *     End of DCHK3.
   1249 *
   1250       END
   1251       SUBROUTINE DCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
   1252      $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,
   1253      $                  A, AA, AS, B, BB, BS, C, CC, CS, CT, G )
   1254 *
   1255 *  Tests DSYRK.
   1256 *
   1257 *  Auxiliary routine for test program for Level 3 Blas.
   1258 *
   1259 *  -- Written on 8-February-1989.
   1260 *     Jack Dongarra, Argonne National Laboratory.
   1261 *     Iain Duff, AERE Harwell.
   1262 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
   1263 *     Sven Hammarling, Numerical Algorithms Group Ltd.
   1264 *
   1265 *     .. Parameters ..
   1266       DOUBLE PRECISION   ZERO
   1267       PARAMETER          ( ZERO = 0.0D0 )
   1268 *     .. Scalar Arguments ..
   1269       DOUBLE PRECISION   EPS, THRESH
   1270       INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA
   1271       LOGICAL            FATAL, REWI, TRACE
   1272       CHARACTER*6        SNAME
   1273 *     .. Array Arguments ..
   1274       DOUBLE PRECISION   A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
   1275      $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),
   1276      $                   BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),
   1277      $                   C( NMAX, NMAX ), CC( NMAX*NMAX ),
   1278      $                   CS( NMAX*NMAX ), CT( NMAX ), G( NMAX )
   1279       INTEGER            IDIM( NIDIM )
   1280 *     .. Local Scalars ..
   1281       DOUBLE PRECISION   ALPHA, ALS, BETA, BETS, ERR, ERRMAX
   1282       INTEGER            I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, K, KS,
   1283      $                   LAA, LCC, LDA, LDAS, LDC, LDCS, LJ, MA, N, NA,
   1284      $                   NARGS, NC, NS
   1285       LOGICAL            NULL, RESET, SAME, TRAN, UPPER
   1286       CHARACTER*1        TRANS, TRANSS, UPLO, UPLOS
   1287       CHARACTER*2        ICHU
   1288       CHARACTER*3        ICHT
   1289 *     .. Local Arrays ..
   1290       LOGICAL            ISAME( 13 )
   1291 *     .. External Functions ..
   1292       LOGICAL            LDE, LDERES
   1293       EXTERNAL           LDE, LDERES
   1294 *     .. External Subroutines ..
   1295       EXTERNAL           DMAKE, DMMCH, DSYRK
   1296 *     .. Intrinsic Functions ..
   1297       INTRINSIC          MAX
   1298 *     .. Scalars in Common ..
   1299       INTEGER            INFOT, NOUTC
   1300       LOGICAL            LERR, OK
   1301 *     .. Common blocks ..
   1302       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
   1303 *     .. Data statements ..
   1304       DATA               ICHT/'NTC'/, ICHU/'UL'/
   1305 *     .. Executable Statements ..
   1306 *
   1307       NARGS = 10
   1308       NC = 0
   1309       RESET = .TRUE.
   1310       ERRMAX = ZERO
   1311 *
   1312       DO 100 IN = 1, NIDIM
   1313          N = IDIM( IN )
   1314 *        Set LDC to 1 more than minimum value if room.
   1315          LDC = N
   1316          IF( LDC.LT.NMAX )
   1317      $      LDC = LDC + 1
   1318 *        Skip tests if not enough room.
   1319          IF( LDC.GT.NMAX )
   1320      $      GO TO 100
   1321          LCC = LDC*N
   1322          NULL = N.LE.0
   1323 *
   1324          DO 90 IK = 1, NIDIM
   1325             K = IDIM( IK )
   1326 *
   1327             DO 80 ICT = 1, 3
   1328                TRANS = ICHT( ICT: ICT )
   1329                TRAN = TRANS.EQ.'T'.OR.TRANS.EQ.'C'
   1330                IF( TRAN )THEN
   1331                   MA = K
   1332                   NA = N
   1333                ELSE
   1334                   MA = N
   1335                   NA = K
   1336                END IF
   1337 *              Set LDA to 1 more than minimum value if room.
   1338                LDA = MA
   1339                IF( LDA.LT.NMAX )
   1340      $            LDA = LDA + 1
   1341 *              Skip tests if not enough room.
   1342                IF( LDA.GT.NMAX )
   1343      $            GO TO 80
   1344                LAA = LDA*NA
   1345 *
   1346 *              Generate the matrix A.
   1347 *
   1348                CALL DMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA,
   1349      $                     RESET, ZERO )
   1350 *
   1351                DO 70 ICU = 1, 2
   1352                   UPLO = ICHU( ICU: ICU )
   1353                   UPPER = UPLO.EQ.'U'
   1354 *
   1355                   DO 60 IA = 1, NALF
   1356                      ALPHA = ALF( IA )
   1357 *
   1358                      DO 50 IB = 1, NBET
   1359                         BETA = BET( IB )
   1360 *
   1361 *                       Generate the matrix C.
   1362 *
   1363                         CALL DMAKE( 'SY', UPLO, ' ', N, N, C, NMAX, CC,
   1364      $                              LDC, RESET, ZERO )
   1365 *
   1366                         NC = NC + 1
   1367 *
   1368 *                       Save every datum before calling the subroutine.
   1369 *
   1370                         UPLOS = UPLO
   1371                         TRANSS = TRANS
   1372                         NS = N
   1373                         KS = K
   1374                         ALS = ALPHA
   1375                         DO 10 I = 1, LAA
   1376                            AS( I ) = AA( I )
   1377    10                   CONTINUE
   1378                         LDAS = LDA
   1379                         BETS = BETA
   1380                         DO 20 I = 1, LCC
   1381                            CS( I ) = CC( I )
   1382    20                   CONTINUE
   1383                         LDCS = LDC
   1384 *
   1385 *                       Call the subroutine.
   1386 *
   1387                         IF( TRACE )
   1388      $                     WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO,
   1389      $                     TRANS, N, K, ALPHA, LDA, BETA, LDC
   1390                         IF( REWI )
   1391      $                     REWIND NTRA
   1392                         CALL DSYRK( UPLO, TRANS, N, K, ALPHA, AA, LDA,
   1393      $                              BETA, CC, LDC )
   1394 *
   1395 *                       Check if error-exit was taken incorrectly.
   1396 *
   1397                         IF( .NOT.OK )THEN
   1398                            WRITE( NOUT, FMT = 9993 )
   1399                            FATAL = .TRUE.
   1400                            GO TO 120
   1401                         END IF
   1402 *
   1403 *                       See what data changed inside subroutines.
   1404 *
   1405                         ISAME( 1 ) = UPLOS.EQ.UPLO
   1406                         ISAME( 2 ) = TRANSS.EQ.TRANS
   1407                         ISAME( 3 ) = NS.EQ.N
   1408                         ISAME( 4 ) = KS.EQ.K
   1409                         ISAME( 5 ) = ALS.EQ.ALPHA
   1410                         ISAME( 6 ) = LDE( AS, AA, LAA )
   1411                         ISAME( 7 ) = LDAS.EQ.LDA
   1412                         ISAME( 8 ) = BETS.EQ.BETA
   1413                         IF( NULL )THEN
   1414                            ISAME( 9 ) = LDE( CS, CC, LCC )
   1415                         ELSE
   1416                            ISAME( 9 ) = LDERES( 'SY', UPLO, N, N, CS,
   1417      $                                  CC, LDC )
   1418                         END IF
   1419                         ISAME( 10 ) = LDCS.EQ.LDC
   1420 *
   1421 *                       If data was incorrectly changed, report and
   1422 *                       return.
   1423 *
   1424                         SAME = .TRUE.
   1425                         DO 30 I = 1, NARGS
   1426                            SAME = SAME.AND.ISAME( I )
   1427                            IF( .NOT.ISAME( I ) )
   1428      $                        WRITE( NOUT, FMT = 9998 )I
   1429    30                   CONTINUE
   1430                         IF( .NOT.SAME )THEN
   1431                            FATAL = .TRUE.
   1432                            GO TO 120
   1433                         END IF
   1434 *
   1435                         IF( .NOT.NULL )THEN
   1436 *
   1437 *                          Check the result column by column.
   1438 *
   1439                            JC = 1
   1440                            DO 40 J = 1, N
   1441                               IF( UPPER )THEN
   1442                                  JJ = 1
   1443                                  LJ = J
   1444                               ELSE
   1445                                  JJ = J
   1446                                  LJ = N - J + 1
   1447                               END IF
   1448                               IF( TRAN )THEN
   1449                                  CALL DMMCH( 'T', 'N', LJ, 1, K, ALPHA,
   1450      $                                       A( 1, JJ ), NMAX,
   1451      $                                       A( 1, J ), NMAX, BETA,
   1452      $                                       C( JJ, J ), NMAX, CT, G,
   1453      $                                       CC( JC ), LDC, EPS, ERR,
   1454      $                                       FATAL, NOUT, .TRUE. )
   1455                               ELSE
   1456                                  CALL DMMCH( 'N', 'T', LJ, 1, K, ALPHA,
   1457      $                                       A( JJ, 1 ), NMAX,
   1458      $                                       A( J, 1 ), NMAX, BETA,
   1459      $                                       C( JJ, J ), NMAX, CT, G,
   1460      $                                       CC( JC ), LDC, EPS, ERR,
   1461      $                                       FATAL, NOUT, .TRUE. )
   1462                               END IF
   1463                               IF( UPPER )THEN
   1464                                  JC = JC + LDC
   1465                               ELSE
   1466                                  JC = JC + LDC + 1
   1467                               END IF
   1468                               ERRMAX = MAX( ERRMAX, ERR )
   1469 *                             If got really bad answer, report and
   1470 *                             return.
   1471                               IF( FATAL )
   1472      $                           GO TO 110
   1473    40                      CONTINUE
   1474                         END IF
   1475 *
   1476    50                CONTINUE
   1477 *
   1478    60             CONTINUE
   1479 *
   1480    70          CONTINUE
   1481 *
   1482    80       CONTINUE
   1483 *
   1484    90    CONTINUE
   1485 *
   1486   100 CONTINUE
   1487 *
   1488 *     Report result.
   1489 *
   1490       IF( ERRMAX.LT.THRESH )THEN
   1491          WRITE( NOUT, FMT = 9999 )SNAME, NC
   1492       ELSE
   1493          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
   1494       END IF
   1495       GO TO 130
   1496 *
   1497   110 CONTINUE
   1498       IF( N.GT.1 )
   1499      $   WRITE( NOUT, FMT = 9995 )J
   1500 *
   1501   120 CONTINUE
   1502       WRITE( NOUT, FMT = 9996 )SNAME
   1503       WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, TRANS, N, K, ALPHA,
   1504      $   LDA, BETA, LDC
   1505 *
   1506   130 CONTINUE
   1507       RETURN
   1508 *
   1509  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
   1510      $      'S)' )
   1511  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
   1512      $      'ANGED INCORRECTLY *******' )
   1513  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
   1514      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
   1515      $      ' - SUSPECT *******' )
   1516  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
   1517  9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )
   1518  9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),
   1519      $      F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ')           .' )
   1520  9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
   1521      $      '******' )
   1522 *
   1523 *     End of DCHK4.
   1524 *
   1525       END
   1526       SUBROUTINE DCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
   1527      $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,
   1528      $                  AB, AA, AS, BB, BS, C, CC, CS, CT, G, W )
   1529 *
   1530 *  Tests DSYR2K.
   1531 *
   1532 *  Auxiliary routine for test program for Level 3 Blas.
   1533 *
   1534 *  -- Written on 8-February-1989.
   1535 *     Jack Dongarra, Argonne National Laboratory.
   1536 *     Iain Duff, AERE Harwell.
   1537 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
   1538 *     Sven Hammarling, Numerical Algorithms Group Ltd.
   1539 *
   1540 *     .. Parameters ..
   1541       DOUBLE PRECISION   ZERO
   1542       PARAMETER          ( ZERO = 0.0D0 )
   1543 *     .. Scalar Arguments ..
   1544       DOUBLE PRECISION   EPS, THRESH
   1545       INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA
   1546       LOGICAL            FATAL, REWI, TRACE
   1547       CHARACTER*6        SNAME
   1548 *     .. Array Arguments ..
   1549       DOUBLE PRECISION   AA( NMAX*NMAX ), AB( 2*NMAX*NMAX ),
   1550      $                   ALF( NALF ), AS( NMAX*NMAX ), BB( NMAX*NMAX ),
   1551      $                   BET( NBET ), BS( NMAX*NMAX ), C( NMAX, NMAX ),
   1552      $                   CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ),
   1553      $                   G( NMAX ), W( 2*NMAX )
   1554       INTEGER            IDIM( NIDIM )
   1555 *     .. Local Scalars ..
   1556       DOUBLE PRECISION   ALPHA, ALS, BETA, BETS, ERR, ERRMAX
   1557       INTEGER            I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, JJAB,
   1558      $                   K, KS, LAA, LBB, LCC, LDA, LDAS, LDB, LDBS,
   1559      $                   LDC, LDCS, LJ, MA, N, NA, NARGS, NC, NS
   1560       LOGICAL            NULL, RESET, SAME, TRAN, UPPER
   1561       CHARACTER*1        TRANS, TRANSS, UPLO, UPLOS
   1562       CHARACTER*2        ICHU
   1563       CHARACTER*3        ICHT
   1564 *     .. Local Arrays ..
   1565       LOGICAL            ISAME( 13 )
   1566 *     .. External Functions ..
   1567       LOGICAL            LDE, LDERES
   1568       EXTERNAL           LDE, LDERES
   1569 *     .. External Subroutines ..
   1570       EXTERNAL           DMAKE, DMMCH, DSYR2K
   1571 *     .. Intrinsic Functions ..
   1572       INTRINSIC          MAX
   1573 *     .. Scalars in Common ..
   1574       INTEGER            INFOT, NOUTC
   1575       LOGICAL            LERR, OK
   1576 *     .. Common blocks ..
   1577       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
   1578 *     .. Data statements ..
   1579       DATA               ICHT/'NTC'/, ICHU/'UL'/
   1580 *     .. Executable Statements ..
   1581 *
   1582       NARGS = 12
   1583       NC = 0
   1584       RESET = .TRUE.
   1585       ERRMAX = ZERO
   1586 *
   1587       DO 130 IN = 1, NIDIM
   1588          N = IDIM( IN )
   1589 *        Set LDC to 1 more than minimum value if room.
   1590          LDC = N
   1591          IF( LDC.LT.NMAX )
   1592      $      LDC = LDC + 1
   1593 *        Skip tests if not enough room.
   1594          IF( LDC.GT.NMAX )
   1595      $      GO TO 130
   1596          LCC = LDC*N
   1597          NULL = N.LE.0
   1598 *
   1599          DO 120 IK = 1, NIDIM
   1600             K = IDIM( IK )
   1601 *
   1602             DO 110 ICT = 1, 3
   1603                TRANS = ICHT( ICT: ICT )
   1604                TRAN = TRANS.EQ.'T'.OR.TRANS.EQ.'C'
   1605                IF( TRAN )THEN
   1606                   MA = K
   1607                   NA = N
   1608                ELSE
   1609                   MA = N
   1610                   NA = K
   1611                END IF
   1612 *              Set LDA to 1 more than minimum value if room.
   1613                LDA = MA
   1614                IF( LDA.LT.NMAX )
   1615      $            LDA = LDA + 1
   1616 *              Skip tests if not enough room.
   1617                IF( LDA.GT.NMAX )
   1618      $            GO TO 110
   1619                LAA = LDA*NA
   1620 *
   1621 *              Generate the matrix A.
   1622 *
   1623                IF( TRAN )THEN
   1624                   CALL DMAKE( 'GE', ' ', ' ', MA, NA, AB, 2*NMAX, AA,
   1625      $                        LDA, RESET, ZERO )
   1626                ELSE
   1627                   CALL DMAKE( 'GE', ' ', ' ', MA, NA, AB, NMAX, AA, LDA,
   1628      $                        RESET, ZERO )
   1629                END IF
   1630 *
   1631 *              Generate the matrix B.
   1632 *
   1633                LDB = LDA
   1634                LBB = LAA
   1635                IF( TRAN )THEN
   1636                   CALL DMAKE( 'GE', ' ', ' ', MA, NA, AB( K + 1 ),
   1637      $                        2*NMAX, BB, LDB, RESET, ZERO )
   1638                ELSE
   1639                   CALL DMAKE( 'GE', ' ', ' ', MA, NA, AB( K*NMAX + 1 ),
   1640      $                        NMAX, BB, LDB, RESET, ZERO )
   1641                END IF
   1642 *
   1643                DO 100 ICU = 1, 2
   1644                   UPLO = ICHU( ICU: ICU )
   1645                   UPPER = UPLO.EQ.'U'
   1646 *
   1647                   DO 90 IA = 1, NALF
   1648                      ALPHA = ALF( IA )
   1649 *
   1650                      DO 80 IB = 1, NBET
   1651                         BETA = BET( IB )
   1652 *
   1653 *                       Generate the matrix C.
   1654 *
   1655                         CALL DMAKE( 'SY', UPLO, ' ', N, N, C, NMAX, CC,
   1656      $                              LDC, RESET, ZERO )
   1657 *
   1658                         NC = NC + 1
   1659 *
   1660 *                       Save every datum before calling the subroutine.
   1661 *
   1662                         UPLOS = UPLO
   1663                         TRANSS = TRANS
   1664                         NS = N
   1665                         KS = K
   1666                         ALS = ALPHA
   1667                         DO 10 I = 1, LAA
   1668                            AS( I ) = AA( I )
   1669    10                   CONTINUE
   1670                         LDAS = LDA
   1671                         DO 20 I = 1, LBB
   1672                            BS( I ) = BB( I )
   1673    20                   CONTINUE
   1674                         LDBS = LDB
   1675                         BETS = BETA
   1676                         DO 30 I = 1, LCC
   1677                            CS( I ) = CC( I )
   1678    30                   CONTINUE
   1679                         LDCS = LDC
   1680 *
   1681 *                       Call the subroutine.
   1682 *
   1683                         IF( TRACE )
   1684      $                     WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO,
   1685      $                     TRANS, N, K, ALPHA, LDA, LDB, BETA, LDC
   1686                         IF( REWI )
   1687      $                     REWIND NTRA
   1688                         CALL DSYR2K( UPLO, TRANS, N, K, ALPHA, AA, LDA,
   1689      $                               BB, LDB, BETA, CC, LDC )
   1690 *
   1691 *                       Check if error-exit was taken incorrectly.
   1692 *
   1693                         IF( .NOT.OK )THEN
   1694                            WRITE( NOUT, FMT = 9993 )
   1695                            FATAL = .TRUE.
   1696                            GO TO 150
   1697                         END IF
   1698 *
   1699 *                       See what data changed inside subroutines.
   1700 *
   1701                         ISAME( 1 ) = UPLOS.EQ.UPLO
   1702                         ISAME( 2 ) = TRANSS.EQ.TRANS
   1703                         ISAME( 3 ) = NS.EQ.N
   1704                         ISAME( 4 ) = KS.EQ.K
   1705                         ISAME( 5 ) = ALS.EQ.ALPHA
   1706                         ISAME( 6 ) = LDE( AS, AA, LAA )
   1707                         ISAME( 7 ) = LDAS.EQ.LDA
   1708                         ISAME( 8 ) = LDE( BS, BB, LBB )
   1709                         ISAME( 9 ) = LDBS.EQ.LDB
   1710                         ISAME( 10 ) = BETS.EQ.BETA
   1711                         IF( NULL )THEN
   1712                            ISAME( 11 ) = LDE( CS, CC, LCC )
   1713                         ELSE
   1714                            ISAME( 11 ) = LDERES( 'SY', UPLO, N, N, CS,
   1715      $                                   CC, LDC )
   1716                         END IF
   1717                         ISAME( 12 ) = LDCS.EQ.LDC
   1718 *
   1719 *                       If data was incorrectly changed, report and
   1720 *                       return.
   1721 *
   1722                         SAME = .TRUE.
   1723                         DO 40 I = 1, NARGS
   1724                            SAME = SAME.AND.ISAME( I )
   1725                            IF( .NOT.ISAME( I ) )
   1726      $                        WRITE( NOUT, FMT = 9998 )I
   1727    40                   CONTINUE
   1728                         IF( .NOT.SAME )THEN
   1729                            FATAL = .TRUE.
   1730                            GO TO 150
   1731                         END IF
   1732 *
   1733                         IF( .NOT.NULL )THEN
   1734 *
   1735 *                          Check the result column by column.
   1736 *
   1737                            JJAB = 1
   1738                            JC = 1
   1739                            DO 70 J = 1, N
   1740                               IF( UPPER )THEN
   1741                                  JJ = 1
   1742                                  LJ = J
   1743                               ELSE
   1744                                  JJ = J
   1745                                  LJ = N - J + 1
   1746                               END IF
   1747                               IF( TRAN )THEN
   1748                                  DO 50 I = 1, K
   1749                                     W( I ) = AB( ( J - 1 )*2*NMAX + K +
   1750      $                                       I )
   1751                                     W( K + I ) = AB( ( J - 1 )*2*NMAX +
   1752      $                                           I )
   1753    50                            CONTINUE
   1754                                  CALL DMMCH( 'T', 'N', LJ, 1, 2*K,
   1755      $                                       ALPHA, AB( JJAB ), 2*NMAX,
   1756      $                                       W, 2*NMAX, BETA,
   1757      $                                       C( JJ, J ), NMAX, CT, G,
   1758      $                                       CC( JC ), LDC, EPS, ERR,
   1759      $                                       FATAL, NOUT, .TRUE. )
   1760                               ELSE
   1761                                  DO 60 I = 1, K
   1762                                     W( I ) = AB( ( K + I - 1 )*NMAX +
   1763      $                                       J )
   1764                                     W( K + I ) = AB( ( I - 1 )*NMAX +
   1765      $                                           J )
   1766    60                            CONTINUE
   1767                                  CALL DMMCH( 'N', 'N', LJ, 1, 2*K,
   1768      $                                       ALPHA, AB( JJ ), NMAX, W,
   1769      $                                       2*NMAX, BETA, C( JJ, J ),
   1770      $                                       NMAX, CT, G, CC( JC ), LDC,
   1771      $                                       EPS, ERR, FATAL, NOUT,
   1772      $                                       .TRUE. )
   1773                               END IF
   1774                               IF( UPPER )THEN
   1775                                  JC = JC + LDC
   1776                               ELSE
   1777                                  JC = JC + LDC + 1
   1778                                  IF( TRAN )
   1779      $                              JJAB = JJAB + 2*NMAX
   1780                               END IF
   1781                               ERRMAX = MAX( ERRMAX, ERR )
   1782 *                             If got really bad answer, report and
   1783 *                             return.
   1784                               IF( FATAL )
   1785      $                           GO TO 140
   1786    70                      CONTINUE
   1787                         END IF
   1788 *
   1789    80                CONTINUE
   1790 *
   1791    90             CONTINUE
   1792 *
   1793   100          CONTINUE
   1794 *
   1795   110       CONTINUE
   1796 *
   1797   120    CONTINUE
   1798 *
   1799   130 CONTINUE
   1800 *
   1801 *     Report result.
   1802 *
   1803       IF( ERRMAX.LT.THRESH )THEN
   1804          WRITE( NOUT, FMT = 9999 )SNAME, NC
   1805       ELSE
   1806          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
   1807       END IF
   1808       GO TO 160
   1809 *
   1810   140 CONTINUE
   1811       IF( N.GT.1 )
   1812      $   WRITE( NOUT, FMT = 9995 )J
   1813 *
   1814   150 CONTINUE
   1815       WRITE( NOUT, FMT = 9996 )SNAME
   1816       WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, TRANS, N, K, ALPHA,
   1817      $   LDA, LDB, BETA, LDC
   1818 *
   1819   160 CONTINUE
   1820       RETURN
   1821 *
   1822  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
   1823      $      'S)' )
   1824  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
   1825      $      'ANGED INCORRECTLY *******' )
   1826  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
   1827      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
   1828      $      ' - SUSPECT *******' )
   1829  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
   1830  9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )
   1831  9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),
   1832      $      F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', C,', I3, ')   ',
   1833      $      ' .' )
   1834  9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
   1835      $      '******' )
   1836 *
   1837 *     End of DCHK5.
   1838 *
   1839       END
   1840       SUBROUTINE DCHKE( ISNUM, SRNAMT, NOUT )
   1841 *
   1842 *  Tests the error exits from the Level 3 Blas.
   1843 *  Requires a special version of the error-handling routine XERBLA.
   1844 *  A, B and C should not need to be defined.
   1845 *
   1846 *  Auxiliary routine for test program for Level 3 Blas.
   1847 *
   1848 *  -- Written on 8-February-1989.
   1849 *     Jack Dongarra, Argonne National Laboratory.
   1850 *     Iain Duff, AERE Harwell.
   1851 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
   1852 *     Sven Hammarling, Numerical Algorithms Group Ltd.
   1853 *
   1854 *  3-19-92:  Initialize ALPHA and BETA  (eca)
   1855 *  3-19-92:  Fix argument 12 in calls to SSYMM with INFOT = 9  (eca)
   1856 *
   1857 *     .. Scalar Arguments ..
   1858       INTEGER            ISNUM, NOUT
   1859       CHARACTER*6        SRNAMT
   1860 *     .. Scalars in Common ..
   1861       INTEGER            INFOT, NOUTC
   1862       LOGICAL            LERR, OK
   1863 *     .. Parameters ..
   1864       DOUBLE PRECISION   ONE, TWO
   1865       PARAMETER          ( ONE = 1.0D0, TWO = 2.0D0 )
   1866 *     .. Local Scalars ..
   1867       DOUBLE PRECISION   ALPHA, BETA
   1868 *     .. Local Arrays ..
   1869       DOUBLE PRECISION   A( 2, 1 ), B( 2, 1 ), C( 2, 1 )
   1870 *     .. External Subroutines ..
   1871       EXTERNAL           CHKXER, DGEMM, DSYMM, DSYR2K, DSYRK, DTRMM,
   1872      $                   DTRSM
   1873 *     .. Common blocks ..
   1874       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
   1875 *     .. Executable Statements ..
   1876 *     OK is set to .FALSE. by the special version of XERBLA or by CHKXER
   1877 *     if anything is wrong.
   1878       OK = .TRUE.
   1879 *     LERR is set to .TRUE. by the special version of XERBLA each time
   1880 *     it is called, and is then tested and re-set by CHKXER.
   1881       LERR = .FALSE.
   1882 *
   1883 *     Initialize ALPHA and BETA.
   1884 *
   1885       ALPHA = ONE
   1886       BETA = TWO
   1887 *
   1888       GO TO ( 10, 20, 30, 40, 50, 60 )ISNUM
   1889    10 INFOT = 1
   1890       CALL DGEMM( '/', 'N', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1891       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1892       INFOT = 1
   1893       CALL DGEMM( '/', 'T', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1894       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1895       INFOT = 2
   1896       CALL DGEMM( 'N', '/', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1897       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1898       INFOT = 2
   1899       CALL DGEMM( 'T', '/', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1900       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1901       INFOT = 3
   1902       CALL DGEMM( 'N', 'N', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1903       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1904       INFOT = 3
   1905       CALL DGEMM( 'N', 'T', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1906       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1907       INFOT = 3
   1908       CALL DGEMM( 'T', 'N', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1909       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1910       INFOT = 3
   1911       CALL DGEMM( 'T', 'T', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1912       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1913       INFOT = 4
   1914       CALL DGEMM( 'N', 'N', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1915       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1916       INFOT = 4
   1917       CALL DGEMM( 'N', 'T', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1918       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1919       INFOT = 4
   1920       CALL DGEMM( 'T', 'N', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1921       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1922       INFOT = 4
   1923       CALL DGEMM( 'T', 'T', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1924       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1925       INFOT = 5
   1926       CALL DGEMM( 'N', 'N', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1927       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1928       INFOT = 5
   1929       CALL DGEMM( 'N', 'T', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1930       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1931       INFOT = 5
   1932       CALL DGEMM( 'T', 'N', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1933       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1934       INFOT = 5
   1935       CALL DGEMM( 'T', 'T', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1936       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1937       INFOT = 8
   1938       CALL DGEMM( 'N', 'N', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )
   1939       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1940       INFOT = 8
   1941       CALL DGEMM( 'N', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )
   1942       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1943       INFOT = 8
   1944       CALL DGEMM( 'T', 'N', 0, 0, 2, ALPHA, A, 1, B, 2, BETA, C, 1 )
   1945       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1946       INFOT = 8
   1947       CALL DGEMM( 'T', 'T', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1948       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1949       INFOT = 10
   1950       CALL DGEMM( 'N', 'N', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1951       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1952       INFOT = 10
   1953       CALL DGEMM( 'T', 'N', 0, 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 )
   1954       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1955       INFOT = 10
   1956       CALL DGEMM( 'N', 'T', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1957       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1958       INFOT = 10
   1959       CALL DGEMM( 'T', 'T', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1960       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1961       INFOT = 13
   1962       CALL DGEMM( 'N', 'N', 2, 0, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )
   1963       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1964       INFOT = 13
   1965       CALL DGEMM( 'N', 'T', 2, 0, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )
   1966       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1967       INFOT = 13
   1968       CALL DGEMM( 'T', 'N', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1969       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1970       INFOT = 13
   1971       CALL DGEMM( 'T', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1972       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1973       GO TO 70
   1974    20 INFOT = 1
   1975       CALL DSYMM( '/', 'U', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1976       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1977       INFOT = 2
   1978       CALL DSYMM( 'L', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1979       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1980       INFOT = 3
   1981       CALL DSYMM( 'L', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1982       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1983       INFOT = 3
   1984       CALL DSYMM( 'R', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1985       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1986       INFOT = 3
   1987       CALL DSYMM( 'L', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1988       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1989       INFOT = 3
   1990       CALL DSYMM( 'R', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1991       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1992       INFOT = 4
   1993       CALL DSYMM( 'L', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1994       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1995       INFOT = 4
   1996       CALL DSYMM( 'R', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
   1997       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   1998       INFOT = 4
   1999       CALL DSYMM( 'L', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
   2000       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2001       INFOT = 4
   2002       CALL DSYMM( 'R', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
   2003       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2004       INFOT = 7
   2005       CALL DSYMM( 'L', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 )
   2006       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2007       INFOT = 7
   2008       CALL DSYMM( 'R', 'U', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )
   2009       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2010       INFOT = 7
   2011       CALL DSYMM( 'L', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 )
   2012       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2013       INFOT = 7
   2014       CALL DSYMM( 'R', 'L', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )
   2015       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2016       INFOT = 9
   2017       CALL DSYMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 )
   2018       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2019       INFOT = 9
   2020       CALL DSYMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )
   2021       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2022       INFOT = 9
   2023       CALL DSYMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 )
   2024       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2025       INFOT = 9
   2026       CALL DSYMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )
   2027       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2028       INFOT = 12
   2029       CALL DSYMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )
   2030       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2031       INFOT = 12
   2032       CALL DSYMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 )
   2033       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2034       INFOT = 12
   2035       CALL DSYMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )
   2036       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2037       INFOT = 12
   2038       CALL DSYMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 )
   2039       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2040       GO TO 70
   2041    30 INFOT = 1
   2042       CALL DTRMM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )
   2043       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2044       INFOT = 2
   2045       CALL DTRMM( 'L', '/', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )
   2046       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2047       INFOT = 3
   2048       CALL DTRMM( 'L', 'U', '/', 'N', 0, 0, ALPHA, A, 1, B, 1 )
   2049       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2050       INFOT = 4
   2051       CALL DTRMM( 'L', 'U', 'N', '/', 0, 0, ALPHA, A, 1, B, 1 )
   2052       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2053       INFOT = 5
   2054       CALL DTRMM( 'L', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )
   2055       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2056       INFOT = 5
   2057       CALL DTRMM( 'L', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )
   2058       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2059       INFOT = 5
   2060       CALL DTRMM( 'R', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )
   2061       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2062       INFOT = 5
   2063       CALL DTRMM( 'R', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )
   2064       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2065       INFOT = 5
   2066       CALL DTRMM( 'L', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )
   2067       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2068       INFOT = 5
   2069       CALL DTRMM( 'L', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )
   2070       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2071       INFOT = 5
   2072       CALL DTRMM( 'R', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )
   2073       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2074       INFOT = 5
   2075       CALL DTRMM( 'R', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )
   2076       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2077       INFOT = 6
   2078       CALL DTRMM( 'L', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )
   2079       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2080       INFOT = 6
   2081       CALL DTRMM( 'L', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )
   2082       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2083       INFOT = 6
   2084       CALL DTRMM( 'R', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )
   2085       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2086       INFOT = 6
   2087       CALL DTRMM( 'R', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )
   2088       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2089       INFOT = 6
   2090       CALL DTRMM( 'L', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )
   2091       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2092       INFOT = 6
   2093       CALL DTRMM( 'L', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )
   2094       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2095       INFOT = 6
   2096       CALL DTRMM( 'R', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )
   2097       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2098       INFOT = 6
   2099       CALL DTRMM( 'R', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )
   2100       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2101       INFOT = 9
   2102       CALL DTRMM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )
   2103       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2104       INFOT = 9
   2105       CALL DTRMM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )
   2106       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2107       INFOT = 9
   2108       CALL DTRMM( 'R', 'U', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )
   2109       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2110       INFOT = 9
   2111       CALL DTRMM( 'R', 'U', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )
   2112       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2113       INFOT = 9
   2114       CALL DTRMM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )
   2115       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2116       INFOT = 9
   2117       CALL DTRMM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )
   2118       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2119       INFOT = 9
   2120       CALL DTRMM( 'R', 'L', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )
   2121       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2122       INFOT = 9
   2123       CALL DTRMM( 'R', 'L', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )
   2124       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2125       INFOT = 11
   2126       CALL DTRMM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )
   2127       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2128       INFOT = 11
   2129       CALL DTRMM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )
   2130       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2131       INFOT = 11
   2132       CALL DTRMM( 'R', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )
   2133       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2134       INFOT = 11
   2135       CALL DTRMM( 'R', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )
   2136       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2137       INFOT = 11
   2138       CALL DTRMM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )
   2139       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2140       INFOT = 11
   2141       CALL DTRMM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )
   2142       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2143       INFOT = 11
   2144       CALL DTRMM( 'R', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )
   2145       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2146       INFOT = 11
   2147       CALL DTRMM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )
   2148       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2149       GO TO 70
   2150    40 INFOT = 1
   2151       CALL DTRSM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )
   2152       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2153       INFOT = 2
   2154       CALL DTRSM( 'L', '/', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )
   2155       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2156       INFOT = 3
   2157       CALL DTRSM( 'L', 'U', '/', 'N', 0, 0, ALPHA, A, 1, B, 1 )
   2158       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2159       INFOT = 4
   2160       CALL DTRSM( 'L', 'U', 'N', '/', 0, 0, ALPHA, A, 1, B, 1 )
   2161       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2162       INFOT = 5
   2163       CALL DTRSM( 'L', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )
   2164       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2165       INFOT = 5
   2166       CALL DTRSM( 'L', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )
   2167       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2168       INFOT = 5
   2169       CALL DTRSM( 'R', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )
   2170       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2171       INFOT = 5
   2172       CALL DTRSM( 'R', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )
   2173       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2174       INFOT = 5
   2175       CALL DTRSM( 'L', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )
   2176       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2177       INFOT = 5
   2178       CALL DTRSM( 'L', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )
   2179       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2180       INFOT = 5
   2181       CALL DTRSM( 'R', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )
   2182       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2183       INFOT = 5
   2184       CALL DTRSM( 'R', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )
   2185       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2186       INFOT = 6
   2187       CALL DTRSM( 'L', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )
   2188       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2189       INFOT = 6
   2190       CALL DTRSM( 'L', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )
   2191       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2192       INFOT = 6
   2193       CALL DTRSM( 'R', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )
   2194       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2195       INFOT = 6
   2196       CALL DTRSM( 'R', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )
   2197       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2198       INFOT = 6
   2199       CALL DTRSM( 'L', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )
   2200       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2201       INFOT = 6
   2202       CALL DTRSM( 'L', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )
   2203       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2204       INFOT = 6
   2205       CALL DTRSM( 'R', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )
   2206       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2207       INFOT = 6
   2208       CALL DTRSM( 'R', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )
   2209       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2210       INFOT = 9
   2211       CALL DTRSM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )
   2212       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2213       INFOT = 9
   2214       CALL DTRSM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )
   2215       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2216       INFOT = 9
   2217       CALL DTRSM( 'R', 'U', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )
   2218       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2219       INFOT = 9
   2220       CALL DTRSM( 'R', 'U', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )
   2221       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2222       INFOT = 9
   2223       CALL DTRSM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )
   2224       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2225       INFOT = 9
   2226       CALL DTRSM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )
   2227       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2228       INFOT = 9
   2229       CALL DTRSM( 'R', 'L', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )
   2230       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2231       INFOT = 9
   2232       CALL DTRSM( 'R', 'L', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )
   2233       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2234       INFOT = 11
   2235       CALL DTRSM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )
   2236       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2237       INFOT = 11
   2238       CALL DTRSM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )
   2239       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2240       INFOT = 11
   2241       CALL DTRSM( 'R', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )
   2242       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2243       INFOT = 11
   2244       CALL DTRSM( 'R', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )
   2245       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2246       INFOT = 11
   2247       CALL DTRSM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )
   2248       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2249       INFOT = 11
   2250       CALL DTRSM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )
   2251       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2252       INFOT = 11
   2253       CALL DTRSM( 'R', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )
   2254       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2255       INFOT = 11
   2256       CALL DTRSM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )
   2257       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2258       GO TO 70
   2259    50 INFOT = 1
   2260       CALL DSYRK( '/', 'N', 0, 0, ALPHA, A, 1, BETA, C, 1 )
   2261       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2262       INFOT = 2
   2263       CALL DSYRK( 'U', '/', 0, 0, ALPHA, A, 1, BETA, C, 1 )
   2264       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2265       INFOT = 3
   2266       CALL DSYRK( 'U', 'N', -1, 0, ALPHA, A, 1, BETA, C, 1 )
   2267       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2268       INFOT = 3
   2269       CALL DSYRK( 'U', 'T', -1, 0, ALPHA, A, 1, BETA, C, 1 )
   2270       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2271       INFOT = 3
   2272       CALL DSYRK( 'L', 'N', -1, 0, ALPHA, A, 1, BETA, C, 1 )
   2273       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2274       INFOT = 3
   2275       CALL DSYRK( 'L', 'T', -1, 0, ALPHA, A, 1, BETA, C, 1 )
   2276       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2277       INFOT = 4
   2278       CALL DSYRK( 'U', 'N', 0, -1, ALPHA, A, 1, BETA, C, 1 )
   2279       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2280       INFOT = 4
   2281       CALL DSYRK( 'U', 'T', 0, -1, ALPHA, A, 1, BETA, C, 1 )
   2282       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2283       INFOT = 4
   2284       CALL DSYRK( 'L', 'N', 0, -1, ALPHA, A, 1, BETA, C, 1 )
   2285       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2286       INFOT = 4
   2287       CALL DSYRK( 'L', 'T', 0, -1, ALPHA, A, 1, BETA, C, 1 )
   2288       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2289       INFOT = 7
   2290       CALL DSYRK( 'U', 'N', 2, 0, ALPHA, A, 1, BETA, C, 2 )
   2291       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2292       INFOT = 7
   2293       CALL DSYRK( 'U', 'T', 0, 2, ALPHA, A, 1, BETA, C, 1 )
   2294       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2295       INFOT = 7
   2296       CALL DSYRK( 'L', 'N', 2, 0, ALPHA, A, 1, BETA, C, 2 )
   2297       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2298       INFOT = 7
   2299       CALL DSYRK( 'L', 'T', 0, 2, ALPHA, A, 1, BETA, C, 1 )
   2300       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2301       INFOT = 10
   2302       CALL DSYRK( 'U', 'N', 2, 0, ALPHA, A, 2, BETA, C, 1 )
   2303       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2304       INFOT = 10
   2305       CALL DSYRK( 'U', 'T', 2, 0, ALPHA, A, 1, BETA, C, 1 )
   2306       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2307       INFOT = 10
   2308       CALL DSYRK( 'L', 'N', 2, 0, ALPHA, A, 2, BETA, C, 1 )
   2309       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2310       INFOT = 10
   2311       CALL DSYRK( 'L', 'T', 2, 0, ALPHA, A, 1, BETA, C, 1 )
   2312       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2313       GO TO 70
   2314    60 INFOT = 1
   2315       CALL DSYR2K( '/', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   2316       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2317       INFOT = 2
   2318       CALL DSYR2K( 'U', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   2319       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2320       INFOT = 3
   2321       CALL DSYR2K( 'U', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   2322       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2323       INFOT = 3
   2324       CALL DSYR2K( 'U', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   2325       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2326       INFOT = 3
   2327       CALL DSYR2K( 'L', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   2328       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2329       INFOT = 3
   2330       CALL DSYR2K( 'L', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   2331       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2332       INFOT = 4
   2333       CALL DSYR2K( 'U', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
   2334       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2335       INFOT = 4
   2336       CALL DSYR2K( 'U', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
   2337       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2338       INFOT = 4
   2339       CALL DSYR2K( 'L', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
   2340       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2341       INFOT = 4
   2342       CALL DSYR2K( 'L', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
   2343       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2344       INFOT = 7
   2345       CALL DSYR2K( 'U', 'N', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )
   2346       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2347       INFOT = 7
   2348       CALL DSYR2K( 'U', 'T', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )
   2349       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2350       INFOT = 7
   2351       CALL DSYR2K( 'L', 'N', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )
   2352       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2353       INFOT = 7
   2354       CALL DSYR2K( 'L', 'T', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )
   2355       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2356       INFOT = 9
   2357       CALL DSYR2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 )
   2358       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2359       INFOT = 9
   2360       CALL DSYR2K( 'U', 'T', 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 )
   2361       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2362       INFOT = 9
   2363       CALL DSYR2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 )
   2364       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2365       INFOT = 9
   2366       CALL DSYR2K( 'L', 'T', 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 )
   2367       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2368       INFOT = 12
   2369       CALL DSYR2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )
   2370       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2371       INFOT = 12
   2372       CALL DSYR2K( 'U', 'T', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   2373       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2374       INFOT = 12
   2375       CALL DSYR2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )
   2376       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2377       INFOT = 12
   2378       CALL DSYR2K( 'L', 'T', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
   2379       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2380 *
   2381    70 IF( OK )THEN
   2382          WRITE( NOUT, FMT = 9999 )SRNAMT
   2383       ELSE
   2384          WRITE( NOUT, FMT = 9998 )SRNAMT
   2385       END IF
   2386       RETURN
   2387 *
   2388  9999 FORMAT( ' ', A6, ' PASSED THE TESTS OF ERROR-EXITS' )
   2389  9998 FORMAT( ' ******* ', A6, ' FAILED THE TESTS OF ERROR-EXITS *****',
   2390      $      '**' )
   2391 *
   2392 *     End of DCHKE.
   2393 *
   2394       END
   2395       SUBROUTINE DMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET,
   2396      $                  TRANSL )
   2397 *
   2398 *  Generates values for an M by N matrix A.
   2399 *  Stores the values in the array AA in the data structure required
   2400 *  by the routine, with unwanted elements set to rogue value.
   2401 *
   2402 *  TYPE is 'GE', 'SY' or 'TR'.
   2403 *
   2404 *  Auxiliary routine for test program for Level 3 Blas.
   2405 *
   2406 *  -- Written on 8-February-1989.
   2407 *     Jack Dongarra, Argonne National Laboratory.
   2408 *     Iain Duff, AERE Harwell.
   2409 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
   2410 *     Sven Hammarling, Numerical Algorithms Group Ltd.
   2411 *
   2412 *     .. Parameters ..
   2413       DOUBLE PRECISION   ZERO, ONE
   2414       PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
   2415       DOUBLE PRECISION   ROGUE
   2416       PARAMETER          ( ROGUE = -1.0D10 )
   2417 *     .. Scalar Arguments ..
   2418       DOUBLE PRECISION   TRANSL
   2419       INTEGER            LDA, M, N, NMAX
   2420       LOGICAL            RESET
   2421       CHARACTER*1        DIAG, UPLO
   2422       CHARACTER*2        TYPE
   2423 *     .. Array Arguments ..
   2424       DOUBLE PRECISION   A( NMAX, * ), AA( * )
   2425 *     .. Local Scalars ..
   2426       INTEGER            I, IBEG, IEND, J
   2427       LOGICAL            GEN, LOWER, SYM, TRI, UNIT, UPPER
   2428 *     .. External Functions ..
   2429       DOUBLE PRECISION   DBEG
   2430       EXTERNAL           DBEG
   2431 *     .. Executable Statements ..
   2432       GEN = TYPE.EQ.'GE'
   2433       SYM = TYPE.EQ.'SY'
   2434       TRI = TYPE.EQ.'TR'
   2435       UPPER = ( SYM.OR.TRI ).AND.UPLO.EQ.'U'
   2436       LOWER = ( SYM.OR.TRI ).AND.UPLO.EQ.'L'
   2437       UNIT = TRI.AND.DIAG.EQ.'U'
   2438 *
   2439 *     Generate data in array A.
   2440 *
   2441       DO 20 J = 1, N
   2442          DO 10 I = 1, M
   2443             IF( GEN.OR.( UPPER.AND.I.LE.J ).OR.( LOWER.AND.I.GE.J ) )
   2444      $          THEN
   2445                A( I, J ) = DBEG( RESET ) + TRANSL
   2446                IF( I.NE.J )THEN
   2447 *                 Set some elements to zero
   2448                   IF( N.GT.3.AND.J.EQ.N/2 )
   2449      $               A( I, J ) = ZERO
   2450                   IF( SYM )THEN
   2451                      A( J, I ) = A( I, J )
   2452                   ELSE IF( TRI )THEN
   2453                      A( J, I ) = ZERO
   2454                   END IF
   2455                END IF
   2456             END IF
   2457    10    CONTINUE
   2458          IF( TRI )
   2459      $      A( J, J ) = A( J, J ) + ONE
   2460          IF( UNIT )
   2461      $      A( J, J ) = ONE
   2462    20 CONTINUE
   2463 *
   2464 *     Store elements in array AS in data structure required by routine.
   2465 *
   2466       IF( TYPE.EQ.'GE' )THEN
   2467          DO 50 J = 1, N
   2468             DO 30 I = 1, M
   2469                AA( I + ( J - 1 )*LDA ) = A( I, J )
   2470    30       CONTINUE
   2471             DO 40 I = M + 1, LDA
   2472                AA( I + ( J - 1 )*LDA ) = ROGUE
   2473    40       CONTINUE
   2474    50    CONTINUE
   2475       ELSE IF( TYPE.EQ.'SY'.OR.TYPE.EQ.'TR' )THEN
   2476          DO 90 J = 1, N
   2477             IF( UPPER )THEN
   2478                IBEG = 1
   2479                IF( UNIT )THEN
   2480                   IEND = J - 1
   2481                ELSE
   2482                   IEND = J
   2483                END IF
   2484             ELSE
   2485                IF( UNIT )THEN
   2486                   IBEG = J + 1
   2487                ELSE
   2488                   IBEG = J
   2489                END IF
   2490                IEND = N
   2491             END IF
   2492             DO 60 I = 1, IBEG - 1
   2493                AA( I + ( J - 1 )*LDA ) = ROGUE
   2494    60       CONTINUE
   2495             DO 70 I = IBEG, IEND
   2496                AA( I + ( J - 1 )*LDA ) = A( I, J )
   2497    70       CONTINUE
   2498             DO 80 I = IEND + 1, LDA
   2499                AA( I + ( J - 1 )*LDA ) = ROGUE
   2500    80       CONTINUE
   2501    90    CONTINUE
   2502       END IF
   2503       RETURN
   2504 *
   2505 *     End of DMAKE.
   2506 *
   2507       END
   2508       SUBROUTINE DMMCH( TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB,
   2509      $                  BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, FATAL,
   2510      $                  NOUT, MV )
   2511 *
   2512 *  Checks the results of the computational tests.
   2513 *
   2514 *  Auxiliary routine for test program for Level 3 Blas.
   2515 *
   2516 *  -- Written on 8-February-1989.
   2517 *     Jack Dongarra, Argonne National Laboratory.
   2518 *     Iain Duff, AERE Harwell.
   2519 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
   2520 *     Sven Hammarling, Numerical Algorithms Group Ltd.
   2521 *
   2522 *     .. Parameters ..
   2523       DOUBLE PRECISION   ZERO, ONE
   2524       PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
   2525 *     .. Scalar Arguments ..
   2526       DOUBLE PRECISION   ALPHA, BETA, EPS, ERR
   2527       INTEGER            KK, LDA, LDB, LDC, LDCC, M, N, NOUT
   2528       LOGICAL            FATAL, MV
   2529       CHARACTER*1        TRANSA, TRANSB
   2530 *     .. Array Arguments ..
   2531       DOUBLE PRECISION   A( LDA, * ), B( LDB, * ), C( LDC, * ),
   2532      $                   CC( LDCC, * ), CT( * ), G( * )
   2533 *     .. Local Scalars ..
   2534       DOUBLE PRECISION   ERRI
   2535       INTEGER            I, J, K
   2536       LOGICAL            TRANA, TRANB
   2537 *     .. Intrinsic Functions ..
   2538       INTRINSIC          ABS, MAX, SQRT
   2539 *     .. Executable Statements ..
   2540       TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C'
   2541       TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C'
   2542 *
   2543 *     Compute expected result, one column at a time, in CT using data
   2544 *     in A, B and C.
   2545 *     Compute gauges in G.
   2546 *
   2547       DO 120 J = 1, N
   2548 *
   2549          DO 10 I = 1, M
   2550             CT( I ) = ZERO
   2551             G( I ) = ZERO
   2552    10    CONTINUE
   2553          IF( .NOT.TRANA.AND..NOT.TRANB )THEN
   2554             DO 30 K = 1, KK
   2555                DO 20 I = 1, M
   2556                   CT( I ) = CT( I ) + A( I, K )*B( K, J )
   2557                   G( I ) = G( I ) + ABS( A( I, K ) )*ABS( B( K, J ) )
   2558    20          CONTINUE
   2559    30       CONTINUE
   2560          ELSE IF( TRANA.AND..NOT.TRANB )THEN
   2561             DO 50 K = 1, KK
   2562                DO 40 I = 1, M
   2563                   CT( I ) = CT( I ) + A( K, I )*B( K, J )
   2564                   G( I ) = G( I ) + ABS( A( K, I ) )*ABS( B( K, J ) )
   2565    40          CONTINUE
   2566    50       CONTINUE
   2567          ELSE IF( .NOT.TRANA.AND.TRANB )THEN
   2568             DO 70 K = 1, KK
   2569                DO 60 I = 1, M
   2570                   CT( I ) = CT( I ) + A( I, K )*B( J, K )
   2571                   G( I ) = G( I ) + ABS( A( I, K ) )*ABS( B( J, K ) )
   2572    60          CONTINUE
   2573    70       CONTINUE
   2574          ELSE IF( TRANA.AND.TRANB )THEN
   2575             DO 90 K = 1, KK
   2576                DO 80 I = 1, M
   2577                   CT( I ) = CT( I ) + A( K, I )*B( J, K )
   2578                   G( I ) = G( I ) + ABS( A( K, I ) )*ABS( B( J, K ) )
   2579    80          CONTINUE
   2580    90       CONTINUE
   2581          END IF
   2582          DO 100 I = 1, M
   2583             CT( I ) = ALPHA*CT( I ) + BETA*C( I, J )
   2584             G( I ) = ABS( ALPHA )*G( I ) + ABS( BETA )*ABS( C( I, J ) )
   2585   100    CONTINUE
   2586 *
   2587 *        Compute the error ratio for this result.
   2588 *
   2589          ERR = ZERO
   2590          DO 110 I = 1, M
   2591             ERRI = ABS( CT( I ) - CC( I, J ) )/EPS
   2592             IF( G( I ).NE.ZERO )
   2593      $         ERRI = ERRI/G( I )
   2594             ERR = MAX( ERR, ERRI )
   2595             IF( ERR*SQRT( EPS ).GE.ONE )
   2596      $         GO TO 130
   2597   110    CONTINUE
   2598 *
   2599   120 CONTINUE
   2600 *
   2601 *     If the loop completes, all results are at least half accurate.
   2602       GO TO 150
   2603 *
   2604 *     Report fatal error.
   2605 *
   2606   130 FATAL = .TRUE.
   2607       WRITE( NOUT, FMT = 9999 )
   2608       DO 140 I = 1, M
   2609          IF( MV )THEN
   2610             WRITE( NOUT, FMT = 9998 )I, CT( I ), CC( I, J )
   2611          ELSE
   2612             WRITE( NOUT, FMT = 9998 )I, CC( I, J ), CT( I )
   2613          END IF
   2614   140 CONTINUE
   2615       IF( N.GT.1 )
   2616      $   WRITE( NOUT, FMT = 9997 )J
   2617 *
   2618   150 CONTINUE
   2619       RETURN
   2620 *
   2621  9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',
   2622      $      'F ACCURATE *******', /'           EXPECTED RESULT   COMPU',
   2623      $      'TED RESULT' )
   2624  9998 FORMAT( 1X, I7, 2G18.6 )
   2625  9997 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )
   2626 *
   2627 *     End of DMMCH.
   2628 *
   2629       END
   2630       LOGICAL FUNCTION LDE( RI, RJ, LR )
   2631 *
   2632 *  Tests if two arrays are identical.
   2633 *
   2634 *  Auxiliary routine for test program for Level 3 Blas.
   2635 *
   2636 *  -- Written on 8-February-1989.
   2637 *     Jack Dongarra, Argonne National Laboratory.
   2638 *     Iain Duff, AERE Harwell.
   2639 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
   2640 *     Sven Hammarling, Numerical Algorithms Group Ltd.
   2641 *
   2642 *     .. Scalar Arguments ..
   2643       INTEGER            LR
   2644 *     .. Array Arguments ..
   2645       DOUBLE PRECISION   RI( * ), RJ( * )
   2646 *     .. Local Scalars ..
   2647       INTEGER            I
   2648 *     .. Executable Statements ..
   2649       DO 10 I = 1, LR
   2650          IF( RI( I ).NE.RJ( I ) )
   2651      $      GO TO 20
   2652    10 CONTINUE
   2653       LDE = .TRUE.
   2654       GO TO 30
   2655    20 CONTINUE
   2656       LDE = .FALSE.
   2657    30 RETURN
   2658 *
   2659 *     End of LDE.
   2660 *
   2661       END
   2662       LOGICAL FUNCTION LDERES( TYPE, UPLO, M, N, AA, AS, LDA )
   2663 *
   2664 *  Tests if selected elements in two arrays are equal.
   2665 *
   2666 *  TYPE is 'GE' or 'SY'.
   2667 *
   2668 *  Auxiliary routine for test program for Level 3 Blas.
   2669 *
   2670 *  -- Written on 8-February-1989.
   2671 *     Jack Dongarra, Argonne National Laboratory.
   2672 *     Iain Duff, AERE Harwell.
   2673 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
   2674 *     Sven Hammarling, Numerical Algorithms Group Ltd.
   2675 *
   2676 *     .. Scalar Arguments ..
   2677       INTEGER            LDA, M, N
   2678       CHARACTER*1        UPLO
   2679       CHARACTER*2        TYPE
   2680 *     .. Array Arguments ..
   2681       DOUBLE PRECISION   AA( LDA, * ), AS( LDA, * )
   2682 *     .. Local Scalars ..
   2683       INTEGER            I, IBEG, IEND, J
   2684       LOGICAL            UPPER
   2685 *     .. Executable Statements ..
   2686       UPPER = UPLO.EQ.'U'
   2687       IF( TYPE.EQ.'GE' )THEN
   2688          DO 20 J = 1, N
   2689             DO 10 I = M + 1, LDA
   2690                IF( AA( I, J ).NE.AS( I, J ) )
   2691      $            GO TO 70
   2692    10       CONTINUE
   2693    20    CONTINUE
   2694       ELSE IF( TYPE.EQ.'SY' )THEN
   2695          DO 50 J = 1, N
   2696             IF( UPPER )THEN
   2697                IBEG = 1
   2698                IEND = J
   2699             ELSE
   2700                IBEG = J
   2701                IEND = N
   2702             END IF
   2703             DO 30 I = 1, IBEG - 1
   2704                IF( AA( I, J ).NE.AS( I, J ) )
   2705      $            GO TO 70
   2706    30       CONTINUE
   2707             DO 40 I = IEND + 1, LDA
   2708                IF( AA( I, J ).NE.AS( I, J ) )
   2709      $            GO TO 70
   2710    40       CONTINUE
   2711    50    CONTINUE
   2712       END IF
   2713 *
   2714       LDERES = .TRUE.
   2715       GO TO 80
   2716    70 CONTINUE
   2717       LDERES = .FALSE.
   2718    80 RETURN
   2719 *
   2720 *     End of LDERES.
   2721 *
   2722       END
   2723       DOUBLE PRECISION FUNCTION DBEG( RESET )
   2724 *
   2725 *  Generates random numbers uniformly distributed between -0.5 and 0.5.
   2726 *
   2727 *  Auxiliary routine for test program for Level 3 Blas.
   2728 *
   2729 *  -- Written on 8-February-1989.
   2730 *     Jack Dongarra, Argonne National Laboratory.
   2731 *     Iain Duff, AERE Harwell.
   2732 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
   2733 *     Sven Hammarling, Numerical Algorithms Group Ltd.
   2734 *
   2735 *     .. Scalar Arguments ..
   2736       LOGICAL            RESET
   2737 *     .. Local Scalars ..
   2738       INTEGER            I, IC, MI
   2739 *     .. Save statement ..
   2740       SAVE               I, IC, MI
   2741 *     .. Executable Statements ..
   2742       IF( RESET )THEN
   2743 *        Initialize local variables.
   2744          MI = 891
   2745          I = 7
   2746          IC = 0
   2747          RESET = .FALSE.
   2748       END IF
   2749 *
   2750 *     The sequence of values of I is bounded between 1 and 999.
   2751 *     If initial I = 1,2,3,6,7 or 9, the period will be 50.
   2752 *     If initial I = 4 or 8, the period will be 25.
   2753 *     If initial I = 5, the period will be 10.
   2754 *     IC is used to break up the period by skipping 1 value of I in 6.
   2755 *
   2756       IC = IC + 1
   2757    10 I = I*MI
   2758       I = I - 1000*( I/1000 )
   2759       IF( IC.GE.5 )THEN
   2760          IC = 0
   2761          GO TO 10
   2762       END IF
   2763       DBEG = ( I - 500 )/1001.0D0
   2764       RETURN
   2765 *
   2766 *     End of DBEG.
   2767 *
   2768       END
   2769       DOUBLE PRECISION FUNCTION DDIFF( X, Y )
   2770 *
   2771 *  Auxiliary routine for test program for Level 3 Blas.
   2772 *
   2773 *  -- Written on 8-February-1989.
   2774 *     Jack Dongarra, Argonne National Laboratory.
   2775 *     Iain Duff, AERE Harwell.
   2776 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
   2777 *     Sven Hammarling, Numerical Algorithms Group Ltd.
   2778 *
   2779 *     .. Scalar Arguments ..
   2780       DOUBLE PRECISION   X, Y
   2781 *     .. Executable Statements ..
   2782       DDIFF = X - Y
   2783       RETURN
   2784 *
   2785 *     End of DDIFF.
   2786 *
   2787       END
   2788       SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
   2789 *
   2790 *  Tests whether XERBLA has detected an error when it should.
   2791 *
   2792 *  Auxiliary routine for test program for Level 3 Blas.
   2793 *
   2794 *  -- Written on 8-February-1989.
   2795 *     Jack Dongarra, Argonne National Laboratory.
   2796 *     Iain Duff, AERE Harwell.
   2797 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
   2798 *     Sven Hammarling, Numerical Algorithms Group Ltd.
   2799 *
   2800 *     .. Scalar Arguments ..
   2801       INTEGER            INFOT, NOUT
   2802       LOGICAL            LERR, OK
   2803       CHARACTER*6        SRNAMT
   2804 *     .. Executable Statements ..
   2805       IF( .NOT.LERR )THEN
   2806          WRITE( NOUT, FMT = 9999 )INFOT, SRNAMT
   2807          OK = .FALSE.
   2808       END IF
   2809       LERR = .FALSE.
   2810       RETURN
   2811 *
   2812  9999 FORMAT( ' ***** ILLEGAL VALUE OF PARAMETER NUMBER ', I2, ' NOT D',
   2813      $      'ETECTED BY ', A6, ' *****' )
   2814 *
   2815 *     End of CHKXER.
   2816 *
   2817       END
   2818       SUBROUTINE XERBLA( SRNAME, INFO )
   2819 *
   2820 *  This is a special version of XERBLA to be used only as part of
   2821 *  the test program for testing error exits from the Level 3 BLAS
   2822 *  routines.
   2823 *
   2824 *  XERBLA  is an error handler for the Level 3 BLAS routines.
   2825 *
   2826 *  It is called by the Level 3 BLAS routines if an input parameter is
   2827 *  invalid.
   2828 *
   2829 *  Auxiliary routine for test program for Level 3 Blas.
   2830 *
   2831 *  -- Written on 8-February-1989.
   2832 *     Jack Dongarra, Argonne National Laboratory.
   2833 *     Iain Duff, AERE Harwell.
   2834 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
   2835 *     Sven Hammarling, Numerical Algorithms Group Ltd.
   2836 *
   2837 *     .. Scalar Arguments ..
   2838       INTEGER            INFO
   2839       CHARACTER*6        SRNAME
   2840 *     .. Scalars in Common ..
   2841       INTEGER            INFOT, NOUT
   2842       LOGICAL            LERR, OK
   2843       CHARACTER*6        SRNAMT
   2844 *     .. Common blocks ..
   2845       COMMON             /INFOC/INFOT, NOUT, OK, LERR
   2846       COMMON             /SRNAMC/SRNAMT
   2847 *     .. Executable Statements ..
   2848       LERR = .TRUE.
   2849       IF( INFO.NE.INFOT )THEN
   2850          IF( INFOT.NE.0 )THEN
   2851             WRITE( NOUT, FMT = 9999 )INFO, INFOT
   2852          ELSE
   2853             WRITE( NOUT, FMT = 9997 )INFO
   2854          END IF
   2855          OK = .FALSE.
   2856       END IF
   2857       IF( SRNAME.NE.SRNAMT )THEN
   2858          WRITE( NOUT, FMT = 9998 )SRNAME, SRNAMT
   2859          OK = .FALSE.
   2860       END IF
   2861       RETURN
   2862 *
   2863  9999 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, ' INSTEAD',
   2864      $      ' OF ', I2, ' *******' )
   2865  9998 FORMAT( ' ******* XERBLA WAS CALLED WITH SRNAME = ', A6, ' INSTE',
   2866      $      'AD OF ', A6, ' *******' )
   2867  9997 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6,
   2868      $      ' *******' )
   2869 *
   2870 *     End of XERBLA
   2871 *
   2872       END
   2873 
   2874