home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / lib / mathlib / libblas / test / sblat3.f < prev    next >
Encoding:
Text File  |  1994-08-02  |  100.6 KB  |  2,824 lines

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