LAPACK  3.4.0
LAPACK: Linear Algebra PACKage
cblat3.f
Go to the documentation of this file.
00001 *> \brief \b CBLAT3
00002 *
00003 *  =========== DOCUMENTATION ===========
00004 *
00005 * Online html documentation available at 
00006 *            http://www.netlib.org/lapack/explore-html/ 
00007 *
00008 *  Definition:
00009 *  ===========
00010 *
00011 *       PROGRAM CBLAT3
00012 * 
00013 *
00014 *> \par Purpose:
00015 *  =============
00016 *>
00017 *> \verbatim
00018 *>
00019 *> Test program for the COMPLEX          Level 3 Blas.
00020 *>
00021 *> The program must be driven by a short data file. The first 14 records
00022 *> of the file are read using list-directed input, the last 9 records
00023 *> are read using the format ( A6, L2 ). An annotated example of a data
00024 *> file can be obtained by deleting the first 3 characters from the
00025 *> following 23 lines:
00026 *> 'cblat3.out'      NAME OF SUMMARY OUTPUT FILE
00027 *> 6                 UNIT NUMBER OF SUMMARY FILE
00028 *> 'CBLAT3.SNAP'     NAME OF SNAPSHOT OUTPUT FILE
00029 *> -1                UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0)
00030 *> F        LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD.
00031 *> F        LOGICAL FLAG, T TO STOP ON FAILURES.
00032 *> T        LOGICAL FLAG, T TO TEST ERROR EXITS.
00033 *> 16.0     THRESHOLD VALUE OF TEST RATIO
00034 *> 6                 NUMBER OF VALUES OF N
00035 *> 0 1 2 3 5 9       VALUES OF N
00036 *> 3                 NUMBER OF VALUES OF ALPHA
00037 *> (0.0,0.0) (1.0,0.0) (0.7,-0.9)       VALUES OF ALPHA
00038 *> 3                 NUMBER OF VALUES OF BETA
00039 *> (0.0,0.0) (1.0,0.0) (1.3,-1.1)       VALUES OF BETA
00040 *> CGEMM  T PUT F FOR NO TEST. SAME COLUMNS.
00041 *> CHEMM  T PUT F FOR NO TEST. SAME COLUMNS.
00042 *> CSYMM  T PUT F FOR NO TEST. SAME COLUMNS.
00043 *> CTRMM  T PUT F FOR NO TEST. SAME COLUMNS.
00044 *> CTRSM  T PUT F FOR NO TEST. SAME COLUMNS.
00045 *> CHERK  T PUT F FOR NO TEST. SAME COLUMNS.
00046 *> CSYRK  T PUT F FOR NO TEST. SAME COLUMNS.
00047 *> CHER2K T PUT F FOR NO TEST. SAME COLUMNS.
00048 *> CSYR2K T PUT F FOR NO TEST. SAME COLUMNS.
00049 *>
00050 *> Further Details
00051 *> ===============
00052 *>
00053 *> See:
00054 *>
00055 *>    Dongarra J. J., Du Croz J. J., Duff I. S. and Hammarling S.
00056 *>    A Set of Level 3 Basic Linear Algebra Subprograms.
00057 *>
00058 *>    Technical Memorandum No.88 (Revision 1), Mathematics and
00059 *>    Computer Science Division, Argonne National Laboratory, 9700
00060 *>    South Cass Avenue, Argonne, Illinois 60439, US.
00061 *>
00062 *> -- Written on 8-February-1989.
00063 *>    Jack Dongarra, Argonne National Laboratory.
00064 *>    Iain Duff, AERE Harwell.
00065 *>    Jeremy Du Croz, Numerical Algorithms Group Ltd.
00066 *>    Sven Hammarling, Numerical Algorithms Group Ltd.
00067 *>
00068 *>    10-9-00:  Change STATUS='NEW' to 'UNKNOWN' so that the testers
00069 *>              can be run multiple times without deleting generated
00070 *>              output files (susan)
00071 *> \endverbatim
00072 *
00073 *  Authors:
00074 *  ========
00075 *
00076 *> \author Univ. of Tennessee 
00077 *> \author Univ. of California Berkeley 
00078 *> \author Univ. of Colorado Denver 
00079 *> \author NAG Ltd. 
00080 *
00081 *> \date November 2011
00082 *
00083 *> \ingroup complex_blas_testing
00084 *
00085 *  =====================================================================      PROGRAM CBLAT3
00086 *
00087 *  -- Reference BLAS test routine (version 3.4.0) --
00088 *  -- Reference BLAS is a software package provided by Univ. of Tennessee,    --
00089 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
00090 *     November 2011
00091 *
00092 *  =====================================================================
00093 *
00094 *     .. Parameters ..
00095       INTEGER            NIN
00096       PARAMETER          ( NIN = 5 )
00097       INTEGER            NSUBS
00098       PARAMETER          ( NSUBS = 9 )
00099       COMPLEX            ZERO, ONE
00100       PARAMETER          ( ZERO = ( 0.0, 0.0 ), ONE = ( 1.0, 0.0 ) )
00101       REAL               RZERO, RHALF, RONE
00102       PARAMETER          ( RZERO = 0.0, RHALF = 0.5, RONE = 1.0 )
00103       INTEGER            NMAX
00104       PARAMETER          ( NMAX = 65 )
00105       INTEGER            NIDMAX, NALMAX, NBEMAX
00106       PARAMETER          ( NIDMAX = 9, NALMAX = 7, NBEMAX = 7 )
00107 *     .. Local Scalars ..
00108       REAL               EPS, ERR, THRESH
00109       INTEGER            I, ISNUM, J, N, NALF, NBET, NIDIM, NOUT, NTRA
00110       LOGICAL            FATAL, LTESTT, REWI, SAME, SFATAL, TRACE,
00111      $                   TSTERR
00112       CHARACTER*1        TRANSA, TRANSB
00113       CHARACTER*6        SNAMET
00114       CHARACTER*32       SNAPS, SUMMRY
00115 *     .. Local Arrays ..
00116       COMPLEX            AA( NMAX*NMAX ), AB( NMAX, 2*NMAX ),
00117      $                   ALF( NALMAX ), AS( NMAX*NMAX ),
00118      $                   BB( NMAX*NMAX ), BET( NBEMAX ),
00119      $                   BS( NMAX*NMAX ), C( NMAX, NMAX ),
00120      $                   CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ),
00121      $                   W( 2*NMAX )
00122       REAL               G( NMAX )
00123       INTEGER            IDIM( NIDMAX )
00124       LOGICAL            LTEST( NSUBS )
00125       CHARACTER*6        SNAMES( NSUBS )
00126 *     .. External Functions ..
00127       REAL               SDIFF
00128       LOGICAL            LCE
00129       EXTERNAL           SDIFF, LCE
00130 *     .. External Subroutines ..
00131       EXTERNAL           CCHK1, CCHK2, CCHK3, CCHK4, CCHK5, CCHKE, CMMCH
00132 *     .. Intrinsic Functions ..
00133       INTRINSIC          MAX, MIN
00134 *     .. Scalars in Common ..
00135       INTEGER            INFOT, NOUTC
00136       LOGICAL            LERR, OK
00137       CHARACTER*6        SRNAMT
00138 *     .. Common blocks ..
00139       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
00140       COMMON             /SRNAMC/SRNAMT
00141 *     .. Data statements ..
00142       DATA               SNAMES/'CGEMM ', 'CHEMM ', 'CSYMM ', 'CTRMM ',
00143      $                   'CTRSM ', 'CHERK ', 'CSYRK ', 'CHER2K',
00144      $                   'CSYR2K'/
00145 *     .. Executable Statements ..
00146 *
00147 *     Read name and unit number for summary output file and open file.
00148 *
00149       READ( NIN, FMT = * )SUMMRY
00150       READ( NIN, FMT = * )NOUT
00151       OPEN( NOUT, FILE = SUMMRY )
00152       NOUTC = NOUT
00153 *
00154 *     Read name and unit number for snapshot output file and open file.
00155 *
00156       READ( NIN, FMT = * )SNAPS
00157       READ( NIN, FMT = * )NTRA
00158       TRACE = NTRA.GE.0
00159       IF( TRACE )THEN
00160          OPEN( NTRA, FILE = SNAPS )
00161       END IF
00162 *     Read the flag that directs rewinding of the snapshot file.
00163       READ( NIN, FMT = * )REWI
00164       REWI = REWI.AND.TRACE
00165 *     Read the flag that directs stopping on any failure.
00166       READ( NIN, FMT = * )SFATAL
00167 *     Read the flag that indicates whether error exits are to be tested.
00168       READ( NIN, FMT = * )TSTERR
00169 *     Read the threshold value of the test ratio
00170       READ( NIN, FMT = * )THRESH
00171 *
00172 *     Read and check the parameter values for the tests.
00173 *
00174 *     Values of N
00175       READ( NIN, FMT = * )NIDIM
00176       IF( NIDIM.LT.1.OR.NIDIM.GT.NIDMAX )THEN
00177          WRITE( NOUT, FMT = 9997 )'N', NIDMAX
00178          GO TO 220
00179       END IF
00180       READ( NIN, FMT = * )( IDIM( I ), I = 1, NIDIM )
00181       DO 10 I = 1, NIDIM
00182          IF( IDIM( I ).LT.0.OR.IDIM( I ).GT.NMAX )THEN
00183             WRITE( NOUT, FMT = 9996 )NMAX
00184             GO TO 220
00185          END IF
00186    10 CONTINUE
00187 *     Values of ALPHA
00188       READ( NIN, FMT = * )NALF
00189       IF( NALF.LT.1.OR.NALF.GT.NALMAX )THEN
00190          WRITE( NOUT, FMT = 9997 )'ALPHA', NALMAX
00191          GO TO 220
00192       END IF
00193       READ( NIN, FMT = * )( ALF( I ), I = 1, NALF )
00194 *     Values of BETA
00195       READ( NIN, FMT = * )NBET
00196       IF( NBET.LT.1.OR.NBET.GT.NBEMAX )THEN
00197          WRITE( NOUT, FMT = 9997 )'BETA', NBEMAX
00198          GO TO 220
00199       END IF
00200       READ( NIN, FMT = * )( BET( I ), I = 1, NBET )
00201 *
00202 *     Report values of parameters.
00203 *
00204       WRITE( NOUT, FMT = 9995 )
00205       WRITE( NOUT, FMT = 9994 )( IDIM( I ), I = 1, NIDIM )
00206       WRITE( NOUT, FMT = 9993 )( ALF( I ), I = 1, NALF )
00207       WRITE( NOUT, FMT = 9992 )( BET( I ), I = 1, NBET )
00208       IF( .NOT.TSTERR )THEN
00209          WRITE( NOUT, FMT = * )
00210          WRITE( NOUT, FMT = 9984 )
00211       END IF
00212       WRITE( NOUT, FMT = * )
00213       WRITE( NOUT, FMT = 9999 )THRESH
00214       WRITE( NOUT, FMT = * )
00215 *
00216 *     Read names of subroutines and flags which indicate
00217 *     whether they are to be tested.
00218 *
00219       DO 20 I = 1, NSUBS
00220          LTEST( I ) = .FALSE.
00221    20 CONTINUE
00222    30 READ( NIN, FMT = 9988, END = 60 )SNAMET, LTESTT
00223       DO 40 I = 1, NSUBS
00224          IF( SNAMET.EQ.SNAMES( I ) )
00225      $      GO TO 50
00226    40 CONTINUE
00227       WRITE( NOUT, FMT = 9990 )SNAMET
00228       STOP
00229    50 LTEST( I ) = LTESTT
00230       GO TO 30
00231 *
00232    60 CONTINUE
00233       CLOSE ( NIN )
00234 *
00235 *     Compute EPS (the machine precision).
00236 *
00237       EPS = RONE
00238    70 CONTINUE
00239       IF( SDIFF( RONE + EPS, RONE ).EQ.RZERO )
00240      $   GO TO 80
00241       EPS = RHALF*EPS
00242       GO TO 70
00243    80 CONTINUE
00244       EPS = EPS + EPS
00245       WRITE( NOUT, FMT = 9998 )EPS
00246 *
00247 *     Check the reliability of CMMCH using exact data.
00248 *
00249       N = MIN( 32, NMAX )
00250       DO 100 J = 1, N
00251          DO 90 I = 1, N
00252             AB( I, J ) = MAX( I - J + 1, 0 )
00253    90    CONTINUE
00254          AB( J, NMAX + 1 ) = J
00255          AB( 1, NMAX + J ) = J
00256          C( J, 1 ) = ZERO
00257   100 CONTINUE
00258       DO 110 J = 1, N
00259          CC( J ) = J*( ( J + 1 )*J )/2 - ( ( J + 1 )*J*( J - 1 ) )/3
00260   110 CONTINUE
00261 *     CC holds the exact result. On exit from CMMCH CT holds
00262 *     the result computed by CMMCH.
00263       TRANSA = 'N'
00264       TRANSB = 'N'
00265       CALL CMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,
00266      $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,
00267      $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )
00268       SAME = LCE( CC, CT, N )
00269       IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN
00270          WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR
00271          STOP
00272       END IF
00273       TRANSB = 'C'
00274       CALL CMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,
00275      $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,
00276      $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )
00277       SAME = LCE( CC, CT, N )
00278       IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN
00279          WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR
00280          STOP
00281       END IF
00282       DO 120 J = 1, N
00283          AB( J, NMAX + 1 ) = N - J + 1
00284          AB( 1, NMAX + J ) = N - J + 1
00285   120 CONTINUE
00286       DO 130 J = 1, N
00287          CC( N - J + 1 ) = J*( ( J + 1 )*J )/2 -
00288      $                     ( ( J + 1 )*J*( J - 1 ) )/3
00289   130 CONTINUE
00290       TRANSA = 'C'
00291       TRANSB = 'N'
00292       CALL CMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,
00293      $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,
00294      $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )
00295       SAME = LCE( CC, CT, N )
00296       IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN
00297          WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR
00298          STOP
00299       END IF
00300       TRANSB = 'C'
00301       CALL CMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,
00302      $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,
00303      $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )
00304       SAME = LCE( CC, CT, N )
00305       IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN
00306          WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR
00307          STOP
00308       END IF
00309 *
00310 *     Test each subroutine in turn.
00311 *
00312       DO 200 ISNUM = 1, NSUBS
00313          WRITE( NOUT, FMT = * )
00314          IF( .NOT.LTEST( ISNUM ) )THEN
00315 *           Subprogram is not to be tested.
00316             WRITE( NOUT, FMT = 9987 )SNAMES( ISNUM )
00317          ELSE
00318             SRNAMT = SNAMES( ISNUM )
00319 *           Test error exits.
00320             IF( TSTERR )THEN
00321                CALL CCHKE( ISNUM, SNAMES( ISNUM ), NOUT )
00322                WRITE( NOUT, FMT = * )
00323             END IF
00324 *           Test computations.
00325             INFOT = 0
00326             OK = .TRUE.
00327             FATAL = .FALSE.
00328             GO TO ( 140, 150, 150, 160, 160, 170, 170,
00329      $              180, 180 )ISNUM
00330 *           Test CGEMM, 01.
00331   140       CALL CCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
00332      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
00333      $                  NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
00334      $                  CC, CS, CT, G )
00335             GO TO 190
00336 *           Test CHEMM, 02, CSYMM, 03.
00337   150       CALL CCHK2( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
00338      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
00339      $                  NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
00340      $                  CC, CS, CT, G )
00341             GO TO 190
00342 *           Test CTRMM, 04, CTRSM, 05.
00343   160       CALL CCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
00344      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NMAX, AB,
00345      $                  AA, AS, AB( 1, NMAX + 1 ), BB, BS, CT, G, C )
00346             GO TO 190
00347 *           Test CHERK, 06, CSYRK, 07.
00348   170       CALL CCHK4( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
00349      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
00350      $                  NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
00351      $                  CC, CS, CT, G )
00352             GO TO 190
00353 *           Test CHER2K, 08, CSYR2K, 09.
00354   180       CALL CCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
00355      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
00356      $                  NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W )
00357             GO TO 190
00358 *
00359   190       IF( FATAL.AND.SFATAL )
00360      $         GO TO 210
00361          END IF
00362   200 CONTINUE
00363       WRITE( NOUT, FMT = 9986 )
00364       GO TO 230
00365 *
00366   210 CONTINUE
00367       WRITE( NOUT, FMT = 9985 )
00368       GO TO 230
00369 *
00370   220 CONTINUE
00371       WRITE( NOUT, FMT = 9991 )
00372 *
00373   230 CONTINUE
00374       IF( TRACE )
00375      $   CLOSE ( NTRA )
00376       CLOSE ( NOUT )
00377       STOP
00378 *
00379  9999 FORMAT( ' ROUTINES PASS COMPUTATIONAL TESTS IF TEST RATIO IS LES',
00380      $      'S THAN', F8.2 )
00381  9998 FORMAT( ' RELATIVE MACHINE PRECISION IS TAKEN TO BE', 1P, E9.1 )
00382  9997 FORMAT( ' NUMBER OF VALUES OF ', A, ' IS LESS THAN 1 OR GREATER ',
00383      $      'THAN ', I2 )
00384  9996 FORMAT( ' VALUE OF N IS LESS THAN 0 OR GREATER THAN ', I2 )
00385  9995 FORMAT( ' TESTS OF THE COMPLEX          LEVEL 3 BLAS', //' THE F',
00386      $      'OLLOWING PARAMETER VALUES WILL BE USED:' )
00387  9994 FORMAT( '   FOR N              ', 9I6 )
00388  9993 FORMAT( '   FOR ALPHA          ',
00389      $      7( '(', F4.1, ',', F4.1, ')  ', : ) )
00390  9992 FORMAT( '   FOR BETA           ',
00391      $      7( '(', F4.1, ',', F4.1, ')  ', : ) )
00392  9991 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM',
00393      $      /' ******* TESTS ABANDONED *******' )
00394  9990 FORMAT( ' SUBPROGRAM NAME ', A6, ' NOT RECOGNIZED', /' ******* T',
00395      $      'ESTS ABANDONED *******' )
00396  9989 FORMAT( ' ERROR IN CMMCH -  IN-LINE DOT PRODUCTS ARE BEING EVALU',
00397      $      'ATED WRONGLY.', /' CMMCH WAS CALLED WITH TRANSA = ', A1,
00398      $      ' AND TRANSB = ', A1, /' AND RETURNED SAME = ', L1, ' AND ',
00399      $      'ERR = ', F12.3, '.', /' THIS MAY BE DUE TO FAULTS IN THE ',
00400      $      'ARITHMETIC OR THE COMPILER.', /' ******* TESTS ABANDONED ',
00401      $      '*******' )
00402  9988 FORMAT( A6, L2 )
00403  9987 FORMAT( 1X, A6, ' WAS NOT TESTED' )
00404  9986 FORMAT( /' END OF TESTS' )
00405  9985 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' )
00406  9984 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' )
00407 *
00408 *     End of CBLAT3.
00409 *
00410       END
00411       SUBROUTINE CCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
00412      $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,
00413      $                  A, AA, AS, B, BB, BS, C, CC, CS, CT, G )
00414 *
00415 *  Tests CGEMM.
00416 *
00417 *  Auxiliary routine for test program for Level 3 Blas.
00418 *
00419 *  -- Written on 8-February-1989.
00420 *     Jack Dongarra, Argonne National Laboratory.
00421 *     Iain Duff, AERE Harwell.
00422 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
00423 *     Sven Hammarling, Numerical Algorithms Group Ltd.
00424 *
00425 *     .. Parameters ..
00426       COMPLEX            ZERO
00427       PARAMETER          ( ZERO = ( 0.0, 0.0 ) )
00428       REAL               RZERO
00429       PARAMETER          ( RZERO = 0.0 )
00430 *     .. Scalar Arguments ..
00431       REAL               EPS, THRESH
00432       INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA
00433       LOGICAL            FATAL, REWI, TRACE
00434       CHARACTER*6        SNAME
00435 *     .. Array Arguments ..
00436       COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
00437      $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),
00438      $                   BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),
00439      $                   C( NMAX, NMAX ), CC( NMAX*NMAX ),
00440      $                   CS( NMAX*NMAX ), CT( NMAX )
00441       REAL               G( NMAX )
00442       INTEGER            IDIM( NIDIM )
00443 *     .. Local Scalars ..
00444       COMPLEX            ALPHA, ALS, BETA, BLS
00445       REAL               ERR, ERRMAX
00446       INTEGER            I, IA, IB, ICA, ICB, IK, IM, IN, K, KS, LAA,
00447      $                   LBB, LCC, LDA, LDAS, LDB, LDBS, LDC, LDCS, M,
00448      $                   MA, MB, MS, N, NA, NARGS, NB, NC, NS
00449       LOGICAL            NULL, RESET, SAME, TRANA, TRANB
00450       CHARACTER*1        TRANAS, TRANBS, TRANSA, TRANSB
00451       CHARACTER*3        ICH
00452 *     .. Local Arrays ..
00453       LOGICAL            ISAME( 13 )
00454 *     .. External Functions ..
00455       LOGICAL            LCE, LCERES
00456       EXTERNAL           LCE, LCERES
00457 *     .. External Subroutines ..
00458       EXTERNAL           CGEMM, CMAKE, CMMCH
00459 *     .. Intrinsic Functions ..
00460       INTRINSIC          MAX
00461 *     .. Scalars in Common ..
00462       INTEGER            INFOT, NOUTC
00463       LOGICAL            LERR, OK
00464 *     .. Common blocks ..
00465       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
00466 *     .. Data statements ..
00467       DATA               ICH/'NTC'/
00468 *     .. Executable Statements ..
00469 *
00470       NARGS = 13
00471       NC = 0
00472       RESET = .TRUE.
00473       ERRMAX = RZERO
00474 *
00475       DO 110 IM = 1, NIDIM
00476          M = IDIM( IM )
00477 *
00478          DO 100 IN = 1, NIDIM
00479             N = IDIM( IN )
00480 *           Set LDC to 1 more than minimum value if room.
00481             LDC = M
00482             IF( LDC.LT.NMAX )
00483      $         LDC = LDC + 1
00484 *           Skip tests if not enough room.
00485             IF( LDC.GT.NMAX )
00486      $         GO TO 100
00487             LCC = LDC*N
00488             NULL = N.LE.0.OR.M.LE.0
00489 *
00490             DO 90 IK = 1, NIDIM
00491                K = IDIM( IK )
00492 *
00493                DO 80 ICA = 1, 3
00494                   TRANSA = ICH( ICA: ICA )
00495                   TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C'
00496 *
00497                   IF( TRANA )THEN
00498                      MA = K
00499                      NA = M
00500                   ELSE
00501                      MA = M
00502                      NA = K
00503                   END IF
00504 *                 Set LDA to 1 more than minimum value if room.
00505                   LDA = MA
00506                   IF( LDA.LT.NMAX )
00507      $               LDA = LDA + 1
00508 *                 Skip tests if not enough room.
00509                   IF( LDA.GT.NMAX )
00510      $               GO TO 80
00511                   LAA = LDA*NA
00512 *
00513 *                 Generate the matrix A.
00514 *
00515                   CALL CMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA,
00516      $                        RESET, ZERO )
00517 *
00518                   DO 70 ICB = 1, 3
00519                      TRANSB = ICH( ICB: ICB )
00520                      TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C'
00521 *
00522                      IF( TRANB )THEN
00523                         MB = N
00524                         NB = K
00525                      ELSE
00526                         MB = K
00527                         NB = N
00528                      END IF
00529 *                    Set LDB to 1 more than minimum value if room.
00530                      LDB = MB
00531                      IF( LDB.LT.NMAX )
00532      $                  LDB = LDB + 1
00533 *                    Skip tests if not enough room.
00534                      IF( LDB.GT.NMAX )
00535      $                  GO TO 70
00536                      LBB = LDB*NB
00537 *
00538 *                    Generate the matrix B.
00539 *
00540                      CALL CMAKE( 'GE', ' ', ' ', MB, NB, B, NMAX, BB,
00541      $                           LDB, RESET, ZERO )
00542 *
00543                      DO 60 IA = 1, NALF
00544                         ALPHA = ALF( IA )
00545 *
00546                         DO 50 IB = 1, NBET
00547                            BETA = BET( IB )
00548 *
00549 *                          Generate the matrix C.
00550 *
00551                            CALL CMAKE( 'GE', ' ', ' ', M, N, C, NMAX,
00552      $                                 CC, LDC, RESET, ZERO )
00553 *
00554                            NC = NC + 1
00555 *
00556 *                          Save every datum before calling the
00557 *                          subroutine.
00558 *
00559                            TRANAS = TRANSA
00560                            TRANBS = TRANSB
00561                            MS = M
00562                            NS = N
00563                            KS = K
00564                            ALS = ALPHA
00565                            DO 10 I = 1, LAA
00566                               AS( I ) = AA( I )
00567    10                      CONTINUE
00568                            LDAS = LDA
00569                            DO 20 I = 1, LBB
00570                               BS( I ) = BB( I )
00571    20                      CONTINUE
00572                            LDBS = LDB
00573                            BLS = BETA
00574                            DO 30 I = 1, LCC
00575                               CS( I ) = CC( I )
00576    30                      CONTINUE
00577                            LDCS = LDC
00578 *
00579 *                          Call the subroutine.
00580 *
00581                            IF( TRACE )
00582      $                        WRITE( NTRA, FMT = 9995 )NC, SNAME,
00583      $                        TRANSA, TRANSB, M, N, K, ALPHA, LDA, LDB,
00584      $                        BETA, LDC
00585                            IF( REWI )
00586      $                        REWIND NTRA
00587                            CALL CGEMM( TRANSA, TRANSB, M, N, K, ALPHA,
00588      $                                 AA, LDA, BB, LDB, BETA, CC, LDC )
00589 *
00590 *                          Check if error-exit was taken incorrectly.
00591 *
00592                            IF( .NOT.OK )THEN
00593                               WRITE( NOUT, FMT = 9994 )
00594                               FATAL = .TRUE.
00595                               GO TO 120
00596                            END IF
00597 *
00598 *                          See what data changed inside subroutines.
00599 *
00600                            ISAME( 1 ) = TRANSA.EQ.TRANAS
00601                            ISAME( 2 ) = TRANSB.EQ.TRANBS
00602                            ISAME( 3 ) = MS.EQ.M
00603                            ISAME( 4 ) = NS.EQ.N
00604                            ISAME( 5 ) = KS.EQ.K
00605                            ISAME( 6 ) = ALS.EQ.ALPHA
00606                            ISAME( 7 ) = LCE( AS, AA, LAA )
00607                            ISAME( 8 ) = LDAS.EQ.LDA
00608                            ISAME( 9 ) = LCE( BS, BB, LBB )
00609                            ISAME( 10 ) = LDBS.EQ.LDB
00610                            ISAME( 11 ) = BLS.EQ.BETA
00611                            IF( NULL )THEN
00612                               ISAME( 12 ) = LCE( CS, CC, LCC )
00613                            ELSE
00614                               ISAME( 12 ) = LCERES( 'GE', ' ', M, N, CS,
00615      $                                      CC, LDC )
00616                            END IF
00617                            ISAME( 13 ) = LDCS.EQ.LDC
00618 *
00619 *                          If data was incorrectly changed, report
00620 *                          and return.
00621 *
00622                            SAME = .TRUE.
00623                            DO 40 I = 1, NARGS
00624                               SAME = SAME.AND.ISAME( I )
00625                               IF( .NOT.ISAME( I ) )
00626      $                           WRITE( NOUT, FMT = 9998 )I
00627    40                      CONTINUE
00628                            IF( .NOT.SAME )THEN
00629                               FATAL = .TRUE.
00630                               GO TO 120
00631                            END IF
00632 *
00633                            IF( .NOT.NULL )THEN
00634 *
00635 *                             Check the result.
00636 *
00637                               CALL CMMCH( TRANSA, TRANSB, M, N, K,
00638      $                                    ALPHA, A, NMAX, B, NMAX, BETA,
00639      $                                    C, NMAX, CT, G, CC, LDC, EPS,
00640      $                                    ERR, FATAL, NOUT, .TRUE. )
00641                               ERRMAX = MAX( ERRMAX, ERR )
00642 *                             If got really bad answer, report and
00643 *                             return.
00644                               IF( FATAL )
00645      $                           GO TO 120
00646                            END IF
00647 *
00648    50                   CONTINUE
00649 *
00650    60                CONTINUE
00651 *
00652    70             CONTINUE
00653 *
00654    80          CONTINUE
00655 *
00656    90       CONTINUE
00657 *
00658   100    CONTINUE
00659 *
00660   110 CONTINUE
00661 *
00662 *     Report result.
00663 *
00664       IF( ERRMAX.LT.THRESH )THEN
00665          WRITE( NOUT, FMT = 9999 )SNAME, NC
00666       ELSE
00667          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
00668       END IF
00669       GO TO 130
00670 *
00671   120 CONTINUE
00672       WRITE( NOUT, FMT = 9996 )SNAME
00673       WRITE( NOUT, FMT = 9995 )NC, SNAME, TRANSA, TRANSB, M, N, K,
00674      $   ALPHA, LDA, LDB, BETA, LDC
00675 *
00676   130 CONTINUE
00677       RETURN
00678 *
00679  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
00680      $      'S)' )
00681  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
00682      $      'ANGED INCORRECTLY *******' )
00683  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
00684      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
00685      $      ' - SUSPECT *******' )
00686  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
00687  9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',''', A1, ''',',
00688      $      3( I3, ',' ), '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3,
00689      $      ',(', F4.1, ',', F4.1, '), C,', I3, ').' )
00690  9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
00691      $      '******' )
00692 *
00693 *     End of CCHK1.
00694 *
00695       END
00696       SUBROUTINE CCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
00697      $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,
00698      $                  A, AA, AS, B, BB, BS, C, CC, CS, CT, G )
00699 *
00700 *  Tests CHEMM and CSYMM.
00701 *
00702 *  Auxiliary routine for test program for Level 3 Blas.
00703 *
00704 *  -- Written on 8-February-1989.
00705 *     Jack Dongarra, Argonne National Laboratory.
00706 *     Iain Duff, AERE Harwell.
00707 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
00708 *     Sven Hammarling, Numerical Algorithms Group Ltd.
00709 *
00710 *     .. Parameters ..
00711       COMPLEX            ZERO
00712       PARAMETER          ( ZERO = ( 0.0, 0.0 ) )
00713       REAL               RZERO
00714       PARAMETER          ( RZERO = 0.0 )
00715 *     .. Scalar Arguments ..
00716       REAL               EPS, THRESH
00717       INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA
00718       LOGICAL            FATAL, REWI, TRACE
00719       CHARACTER*6        SNAME
00720 *     .. Array Arguments ..
00721       COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
00722      $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),
00723      $                   BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),
00724      $                   C( NMAX, NMAX ), CC( NMAX*NMAX ),
00725      $                   CS( NMAX*NMAX ), CT( NMAX )
00726       REAL               G( NMAX )
00727       INTEGER            IDIM( NIDIM )
00728 *     .. Local Scalars ..
00729       COMPLEX            ALPHA, ALS, BETA, BLS
00730       REAL               ERR, ERRMAX
00731       INTEGER            I, IA, IB, ICS, ICU, IM, IN, LAA, LBB, LCC,
00732      $                   LDA, LDAS, LDB, LDBS, LDC, LDCS, M, MS, N, NA,
00733      $                   NARGS, NC, NS
00734       LOGICAL            CONJ, LEFT, NULL, RESET, SAME
00735       CHARACTER*1        SIDE, SIDES, UPLO, UPLOS
00736       CHARACTER*2        ICHS, ICHU
00737 *     .. Local Arrays ..
00738       LOGICAL            ISAME( 13 )
00739 *     .. External Functions ..
00740       LOGICAL            LCE, LCERES
00741       EXTERNAL           LCE, LCERES
00742 *     .. External Subroutines ..
00743       EXTERNAL           CHEMM, CMAKE, CMMCH, CSYMM
00744 *     .. Intrinsic Functions ..
00745       INTRINSIC          MAX
00746 *     .. Scalars in Common ..
00747       INTEGER            INFOT, NOUTC
00748       LOGICAL            LERR, OK
00749 *     .. Common blocks ..
00750       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
00751 *     .. Data statements ..
00752       DATA               ICHS/'LR'/, ICHU/'UL'/
00753 *     .. Executable Statements ..
00754       CONJ = SNAME( 2: 3 ).EQ.'HE'
00755 *
00756       NARGS = 12
00757       NC = 0
00758       RESET = .TRUE.
00759       ERRMAX = RZERO
00760 *
00761       DO 100 IM = 1, NIDIM
00762          M = IDIM( IM )
00763 *
00764          DO 90 IN = 1, NIDIM
00765             N = IDIM( IN )
00766 *           Set LDC to 1 more than minimum value if room.
00767             LDC = M
00768             IF( LDC.LT.NMAX )
00769      $         LDC = LDC + 1
00770 *           Skip tests if not enough room.
00771             IF( LDC.GT.NMAX )
00772      $         GO TO 90
00773             LCC = LDC*N
00774             NULL = N.LE.0.OR.M.LE.0
00775 *           Set LDB to 1 more than minimum value if room.
00776             LDB = M
00777             IF( LDB.LT.NMAX )
00778      $         LDB = LDB + 1
00779 *           Skip tests if not enough room.
00780             IF( LDB.GT.NMAX )
00781      $         GO TO 90
00782             LBB = LDB*N
00783 *
00784 *           Generate the matrix B.
00785 *
00786             CALL CMAKE( 'GE', ' ', ' ', M, N, B, NMAX, BB, LDB, RESET,
00787      $                  ZERO )
00788 *
00789             DO 80 ICS = 1, 2
00790                SIDE = ICHS( ICS: ICS )
00791                LEFT = SIDE.EQ.'L'
00792 *
00793                IF( LEFT )THEN
00794                   NA = M
00795                ELSE
00796                   NA = N
00797                END IF
00798 *              Set LDA to 1 more than minimum value if room.
00799                LDA = NA
00800                IF( LDA.LT.NMAX )
00801      $            LDA = LDA + 1
00802 *              Skip tests if not enough room.
00803                IF( LDA.GT.NMAX )
00804      $            GO TO 80
00805                LAA = LDA*NA
00806 *
00807                DO 70 ICU = 1, 2
00808                   UPLO = ICHU( ICU: ICU )
00809 *
00810 *                 Generate the hermitian or symmetric matrix A.
00811 *
00812                   CALL CMAKE( SNAME( 2: 3 ), UPLO, ' ', NA, NA, A, NMAX,
00813      $                        AA, LDA, RESET, ZERO )
00814 *
00815                   DO 60 IA = 1, NALF
00816                      ALPHA = ALF( IA )
00817 *
00818                      DO 50 IB = 1, NBET
00819                         BETA = BET( IB )
00820 *
00821 *                       Generate the matrix C.
00822 *
00823                         CALL CMAKE( 'GE', ' ', ' ', M, N, C, NMAX, CC,
00824      $                              LDC, RESET, ZERO )
00825 *
00826                         NC = NC + 1
00827 *
00828 *                       Save every datum before calling the
00829 *                       subroutine.
00830 *
00831                         SIDES = SIDE
00832                         UPLOS = UPLO
00833                         MS = M
00834                         NS = N
00835                         ALS = ALPHA
00836                         DO 10 I = 1, LAA
00837                            AS( I ) = AA( I )
00838    10                   CONTINUE
00839                         LDAS = LDA
00840                         DO 20 I = 1, LBB
00841                            BS( I ) = BB( I )
00842    20                   CONTINUE
00843                         LDBS = LDB
00844                         BLS = BETA
00845                         DO 30 I = 1, LCC
00846                            CS( I ) = CC( I )
00847    30                   CONTINUE
00848                         LDCS = LDC
00849 *
00850 *                       Call the subroutine.
00851 *
00852                         IF( TRACE )
00853      $                     WRITE( NTRA, FMT = 9995 )NC, SNAME, SIDE,
00854      $                     UPLO, M, N, ALPHA, LDA, LDB, BETA, LDC
00855                         IF( REWI )
00856      $                     REWIND NTRA
00857                         IF( CONJ )THEN
00858                            CALL CHEMM( SIDE, UPLO, M, N, ALPHA, AA, LDA,
00859      $                                 BB, LDB, BETA, CC, LDC )
00860                         ELSE
00861                            CALL CSYMM( SIDE, UPLO, M, N, ALPHA, AA, LDA,
00862      $                                 BB, LDB, BETA, CC, LDC )
00863                         END IF
00864 *
00865 *                       Check if error-exit was taken incorrectly.
00866 *
00867                         IF( .NOT.OK )THEN
00868                            WRITE( NOUT, FMT = 9994 )
00869                            FATAL = .TRUE.
00870                            GO TO 110
00871                         END IF
00872 *
00873 *                       See what data changed inside subroutines.
00874 *
00875                         ISAME( 1 ) = SIDES.EQ.SIDE
00876                         ISAME( 2 ) = UPLOS.EQ.UPLO
00877                         ISAME( 3 ) = MS.EQ.M
00878                         ISAME( 4 ) = NS.EQ.N
00879                         ISAME( 5 ) = ALS.EQ.ALPHA
00880                         ISAME( 6 ) = LCE( AS, AA, LAA )
00881                         ISAME( 7 ) = LDAS.EQ.LDA
00882                         ISAME( 8 ) = LCE( BS, BB, LBB )
00883                         ISAME( 9 ) = LDBS.EQ.LDB
00884                         ISAME( 10 ) = BLS.EQ.BETA
00885                         IF( NULL )THEN
00886                            ISAME( 11 ) = LCE( CS, CC, LCC )
00887                         ELSE
00888                            ISAME( 11 ) = LCERES( 'GE', ' ', M, N, CS,
00889      $                                   CC, LDC )
00890                         END IF
00891                         ISAME( 12 ) = LDCS.EQ.LDC
00892 *
00893 *                       If data was incorrectly changed, report and
00894 *                       return.
00895 *
00896                         SAME = .TRUE.
00897                         DO 40 I = 1, NARGS
00898                            SAME = SAME.AND.ISAME( I )
00899                            IF( .NOT.ISAME( I ) )
00900      $                        WRITE( NOUT, FMT = 9998 )I
00901    40                   CONTINUE
00902                         IF( .NOT.SAME )THEN
00903                            FATAL = .TRUE.
00904                            GO TO 110
00905                         END IF
00906 *
00907                         IF( .NOT.NULL )THEN
00908 *
00909 *                          Check the result.
00910 *
00911                            IF( LEFT )THEN
00912                               CALL CMMCH( 'N', 'N', M, N, M, ALPHA, A,
00913      $                                    NMAX, B, NMAX, BETA, C, NMAX,
00914      $                                    CT, G, CC, LDC, EPS, ERR,
00915      $                                    FATAL, NOUT, .TRUE. )
00916                            ELSE
00917                               CALL CMMCH( 'N', 'N', M, N, N, ALPHA, B,
00918      $                                    NMAX, A, NMAX, BETA, C, NMAX,
00919      $                                    CT, G, CC, LDC, EPS, ERR,
00920      $                                    FATAL, NOUT, .TRUE. )
00921                            END IF
00922                            ERRMAX = MAX( ERRMAX, ERR )
00923 *                          If got really bad answer, report and
00924 *                          return.
00925                            IF( FATAL )
00926      $                        GO TO 110
00927                         END IF
00928 *
00929    50                CONTINUE
00930 *
00931    60             CONTINUE
00932 *
00933    70          CONTINUE
00934 *
00935    80       CONTINUE
00936 *
00937    90    CONTINUE
00938 *
00939   100 CONTINUE
00940 *
00941 *     Report result.
00942 *
00943       IF( ERRMAX.LT.THRESH )THEN
00944          WRITE( NOUT, FMT = 9999 )SNAME, NC
00945       ELSE
00946          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
00947       END IF
00948       GO TO 120
00949 *
00950   110 CONTINUE
00951       WRITE( NOUT, FMT = 9996 )SNAME
00952       WRITE( NOUT, FMT = 9995 )NC, SNAME, SIDE, UPLO, M, N, ALPHA, LDA,
00953      $   LDB, BETA, LDC
00954 *
00955   120 CONTINUE
00956       RETURN
00957 *
00958  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
00959      $      'S)' )
00960  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
00961      $      'ANGED INCORRECTLY *******' )
00962  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
00963      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
00964      $      ' - SUSPECT *******' )
00965  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
00966  9995 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),
00967      $      '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1,
00968      $      ',', F4.1, '), C,', I3, ')    .' )
00969  9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
00970      $      '******' )
00971 *
00972 *     End of CCHK2.
00973 *
00974       END
00975       SUBROUTINE CCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
00976      $                  FATAL, NIDIM, IDIM, NALF, ALF, NMAX, A, AA, AS,
00977      $                  B, BB, BS, CT, G, C )
00978 *
00979 *  Tests CTRMM and CTRSM.
00980 *
00981 *  Auxiliary routine for test program for Level 3 Blas.
00982 *
00983 *  -- Written on 8-February-1989.
00984 *     Jack Dongarra, Argonne National Laboratory.
00985 *     Iain Duff, AERE Harwell.
00986 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
00987 *     Sven Hammarling, Numerical Algorithms Group Ltd.
00988 *
00989 *     .. Parameters ..
00990       COMPLEX            ZERO, ONE
00991       PARAMETER          ( ZERO = ( 0.0, 0.0 ), ONE = ( 1.0, 0.0 ) )
00992       REAL               RZERO
00993       PARAMETER          ( RZERO = 0.0 )
00994 *     .. Scalar Arguments ..
00995       REAL               EPS, THRESH
00996       INTEGER            NALF, NIDIM, NMAX, NOUT, NTRA
00997       LOGICAL            FATAL, REWI, TRACE
00998       CHARACTER*6        SNAME
00999 *     .. Array Arguments ..
01000       COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
01001      $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),
01002      $                   BB( NMAX*NMAX ), BS( NMAX*NMAX ),
01003      $                   C( NMAX, NMAX ), CT( NMAX )
01004       REAL               G( NMAX )
01005       INTEGER            IDIM( NIDIM )
01006 *     .. Local Scalars ..
01007       COMPLEX            ALPHA, ALS
01008       REAL               ERR, ERRMAX
01009       INTEGER            I, IA, ICD, ICS, ICT, ICU, IM, IN, J, LAA, LBB,
01010      $                   LDA, LDAS, LDB, LDBS, M, MS, N, NA, NARGS, NC,
01011      $                   NS
01012       LOGICAL            LEFT, NULL, RESET, SAME
01013       CHARACTER*1        DIAG, DIAGS, SIDE, SIDES, TRANAS, TRANSA, UPLO,
01014      $                   UPLOS
01015       CHARACTER*2        ICHD, ICHS, ICHU
01016       CHARACTER*3        ICHT
01017 *     .. Local Arrays ..
01018       LOGICAL            ISAME( 13 )
01019 *     .. External Functions ..
01020       LOGICAL            LCE, LCERES
01021       EXTERNAL           LCE, LCERES
01022 *     .. External Subroutines ..
01023       EXTERNAL           CMAKE, CMMCH, CTRMM, CTRSM
01024 *     .. Intrinsic Functions ..
01025       INTRINSIC          MAX
01026 *     .. Scalars in Common ..
01027       INTEGER            INFOT, NOUTC
01028       LOGICAL            LERR, OK
01029 *     .. Common blocks ..
01030       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
01031 *     .. Data statements ..
01032       DATA               ICHU/'UL'/, ICHT/'NTC'/, ICHD/'UN'/, ICHS/'LR'/
01033 *     .. Executable Statements ..
01034 *
01035       NARGS = 11
01036       NC = 0
01037       RESET = .TRUE.
01038       ERRMAX = RZERO
01039 *     Set up zero matrix for CMMCH.
01040       DO 20 J = 1, NMAX
01041          DO 10 I = 1, NMAX
01042             C( I, J ) = ZERO
01043    10    CONTINUE
01044    20 CONTINUE
01045 *
01046       DO 140 IM = 1, NIDIM
01047          M = IDIM( IM )
01048 *
01049          DO 130 IN = 1, NIDIM
01050             N = IDIM( IN )
01051 *           Set LDB to 1 more than minimum value if room.
01052             LDB = M
01053             IF( LDB.LT.NMAX )
01054      $         LDB = LDB + 1
01055 *           Skip tests if not enough room.
01056             IF( LDB.GT.NMAX )
01057      $         GO TO 130
01058             LBB = LDB*N
01059             NULL = M.LE.0.OR.N.LE.0
01060 *
01061             DO 120 ICS = 1, 2
01062                SIDE = ICHS( ICS: ICS )
01063                LEFT = SIDE.EQ.'L'
01064                IF( LEFT )THEN
01065                   NA = M
01066                ELSE
01067                   NA = N
01068                END IF
01069 *              Set LDA to 1 more than minimum value if room.
01070                LDA = NA
01071                IF( LDA.LT.NMAX )
01072      $            LDA = LDA + 1
01073 *              Skip tests if not enough room.
01074                IF( LDA.GT.NMAX )
01075      $            GO TO 130
01076                LAA = LDA*NA
01077 *
01078                DO 110 ICU = 1, 2
01079                   UPLO = ICHU( ICU: ICU )
01080 *
01081                   DO 100 ICT = 1, 3
01082                      TRANSA = ICHT( ICT: ICT )
01083 *
01084                      DO 90 ICD = 1, 2
01085                         DIAG = ICHD( ICD: ICD )
01086 *
01087                         DO 80 IA = 1, NALF
01088                            ALPHA = ALF( IA )
01089 *
01090 *                          Generate the matrix A.
01091 *
01092                            CALL CMAKE( 'TR', UPLO, DIAG, NA, NA, A,
01093      $                                 NMAX, AA, LDA, RESET, ZERO )
01094 *
01095 *                          Generate the matrix B.
01096 *
01097                            CALL CMAKE( 'GE', ' ', ' ', M, N, B, NMAX,
01098      $                                 BB, LDB, RESET, ZERO )
01099 *
01100                            NC = NC + 1
01101 *
01102 *                          Save every datum before calling the
01103 *                          subroutine.
01104 *
01105                            SIDES = SIDE
01106                            UPLOS = UPLO
01107                            TRANAS = TRANSA
01108                            DIAGS = DIAG
01109                            MS = M
01110                            NS = N
01111                            ALS = ALPHA
01112                            DO 30 I = 1, LAA
01113                               AS( I ) = AA( I )
01114    30                      CONTINUE
01115                            LDAS = LDA
01116                            DO 40 I = 1, LBB
01117                               BS( I ) = BB( I )
01118    40                      CONTINUE
01119                            LDBS = LDB
01120 *
01121 *                          Call the subroutine.
01122 *
01123                            IF( SNAME( 4: 5 ).EQ.'MM' )THEN
01124                               IF( TRACE )
01125      $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,
01126      $                           SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,
01127      $                           LDA, LDB
01128                               IF( REWI )
01129      $                           REWIND NTRA
01130                               CALL CTRMM( SIDE, UPLO, TRANSA, DIAG, M,
01131      $                                    N, ALPHA, AA, LDA, BB, LDB )
01132                            ELSE IF( SNAME( 4: 5 ).EQ.'SM' )THEN
01133                               IF( TRACE )
01134      $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,
01135      $                           SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,
01136      $                           LDA, LDB
01137                               IF( REWI )
01138      $                           REWIND NTRA
01139                               CALL CTRSM( SIDE, UPLO, TRANSA, DIAG, M,
01140      $                                    N, ALPHA, AA, LDA, BB, LDB )
01141                            END IF
01142 *
01143 *                          Check if error-exit was taken incorrectly.
01144 *
01145                            IF( .NOT.OK )THEN
01146                               WRITE( NOUT, FMT = 9994 )
01147                               FATAL = .TRUE.
01148                               GO TO 150
01149                            END IF
01150 *
01151 *                          See what data changed inside subroutines.
01152 *
01153                            ISAME( 1 ) = SIDES.EQ.SIDE
01154                            ISAME( 2 ) = UPLOS.EQ.UPLO
01155                            ISAME( 3 ) = TRANAS.EQ.TRANSA
01156                            ISAME( 4 ) = DIAGS.EQ.DIAG
01157                            ISAME( 5 ) = MS.EQ.M
01158                            ISAME( 6 ) = NS.EQ.N
01159                            ISAME( 7 ) = ALS.EQ.ALPHA
01160                            ISAME( 8 ) = LCE( AS, AA, LAA )
01161                            ISAME( 9 ) = LDAS.EQ.LDA
01162                            IF( NULL )THEN
01163                               ISAME( 10 ) = LCE( BS, BB, LBB )
01164                            ELSE
01165                               ISAME( 10 ) = LCERES( 'GE', ' ', M, N, BS,
01166      $                                      BB, LDB )
01167                            END IF
01168                            ISAME( 11 ) = LDBS.EQ.LDB
01169 *
01170 *                          If data was incorrectly changed, report and
01171 *                          return.
01172 *
01173                            SAME = .TRUE.
01174                            DO 50 I = 1, NARGS
01175                               SAME = SAME.AND.ISAME( I )
01176                               IF( .NOT.ISAME( I ) )
01177      $                           WRITE( NOUT, FMT = 9998 )I
01178    50                      CONTINUE
01179                            IF( .NOT.SAME )THEN
01180                               FATAL = .TRUE.
01181                               GO TO 150
01182                            END IF
01183 *
01184                            IF( .NOT.NULL )THEN
01185                               IF( SNAME( 4: 5 ).EQ.'MM' )THEN
01186 *
01187 *                                Check the result.
01188 *
01189                                  IF( LEFT )THEN
01190                                     CALL CMMCH( TRANSA, 'N', M, N, M,
01191      $                                          ALPHA, A, NMAX, B, NMAX,
01192      $                                          ZERO, C, NMAX, CT, G,
01193      $                                          BB, LDB, EPS, ERR,
01194      $                                          FATAL, NOUT, .TRUE. )
01195                                  ELSE
01196                                     CALL CMMCH( 'N', TRANSA, M, N, N,
01197      $                                          ALPHA, B, NMAX, A, NMAX,
01198      $                                          ZERO, C, NMAX, CT, G,
01199      $                                          BB, LDB, EPS, ERR,
01200      $                                          FATAL, NOUT, .TRUE. )
01201                                  END IF
01202                               ELSE IF( SNAME( 4: 5 ).EQ.'SM' )THEN
01203 *
01204 *                                Compute approximation to original
01205 *                                matrix.
01206 *
01207                                  DO 70 J = 1, N
01208                                     DO 60 I = 1, M
01209                                        C( I, J ) = BB( I + ( J - 1 )*
01210      $                                             LDB )
01211                                        BB( I + ( J - 1 )*LDB ) = ALPHA*
01212      $                                    B( I, J )
01213    60                               CONTINUE
01214    70                            CONTINUE
01215 *
01216                                  IF( LEFT )THEN
01217                                     CALL CMMCH( TRANSA, 'N', M, N, M,
01218      $                                          ONE, A, NMAX, C, NMAX,
01219      $                                          ZERO, B, NMAX, CT, G,
01220      $                                          BB, LDB, EPS, ERR,
01221      $                                          FATAL, NOUT, .FALSE. )
01222                                  ELSE
01223                                     CALL CMMCH( 'N', TRANSA, M, N, N,
01224      $                                          ONE, C, NMAX, A, NMAX,
01225      $                                          ZERO, B, NMAX, CT, G,
01226      $                                          BB, LDB, EPS, ERR,
01227      $                                          FATAL, NOUT, .FALSE. )
01228                                  END IF
01229                               END IF
01230                               ERRMAX = MAX( ERRMAX, ERR )
01231 *                             If got really bad answer, report and
01232 *                             return.
01233                               IF( FATAL )
01234      $                           GO TO 150
01235                            END IF
01236 *
01237    80                   CONTINUE
01238 *
01239    90                CONTINUE
01240 *
01241   100             CONTINUE
01242 *
01243   110          CONTINUE
01244 *
01245   120       CONTINUE
01246 *
01247   130    CONTINUE
01248 *
01249   140 CONTINUE
01250 *
01251 *     Report result.
01252 *
01253       IF( ERRMAX.LT.THRESH )THEN
01254          WRITE( NOUT, FMT = 9999 )SNAME, NC
01255       ELSE
01256          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
01257       END IF
01258       GO TO 160
01259 *
01260   150 CONTINUE
01261       WRITE( NOUT, FMT = 9996 )SNAME
01262       WRITE( NOUT, FMT = 9995 )NC, SNAME, SIDE, UPLO, TRANSA, DIAG, M,
01263      $   N, ALPHA, LDA, LDB
01264 *
01265   160 CONTINUE
01266       RETURN
01267 *
01268  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
01269      $      'S)' )
01270  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
01271      $      'ANGED INCORRECTLY *******' )
01272  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
01273      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
01274      $      ' - SUSPECT *******' )
01275  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
01276  9995 FORMAT( 1X, I6, ': ', A6, '(', 4( '''', A1, ''',' ), 2( I3, ',' ),
01277      $      '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ')         ',
01278      $      '      .' )
01279  9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
01280      $      '******' )
01281 *
01282 *     End of CCHK3.
01283 *
01284       END
01285       SUBROUTINE CCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
01286      $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,
01287      $                  A, AA, AS, B, BB, BS, C, CC, CS, CT, G )
01288 *
01289 *  Tests CHERK and CSYRK.
01290 *
01291 *  Auxiliary routine for test program for Level 3 Blas.
01292 *
01293 *  -- Written on 8-February-1989.
01294 *     Jack Dongarra, Argonne National Laboratory.
01295 *     Iain Duff, AERE Harwell.
01296 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
01297 *     Sven Hammarling, Numerical Algorithms Group Ltd.
01298 *
01299 *     .. Parameters ..
01300       COMPLEX            ZERO
01301       PARAMETER          ( ZERO = ( 0.0, 0.0 ) )
01302       REAL               RONE, RZERO
01303       PARAMETER          ( RONE = 1.0, RZERO = 0.0 )
01304 *     .. Scalar Arguments ..
01305       REAL               EPS, THRESH
01306       INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA
01307       LOGICAL            FATAL, REWI, TRACE
01308       CHARACTER*6        SNAME
01309 *     .. Array Arguments ..
01310       COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
01311      $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),
01312      $                   BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),
01313      $                   C( NMAX, NMAX ), CC( NMAX*NMAX ),
01314      $                   CS( NMAX*NMAX ), CT( NMAX )
01315       REAL               G( NMAX )
01316       INTEGER            IDIM( NIDIM )
01317 *     .. Local Scalars ..
01318       COMPLEX            ALPHA, ALS, BETA, BETS
01319       REAL               ERR, ERRMAX, RALPHA, RALS, RBETA, RBETS
01320       INTEGER            I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, K, KS,
01321      $                   LAA, LCC, LDA, LDAS, LDC, LDCS, LJ, MA, N, NA,
01322      $                   NARGS, NC, NS
01323       LOGICAL            CONJ, NULL, RESET, SAME, TRAN, UPPER
01324       CHARACTER*1        TRANS, TRANSS, TRANST, UPLO, UPLOS
01325       CHARACTER*2        ICHT, ICHU
01326 *     .. Local Arrays ..
01327       LOGICAL            ISAME( 13 )
01328 *     .. External Functions ..
01329       LOGICAL            LCE, LCERES
01330       EXTERNAL           LCE, LCERES
01331 *     .. External Subroutines ..
01332       EXTERNAL           CHERK, CMAKE, CMMCH, CSYRK
01333 *     .. Intrinsic Functions ..
01334       INTRINSIC          CMPLX, MAX, REAL
01335 *     .. Scalars in Common ..
01336       INTEGER            INFOT, NOUTC
01337       LOGICAL            LERR, OK
01338 *     .. Common blocks ..
01339       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
01340 *     .. Data statements ..
01341       DATA               ICHT/'NC'/, ICHU/'UL'/
01342 *     .. Executable Statements ..
01343       CONJ = SNAME( 2: 3 ).EQ.'HE'
01344 *
01345       NARGS = 10
01346       NC = 0
01347       RESET = .TRUE.
01348       ERRMAX = RZERO
01349 *
01350       DO 100 IN = 1, NIDIM
01351          N = IDIM( IN )
01352 *        Set LDC to 1 more than minimum value if room.
01353          LDC = N
01354          IF( LDC.LT.NMAX )
01355      $      LDC = LDC + 1
01356 *        Skip tests if not enough room.
01357          IF( LDC.GT.NMAX )
01358      $      GO TO 100
01359          LCC = LDC*N
01360 *
01361          DO 90 IK = 1, NIDIM
01362             K = IDIM( IK )
01363 *
01364             DO 80 ICT = 1, 2
01365                TRANS = ICHT( ICT: ICT )
01366                TRAN = TRANS.EQ.'C'
01367                IF( TRAN.AND..NOT.CONJ )
01368      $            TRANS = 'T'
01369                IF( TRAN )THEN
01370                   MA = K
01371                   NA = N
01372                ELSE
01373                   MA = N
01374                   NA = K
01375                END IF
01376 *              Set LDA to 1 more than minimum value if room.
01377                LDA = MA
01378                IF( LDA.LT.NMAX )
01379      $            LDA = LDA + 1
01380 *              Skip tests if not enough room.
01381                IF( LDA.GT.NMAX )
01382      $            GO TO 80
01383                LAA = LDA*NA
01384 *
01385 *              Generate the matrix A.
01386 *
01387                CALL CMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA,
01388      $                     RESET, ZERO )
01389 *
01390                DO 70 ICU = 1, 2
01391                   UPLO = ICHU( ICU: ICU )
01392                   UPPER = UPLO.EQ.'U'
01393 *
01394                   DO 60 IA = 1, NALF
01395                      ALPHA = ALF( IA )
01396                      IF( CONJ )THEN
01397                         RALPHA = REAL( ALPHA )
01398                         ALPHA = CMPLX( RALPHA, RZERO )
01399                      END IF
01400 *
01401                      DO 50 IB = 1, NBET
01402                         BETA = BET( IB )
01403                         IF( CONJ )THEN
01404                            RBETA = REAL( BETA )
01405                            BETA = CMPLX( RBETA, RZERO )
01406                         END IF
01407                         NULL = N.LE.0
01408                         IF( CONJ )
01409      $                     NULL = NULL.OR.( ( K.LE.0.OR.RALPHA.EQ.
01410      $                            RZERO ).AND.RBETA.EQ.RONE )
01411 *
01412 *                       Generate the matrix C.
01413 *
01414                         CALL CMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, C,
01415      $                              NMAX, CC, LDC, RESET, ZERO )
01416 *
01417                         NC = NC + 1
01418 *
01419 *                       Save every datum before calling the subroutine.
01420 *
01421                         UPLOS = UPLO
01422                         TRANSS = TRANS
01423                         NS = N
01424                         KS = K
01425                         IF( CONJ )THEN
01426                            RALS = RALPHA
01427                         ELSE
01428                            ALS = ALPHA
01429                         END IF
01430                         DO 10 I = 1, LAA
01431                            AS( I ) = AA( I )
01432    10                   CONTINUE
01433                         LDAS = LDA
01434                         IF( CONJ )THEN
01435                            RBETS = RBETA
01436                         ELSE
01437                            BETS = BETA
01438                         END IF
01439                         DO 20 I = 1, LCC
01440                            CS( I ) = CC( I )
01441    20                   CONTINUE
01442                         LDCS = LDC
01443 *
01444 *                       Call the subroutine.
01445 *
01446                         IF( CONJ )THEN
01447                            IF( TRACE )
01448      $                        WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO,
01449      $                        TRANS, N, K, RALPHA, LDA, RBETA, LDC
01450                            IF( REWI )
01451      $                        REWIND NTRA
01452                            CALL CHERK( UPLO, TRANS, N, K, RALPHA, AA,
01453      $                                 LDA, RBETA, CC, LDC )
01454                         ELSE
01455                            IF( TRACE )
01456      $                        WRITE( NTRA, FMT = 9993 )NC, SNAME, UPLO,
01457      $                        TRANS, N, K, ALPHA, LDA, BETA, LDC
01458                            IF( REWI )
01459      $                        REWIND NTRA
01460                            CALL CSYRK( UPLO, TRANS, N, K, ALPHA, AA,
01461      $                                 LDA, BETA, CC, LDC )
01462                         END IF
01463 *
01464 *                       Check if error-exit was taken incorrectly.
01465 *
01466                         IF( .NOT.OK )THEN
01467                            WRITE( NOUT, FMT = 9992 )
01468                            FATAL = .TRUE.
01469                            GO TO 120
01470                         END IF
01471 *
01472 *                       See what data changed inside subroutines.
01473 *
01474                         ISAME( 1 ) = UPLOS.EQ.UPLO
01475                         ISAME( 2 ) = TRANSS.EQ.TRANS
01476                         ISAME( 3 ) = NS.EQ.N
01477                         ISAME( 4 ) = KS.EQ.K
01478                         IF( CONJ )THEN
01479                            ISAME( 5 ) = RALS.EQ.RALPHA
01480                         ELSE
01481                            ISAME( 5 ) = ALS.EQ.ALPHA
01482                         END IF
01483                         ISAME( 6 ) = LCE( AS, AA, LAA )
01484                         ISAME( 7 ) = LDAS.EQ.LDA
01485                         IF( CONJ )THEN
01486                            ISAME( 8 ) = RBETS.EQ.RBETA
01487                         ELSE
01488                            ISAME( 8 ) = BETS.EQ.BETA
01489                         END IF
01490                         IF( NULL )THEN
01491                            ISAME( 9 ) = LCE( CS, CC, LCC )
01492                         ELSE
01493                            ISAME( 9 ) = LCERES( SNAME( 2: 3 ), UPLO, N,
01494      $                                  N, CS, CC, LDC )
01495                         END IF
01496                         ISAME( 10 ) = LDCS.EQ.LDC
01497 *
01498 *                       If data was incorrectly changed, report and
01499 *                       return.
01500 *
01501                         SAME = .TRUE.
01502                         DO 30 I = 1, NARGS
01503                            SAME = SAME.AND.ISAME( I )
01504                            IF( .NOT.ISAME( I ) )
01505      $                        WRITE( NOUT, FMT = 9998 )I
01506    30                   CONTINUE
01507                         IF( .NOT.SAME )THEN
01508                            FATAL = .TRUE.
01509                            GO TO 120
01510                         END IF
01511 *
01512                         IF( .NOT.NULL )THEN
01513 *
01514 *                          Check the result column by column.
01515 *
01516                            IF( CONJ )THEN
01517                               TRANST = 'C'
01518                            ELSE
01519                               TRANST = 'T'
01520                            END IF
01521                            JC = 1
01522                            DO 40 J = 1, N
01523                               IF( UPPER )THEN
01524                                  JJ = 1
01525                                  LJ = J
01526                               ELSE
01527                                  JJ = J
01528                                  LJ = N - J + 1
01529                               END IF
01530                               IF( TRAN )THEN
01531                                  CALL CMMCH( TRANST, 'N', LJ, 1, K,
01532      $                                       ALPHA, A( 1, JJ ), NMAX,
01533      $                                       A( 1, J ), NMAX, BETA,
01534      $                                       C( JJ, J ), NMAX, CT, G,
01535      $                                       CC( JC ), LDC, EPS, ERR,
01536      $                                       FATAL, NOUT, .TRUE. )
01537                               ELSE
01538                                  CALL CMMCH( 'N', TRANST, LJ, 1, K,
01539      $                                       ALPHA, A( JJ, 1 ), NMAX,
01540      $                                       A( J, 1 ), NMAX, BETA,
01541      $                                       C( JJ, J ), NMAX, CT, G,
01542      $                                       CC( JC ), LDC, EPS, ERR,
01543      $                                       FATAL, NOUT, .TRUE. )
01544                               END IF
01545                               IF( UPPER )THEN
01546                                  JC = JC + LDC
01547                               ELSE
01548                                  JC = JC + LDC + 1
01549                               END IF
01550                               ERRMAX = MAX( ERRMAX, ERR )
01551 *                             If got really bad answer, report and
01552 *                             return.
01553                               IF( FATAL )
01554      $                           GO TO 110
01555    40                      CONTINUE
01556                         END IF
01557 *
01558    50                CONTINUE
01559 *
01560    60             CONTINUE
01561 *
01562    70          CONTINUE
01563 *
01564    80       CONTINUE
01565 *
01566    90    CONTINUE
01567 *
01568   100 CONTINUE
01569 *
01570 *     Report result.
01571 *
01572       IF( ERRMAX.LT.THRESH )THEN
01573          WRITE( NOUT, FMT = 9999 )SNAME, NC
01574       ELSE
01575          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
01576       END IF
01577       GO TO 130
01578 *
01579   110 CONTINUE
01580       IF( N.GT.1 )
01581      $   WRITE( NOUT, FMT = 9995 )J
01582 *
01583   120 CONTINUE
01584       WRITE( NOUT, FMT = 9996 )SNAME
01585       IF( CONJ )THEN
01586          WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, TRANS, N, K, RALPHA,
01587      $      LDA, RBETA, LDC
01588       ELSE
01589          WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, TRANS, N, K, ALPHA,
01590      $      LDA, BETA, LDC
01591       END IF
01592 *
01593   130 CONTINUE
01594       RETURN
01595 *
01596  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
01597      $      'S)' )
01598  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
01599      $      'ANGED INCORRECTLY *******' )
01600  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
01601      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
01602      $      ' - SUSPECT *******' )
01603  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
01604  9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )
01605  9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),
01606      $      F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ')               ',
01607      $      '          .' )
01608  9993 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),
01609      $      '(', F4.1, ',', F4.1, ') , A,', I3, ',(', F4.1, ',', F4.1,
01610      $      '), C,', I3, ')          .' )
01611  9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
01612      $      '******' )
01613 *
01614 *     End of CCHK4.
01615 *
01616       END
01617       SUBROUTINE CCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
01618      $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,
01619      $                  AB, AA, AS, BB, BS, C, CC, CS, CT, G, W )
01620 *
01621 *  Tests CHER2K and CSYR2K.
01622 *
01623 *  Auxiliary routine for test program for Level 3 Blas.
01624 *
01625 *  -- Written on 8-February-1989.
01626 *     Jack Dongarra, Argonne National Laboratory.
01627 *     Iain Duff, AERE Harwell.
01628 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
01629 *     Sven Hammarling, Numerical Algorithms Group Ltd.
01630 *
01631 *     .. Parameters ..
01632       COMPLEX            ZERO, ONE
01633       PARAMETER          ( ZERO = ( 0.0, 0.0 ), ONE = ( 1.0, 0.0 ) )
01634       REAL               RONE, RZERO
01635       PARAMETER          ( RONE = 1.0, RZERO = 0.0 )
01636 *     .. Scalar Arguments ..
01637       REAL               EPS, THRESH
01638       INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA
01639       LOGICAL            FATAL, REWI, TRACE
01640       CHARACTER*6        SNAME
01641 *     .. Array Arguments ..
01642       COMPLEX            AA( NMAX*NMAX ), AB( 2*NMAX*NMAX ),
01643      $                   ALF( NALF ), AS( NMAX*NMAX ), BB( NMAX*NMAX ),
01644      $                   BET( NBET ), BS( NMAX*NMAX ), C( NMAX, NMAX ),
01645      $                   CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ),
01646      $                   W( 2*NMAX )
01647       REAL               G( NMAX )
01648       INTEGER            IDIM( NIDIM )
01649 *     .. Local Scalars ..
01650       COMPLEX            ALPHA, ALS, BETA, BETS
01651       REAL               ERR, ERRMAX, RBETA, RBETS
01652       INTEGER            I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, JJAB,
01653      $                   K, KS, LAA, LBB, LCC, LDA, LDAS, LDB, LDBS,
01654      $                   LDC, LDCS, LJ, MA, N, NA, NARGS, NC, NS
01655       LOGICAL            CONJ, NULL, RESET, SAME, TRAN, UPPER
01656       CHARACTER*1        TRANS, TRANSS, TRANST, UPLO, UPLOS
01657       CHARACTER*2        ICHT, ICHU
01658 *     .. Local Arrays ..
01659       LOGICAL            ISAME( 13 )
01660 *     .. External Functions ..
01661       LOGICAL            LCE, LCERES
01662       EXTERNAL           LCE, LCERES
01663 *     .. External Subroutines ..
01664       EXTERNAL           CHER2K, CMAKE, CMMCH, CSYR2K
01665 *     .. Intrinsic Functions ..
01666       INTRINSIC          CMPLX, CONJG, MAX, REAL
01667 *     .. Scalars in Common ..
01668       INTEGER            INFOT, NOUTC
01669       LOGICAL            LERR, OK
01670 *     .. Common blocks ..
01671       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
01672 *     .. Data statements ..
01673       DATA               ICHT/'NC'/, ICHU/'UL'/
01674 *     .. Executable Statements ..
01675       CONJ = SNAME( 2: 3 ).EQ.'HE'
01676 *
01677       NARGS = 12
01678       NC = 0
01679       RESET = .TRUE.
01680       ERRMAX = RZERO
01681 *
01682       DO 130 IN = 1, NIDIM
01683          N = IDIM( IN )
01684 *        Set LDC to 1 more than minimum value if room.
01685          LDC = N
01686          IF( LDC.LT.NMAX )
01687      $      LDC = LDC + 1
01688 *        Skip tests if not enough room.
01689          IF( LDC.GT.NMAX )
01690      $      GO TO 130
01691          LCC = LDC*N
01692 *
01693          DO 120 IK = 1, NIDIM
01694             K = IDIM( IK )
01695 *
01696             DO 110 ICT = 1, 2
01697                TRANS = ICHT( ICT: ICT )
01698                TRAN = TRANS.EQ.'C'
01699                IF( TRAN.AND..NOT.CONJ )
01700      $            TRANS = 'T'
01701                IF( TRAN )THEN
01702                   MA = K
01703                   NA = N
01704                ELSE
01705                   MA = N
01706                   NA = K
01707                END IF
01708 *              Set LDA to 1 more than minimum value if room.
01709                LDA = MA
01710                IF( LDA.LT.NMAX )
01711      $            LDA = LDA + 1
01712 *              Skip tests if not enough room.
01713                IF( LDA.GT.NMAX )
01714      $            GO TO 110
01715                LAA = LDA*NA
01716 *
01717 *              Generate the matrix A.
01718 *
01719                IF( TRAN )THEN
01720                   CALL CMAKE( 'GE', ' ', ' ', MA, NA, AB, 2*NMAX, AA,
01721      $                        LDA, RESET, ZERO )
01722                ELSE
01723                   CALL CMAKE( 'GE', ' ', ' ', MA, NA, AB, NMAX, AA, LDA,
01724      $                        RESET, ZERO )
01725                END IF
01726 *
01727 *              Generate the matrix B.
01728 *
01729                LDB = LDA
01730                LBB = LAA
01731                IF( TRAN )THEN
01732                   CALL CMAKE( 'GE', ' ', ' ', MA, NA, AB( K + 1 ),
01733      $                        2*NMAX, BB, LDB, RESET, ZERO )
01734                ELSE
01735                   CALL CMAKE( 'GE', ' ', ' ', MA, NA, AB( K*NMAX + 1 ),
01736      $                        NMAX, BB, LDB, RESET, ZERO )
01737                END IF
01738 *
01739                DO 100 ICU = 1, 2
01740                   UPLO = ICHU( ICU: ICU )
01741                   UPPER = UPLO.EQ.'U'
01742 *
01743                   DO 90 IA = 1, NALF
01744                      ALPHA = ALF( IA )
01745 *
01746                      DO 80 IB = 1, NBET
01747                         BETA = BET( IB )
01748                         IF( CONJ )THEN
01749                            RBETA = REAL( BETA )
01750                            BETA = CMPLX( RBETA, RZERO )
01751                         END IF
01752                         NULL = N.LE.0
01753                         IF( CONJ )
01754      $                     NULL = NULL.OR.( ( K.LE.0.OR.ALPHA.EQ.
01755      $                            ZERO ).AND.RBETA.EQ.RONE )
01756 *
01757 *                       Generate the matrix C.
01758 *
01759                         CALL CMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, C,
01760      $                              NMAX, CC, LDC, RESET, ZERO )
01761 *
01762                         NC = NC + 1
01763 *
01764 *                       Save every datum before calling the subroutine.
01765 *
01766                         UPLOS = UPLO
01767                         TRANSS = TRANS
01768                         NS = N
01769                         KS = K
01770                         ALS = ALPHA
01771                         DO 10 I = 1, LAA
01772                            AS( I ) = AA( I )
01773    10                   CONTINUE
01774                         LDAS = LDA
01775                         DO 20 I = 1, LBB
01776                            BS( I ) = BB( I )
01777    20                   CONTINUE
01778                         LDBS = LDB
01779                         IF( CONJ )THEN
01780                            RBETS = RBETA
01781                         ELSE
01782                            BETS = BETA
01783                         END IF
01784                         DO 30 I = 1, LCC
01785                            CS( I ) = CC( I )
01786    30                   CONTINUE
01787                         LDCS = LDC
01788 *
01789 *                       Call the subroutine.
01790 *
01791                         IF( CONJ )THEN
01792                            IF( TRACE )
01793      $                        WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO,
01794      $                        TRANS, N, K, ALPHA, LDA, LDB, RBETA, LDC
01795                            IF( REWI )
01796      $                        REWIND NTRA
01797                            CALL CHER2K( UPLO, TRANS, N, K, ALPHA, AA,
01798      $                                  LDA, BB, LDB, RBETA, CC, LDC )
01799                         ELSE
01800                            IF( TRACE )
01801      $                        WRITE( NTRA, FMT = 9993 )NC, SNAME, UPLO,
01802      $                        TRANS, N, K, ALPHA, LDA, LDB, BETA, LDC
01803                            IF( REWI )
01804      $                        REWIND NTRA
01805                            CALL CSYR2K( UPLO, TRANS, N, K, ALPHA, AA,
01806      $                                  LDA, BB, LDB, BETA, CC, LDC )
01807                         END IF
01808 *
01809 *                       Check if error-exit was taken incorrectly.
01810 *
01811                         IF( .NOT.OK )THEN
01812                            WRITE( NOUT, FMT = 9992 )
01813                            FATAL = .TRUE.
01814                            GO TO 150
01815                         END IF
01816 *
01817 *                       See what data changed inside subroutines.
01818 *
01819                         ISAME( 1 ) = UPLOS.EQ.UPLO
01820                         ISAME( 2 ) = TRANSS.EQ.TRANS
01821                         ISAME( 3 ) = NS.EQ.N
01822                         ISAME( 4 ) = KS.EQ.K
01823                         ISAME( 5 ) = ALS.EQ.ALPHA
01824                         ISAME( 6 ) = LCE( AS, AA, LAA )
01825                         ISAME( 7 ) = LDAS.EQ.LDA
01826                         ISAME( 8 ) = LCE( BS, BB, LBB )
01827                         ISAME( 9 ) = LDBS.EQ.LDB
01828                         IF( CONJ )THEN
01829                            ISAME( 10 ) = RBETS.EQ.RBETA
01830                         ELSE
01831                            ISAME( 10 ) = BETS.EQ.BETA
01832                         END IF
01833                         IF( NULL )THEN
01834                            ISAME( 11 ) = LCE( CS, CC, LCC )
01835                         ELSE
01836                            ISAME( 11 ) = LCERES( 'HE', UPLO, N, N, CS,
01837      $                                   CC, LDC )
01838                         END IF
01839                         ISAME( 12 ) = LDCS.EQ.LDC
01840 *
01841 *                       If data was incorrectly changed, report and
01842 *                       return.
01843 *
01844                         SAME = .TRUE.
01845                         DO 40 I = 1, NARGS
01846                            SAME = SAME.AND.ISAME( I )
01847                            IF( .NOT.ISAME( I ) )
01848      $                        WRITE( NOUT, FMT = 9998 )I
01849    40                   CONTINUE
01850                         IF( .NOT.SAME )THEN
01851                            FATAL = .TRUE.
01852                            GO TO 150
01853                         END IF
01854 *
01855                         IF( .NOT.NULL )THEN
01856 *
01857 *                          Check the result column by column.
01858 *
01859                            IF( CONJ )THEN
01860                               TRANST = 'C'
01861                            ELSE
01862                               TRANST = 'T'
01863                            END IF
01864                            JJAB = 1
01865                            JC = 1
01866                            DO 70 J = 1, N
01867                               IF( UPPER )THEN
01868                                  JJ = 1
01869                                  LJ = J
01870                               ELSE
01871                                  JJ = J
01872                                  LJ = N - J + 1
01873                               END IF
01874                               IF( TRAN )THEN
01875                                  DO 50 I = 1, K
01876                                     W( I ) = ALPHA*AB( ( J - 1 )*2*
01877      $                                       NMAX + K + I )
01878                                     IF( CONJ )THEN
01879                                        W( K + I ) = CONJG( ALPHA )*
01880      $                                              AB( ( J - 1 )*2*
01881      $                                              NMAX + I )
01882                                     ELSE
01883                                        W( K + I ) = ALPHA*
01884      $                                              AB( ( J - 1 )*2*
01885      $                                              NMAX + I )
01886                                     END IF
01887    50                            CONTINUE
01888                                  CALL CMMCH( TRANST, 'N', LJ, 1, 2*K,
01889      $                                       ONE, AB( JJAB ), 2*NMAX, W,
01890      $                                       2*NMAX, BETA, C( JJ, J ),
01891      $                                       NMAX, CT, G, CC( JC ), LDC,
01892      $                                       EPS, ERR, FATAL, NOUT,
01893      $                                       .TRUE. )
01894                               ELSE
01895                                  DO 60 I = 1, K
01896                                     IF( CONJ )THEN
01897                                        W( I ) = ALPHA*CONJG( AB( ( K +
01898      $                                          I - 1 )*NMAX + J ) )
01899                                        W( K + I ) = CONJG( ALPHA*
01900      $                                              AB( ( I - 1 )*NMAX +
01901      $                                              J ) )
01902                                     ELSE
01903                                        W( I ) = ALPHA*AB( ( K + I - 1 )*
01904      $                                          NMAX + J )
01905                                        W( K + I ) = ALPHA*
01906      $                                              AB( ( I - 1 )*NMAX +
01907      $                                              J )
01908                                     END IF
01909    60                            CONTINUE
01910                                  CALL CMMCH( 'N', 'N', LJ, 1, 2*K, ONE,
01911      $                                       AB( JJ ), NMAX, W, 2*NMAX,
01912      $                                       BETA, C( JJ, J ), NMAX, CT,
01913      $                                       G, CC( JC ), LDC, EPS, ERR,
01914      $                                       FATAL, NOUT, .TRUE. )
01915                               END IF
01916                               IF( UPPER )THEN
01917                                  JC = JC + LDC
01918                               ELSE
01919                                  JC = JC + LDC + 1
01920                                  IF( TRAN )
01921      $                              JJAB = JJAB + 2*NMAX
01922                               END IF
01923                               ERRMAX = MAX( ERRMAX, ERR )
01924 *                             If got really bad answer, report and
01925 *                             return.
01926                               IF( FATAL )
01927      $                           GO TO 140
01928    70                      CONTINUE
01929                         END IF
01930 *
01931    80                CONTINUE
01932 *
01933    90             CONTINUE
01934 *
01935   100          CONTINUE
01936 *
01937   110       CONTINUE
01938 *
01939   120    CONTINUE
01940 *
01941   130 CONTINUE
01942 *
01943 *     Report result.
01944 *
01945       IF( ERRMAX.LT.THRESH )THEN
01946          WRITE( NOUT, FMT = 9999 )SNAME, NC
01947       ELSE
01948          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
01949       END IF
01950       GO TO 160
01951 *
01952   140 CONTINUE
01953       IF( N.GT.1 )
01954      $   WRITE( NOUT, FMT = 9995 )J
01955 *
01956   150 CONTINUE
01957       WRITE( NOUT, FMT = 9996 )SNAME
01958       IF( CONJ )THEN
01959          WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, TRANS, N, K, ALPHA,
01960      $      LDA, LDB, RBETA, LDC
01961       ELSE
01962          WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, TRANS, N, K, ALPHA,
01963      $      LDA, LDB, BETA, LDC
01964       END IF
01965 *
01966   160 CONTINUE
01967       RETURN
01968 *
01969  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
01970      $      'S)' )
01971  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
01972      $      'ANGED INCORRECTLY *******' )
01973  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
01974      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
01975      $      ' - SUSPECT *******' )
01976  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
01977  9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )
01978  9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),
01979      $      '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',', F4.1,
01980      $      ', C,', I3, ')           .' )
01981  9993 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),
01982      $      '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1,
01983      $      ',', F4.1, '), C,', I3, ')    .' )
01984  9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
01985      $      '******' )
01986 *
01987 *     End of CCHK5.
01988 *
01989       END
01990       SUBROUTINE CCHKE( ISNUM, SRNAMT, NOUT )
01991 *
01992 *  Tests the error exits from the Level 3 Blas.
01993 *  Requires a special version of the error-handling routine XERBLA.
01994 *  A, B and C should not need to be defined.
01995 *
01996 *  Auxiliary routine for test program for Level 3 Blas.
01997 *
01998 *  -- Written on 8-February-1989.
01999 *     Jack Dongarra, Argonne National Laboratory.
02000 *     Iain Duff, AERE Harwell.
02001 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
02002 *     Sven Hammarling, Numerical Algorithms Group Ltd.
02003 *
02004 *  3-19-92:  Initialize ALPHA, BETA, RALPHA, and RBETA  (eca)
02005 *  3-19-92:  Fix argument 12 in calls to CSYMM and CHEMM
02006 *            with INFOT = 9  (eca)
02007 *
02008 *     .. Scalar Arguments ..
02009       INTEGER            ISNUM, NOUT
02010       CHARACTER*6        SRNAMT
02011 *     .. Scalars in Common ..
02012       INTEGER            INFOT, NOUTC
02013       LOGICAL            LERR, OK
02014 *     .. Parameters ..
02015       REAL               ONE, TWO
02016       PARAMETER          ( ONE = 1.0E0, TWO = 2.0E0 )
02017 *     .. Local Scalars ..
02018       COMPLEX            ALPHA, BETA
02019       REAL               RALPHA, RBETA
02020 *     .. Local Arrays ..
02021       COMPLEX            A( 2, 1 ), B( 2, 1 ), C( 2, 1 )
02022 *     .. External Subroutines ..
02023       EXTERNAL           CGEMM, CHEMM, CHER2K, CHERK, CHKXER, CSYMM,
02024      $                   CSYR2K, CSYRK, CTRMM, CTRSM
02025 *     .. Common blocks ..
02026       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
02027 *     .. Executable Statements ..
02028 *     OK is set to .FALSE. by the special version of XERBLA or by CHKXER
02029 *     if anything is wrong.
02030       OK = .TRUE.
02031 *     LERR is set to .TRUE. by the special version of XERBLA each time
02032 *     it is called, and is then tested and re-set by CHKXER.
02033       LERR = .FALSE.
02034 *
02035 *     Initialize ALPHA, BETA, RALPHA, and RBETA.
02036 *
02037       ALPHA = CMPLX( ONE, -ONE )
02038       BETA = CMPLX( TWO, -TWO )
02039       RALPHA = ONE
02040       RBETA = TWO
02041 *
02042       GO TO ( 10, 20, 30, 40, 50, 60, 70, 80,
02043      $        90 )ISNUM
02044    10 INFOT = 1
02045       CALL CGEMM( '/', 'N', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02046       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02047       INFOT = 1
02048       CALL CGEMM( '/', 'C', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02049       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02050       INFOT = 1
02051       CALL CGEMM( '/', 'T', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02052       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02053       INFOT = 2
02054       CALL CGEMM( 'N', '/', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02055       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02056       INFOT = 2
02057       CALL CGEMM( 'C', '/', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02058       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02059       INFOT = 2
02060       CALL CGEMM( 'T', '/', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02061       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02062       INFOT = 3
02063       CALL CGEMM( 'N', 'N', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02064       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02065       INFOT = 3
02066       CALL CGEMM( 'N', 'C', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02067       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02068       INFOT = 3
02069       CALL CGEMM( 'N', 'T', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02070       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02071       INFOT = 3
02072       CALL CGEMM( 'C', 'N', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02073       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02074       INFOT = 3
02075       CALL CGEMM( 'C', 'C', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02076       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02077       INFOT = 3
02078       CALL CGEMM( 'C', 'T', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02079       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02080       INFOT = 3
02081       CALL CGEMM( 'T', 'N', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02082       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02083       INFOT = 3
02084       CALL CGEMM( 'T', 'C', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02085       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02086       INFOT = 3
02087       CALL CGEMM( 'T', 'T', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02088       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02089       INFOT = 4
02090       CALL CGEMM( 'N', 'N', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02091       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02092       INFOT = 4
02093       CALL CGEMM( 'N', 'C', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02094       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02095       INFOT = 4
02096       CALL CGEMM( 'N', 'T', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02097       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02098       INFOT = 4
02099       CALL CGEMM( 'C', 'N', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02100       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02101       INFOT = 4
02102       CALL CGEMM( 'C', 'C', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02103       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02104       INFOT = 4
02105       CALL CGEMM( 'C', 'T', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02106       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02107       INFOT = 4
02108       CALL CGEMM( 'T', 'N', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02109       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02110       INFOT = 4
02111       CALL CGEMM( 'T', 'C', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02112       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02113       INFOT = 4
02114       CALL CGEMM( 'T', 'T', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02115       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02116       INFOT = 5
02117       CALL CGEMM( 'N', 'N', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
02118       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02119       INFOT = 5
02120       CALL CGEMM( 'N', 'C', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
02121       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02122       INFOT = 5
02123       CALL CGEMM( 'N', 'T', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
02124       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02125       INFOT = 5
02126       CALL CGEMM( 'C', 'N', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
02127       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02128       INFOT = 5
02129       CALL CGEMM( 'C', 'C', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
02130       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02131       INFOT = 5
02132       CALL CGEMM( 'C', 'T', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
02133       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02134       INFOT = 5
02135       CALL CGEMM( 'T', 'N', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
02136       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02137       INFOT = 5
02138       CALL CGEMM( 'T', 'C', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
02139       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02140       INFOT = 5
02141       CALL CGEMM( 'T', 'T', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
02142       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02143       INFOT = 8
02144       CALL CGEMM( 'N', 'N', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )
02145       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02146       INFOT = 8
02147       CALL CGEMM( 'N', 'C', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )
02148       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02149       INFOT = 8
02150       CALL CGEMM( 'N', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )
02151       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02152       INFOT = 8
02153       CALL CGEMM( 'C', 'N', 0, 0, 2, ALPHA, A, 1, B, 2, BETA, C, 1 )
02154       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02155       INFOT = 8
02156       CALL CGEMM( 'C', 'C', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )
02157       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02158       INFOT = 8
02159       CALL CGEMM( 'C', 'T', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )
02160       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02161       INFOT = 8
02162       CALL CGEMM( 'T', 'N', 0, 0, 2, ALPHA, A, 1, B, 2, BETA, C, 1 )
02163       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02164       INFOT = 8
02165       CALL CGEMM( 'T', 'C', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )
02166       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02167       INFOT = 8
02168       CALL CGEMM( 'T', 'T', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )
02169       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02170       INFOT = 10
02171       CALL CGEMM( 'N', 'N', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )
02172       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02173       INFOT = 10
02174       CALL CGEMM( 'C', 'N', 0, 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 )
02175       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02176       INFOT = 10
02177       CALL CGEMM( 'T', 'N', 0, 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 )
02178       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02179       INFOT = 10
02180       CALL CGEMM( 'N', 'C', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02181       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02182       INFOT = 10
02183       CALL CGEMM( 'C', 'C', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02184       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02185       INFOT = 10
02186       CALL CGEMM( 'T', 'C', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02187       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02188       INFOT = 10
02189       CALL CGEMM( 'N', 'T', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02190       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02191       INFOT = 10
02192       CALL CGEMM( 'C', 'T', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02193       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02194       INFOT = 10
02195       CALL CGEMM( 'T', 'T', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02196       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02197       INFOT = 13
02198       CALL CGEMM( 'N', 'N', 2, 0, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )
02199       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02200       INFOT = 13
02201       CALL CGEMM( 'N', 'C', 2, 0, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )
02202       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02203       INFOT = 13
02204       CALL CGEMM( 'N', 'T', 2, 0, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )
02205       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02206       INFOT = 13
02207       CALL CGEMM( 'C', 'N', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02208       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02209       INFOT = 13
02210       CALL CGEMM( 'C', 'C', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02211       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02212       INFOT = 13
02213       CALL CGEMM( 'C', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02214       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02215       INFOT = 13
02216       CALL CGEMM( 'T', 'N', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02217       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02218       INFOT = 13
02219       CALL CGEMM( 'T', 'C', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02220       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02221       INFOT = 13
02222       CALL CGEMM( 'T', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02223       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02224       GO TO 100
02225    20 INFOT = 1
02226       CALL CHEMM( '/', 'U', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02227       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02228       INFOT = 2
02229       CALL CHEMM( 'L', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02230       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02231       INFOT = 3
02232       CALL CHEMM( 'L', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02233       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02234       INFOT = 3
02235       CALL CHEMM( 'R', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02236       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02237       INFOT = 3
02238       CALL CHEMM( 'L', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02239       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02240       INFOT = 3
02241       CALL CHEMM( 'R', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02242       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02243       INFOT = 4
02244       CALL CHEMM( 'L', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
02245       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02246       INFOT = 4
02247       CALL CHEMM( 'R', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
02248       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02249       INFOT = 4
02250       CALL CHEMM( 'L', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
02251       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02252       INFOT = 4
02253       CALL CHEMM( 'R', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
02254       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02255       INFOT = 7
02256       CALL CHEMM( 'L', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 )
02257       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02258       INFOT = 7
02259       CALL CHEMM( 'R', 'U', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )
02260       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02261       INFOT = 7
02262       CALL CHEMM( 'L', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 )
02263       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02264       INFOT = 7
02265       CALL CHEMM( 'R', 'L', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )
02266       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02267       INFOT = 9
02268       CALL CHEMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 )
02269       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02270       INFOT = 9
02271       CALL CHEMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )
02272       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02273       INFOT = 9
02274       CALL CHEMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 )
02275       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02276       INFOT = 9
02277       CALL CHEMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )
02278       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02279       INFOT = 12
02280       CALL CHEMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )
02281       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02282       INFOT = 12
02283       CALL CHEMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 )
02284       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02285       INFOT = 12
02286       CALL CHEMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )
02287       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02288       INFOT = 12
02289       CALL CHEMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 )
02290       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02291       GO TO 100
02292    30 INFOT = 1
02293       CALL CSYMM( '/', 'U', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02294       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02295       INFOT = 2
02296       CALL CSYMM( 'L', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02297       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02298       INFOT = 3
02299       CALL CSYMM( 'L', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02300       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02301       INFOT = 3
02302       CALL CSYMM( 'R', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02303       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02304       INFOT = 3
02305       CALL CSYMM( 'L', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02306       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02307       INFOT = 3
02308       CALL CSYMM( 'R', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02309       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02310       INFOT = 4
02311       CALL CSYMM( 'L', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
02312       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02313       INFOT = 4
02314       CALL CSYMM( 'R', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
02315       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02316       INFOT = 4
02317       CALL CSYMM( 'L', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
02318       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02319       INFOT = 4
02320       CALL CSYMM( 'R', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
02321       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02322       INFOT = 7
02323       CALL CSYMM( 'L', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 )
02324       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02325       INFOT = 7
02326       CALL CSYMM( 'R', 'U', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )
02327       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02328       INFOT = 7
02329       CALL CSYMM( 'L', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 )
02330       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02331       INFOT = 7
02332       CALL CSYMM( 'R', 'L', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )
02333       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02334       INFOT = 9
02335       CALL CSYMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 )
02336       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02337       INFOT = 9
02338       CALL CSYMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )
02339       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02340       INFOT = 9
02341       CALL CSYMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 )
02342       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02343       INFOT = 9
02344       CALL CSYMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )
02345       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02346       INFOT = 12
02347       CALL CSYMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )
02348       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02349       INFOT = 12
02350       CALL CSYMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 )
02351       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02352       INFOT = 12
02353       CALL CSYMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )
02354       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02355       INFOT = 12
02356       CALL CSYMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 )
02357       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02358       GO TO 100
02359    40 INFOT = 1
02360       CALL CTRMM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )
02361       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02362       INFOT = 2
02363       CALL CTRMM( 'L', '/', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )
02364       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02365       INFOT = 3
02366       CALL CTRMM( 'L', 'U', '/', 'N', 0, 0, ALPHA, A, 1, B, 1 )
02367       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02368       INFOT = 4
02369       CALL CTRMM( 'L', 'U', 'N', '/', 0, 0, ALPHA, A, 1, B, 1 )
02370       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02371       INFOT = 5
02372       CALL CTRMM( 'L', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02373       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02374       INFOT = 5
02375       CALL CTRMM( 'L', 'U', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02376       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02377       INFOT = 5
02378       CALL CTRMM( 'L', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02379       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02380       INFOT = 5
02381       CALL CTRMM( 'R', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02382       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02383       INFOT = 5
02384       CALL CTRMM( 'R', 'U', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02385       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02386       INFOT = 5
02387       CALL CTRMM( 'R', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02388       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02389       INFOT = 5
02390       CALL CTRMM( 'L', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02391       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02392       INFOT = 5
02393       CALL CTRMM( 'L', 'L', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02394       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02395       INFOT = 5
02396       CALL CTRMM( 'L', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02397       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02398       INFOT = 5
02399       CALL CTRMM( 'R', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02400       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02401       INFOT = 5
02402       CALL CTRMM( 'R', 'L', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02403       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02404       INFOT = 5
02405       CALL CTRMM( 'R', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02406       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02407       INFOT = 6
02408       CALL CTRMM( 'L', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02409       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02410       INFOT = 6
02411       CALL CTRMM( 'L', 'U', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02412       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02413       INFOT = 6
02414       CALL CTRMM( 'L', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02415       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02416       INFOT = 6
02417       CALL CTRMM( 'R', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02418       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02419       INFOT = 6
02420       CALL CTRMM( 'R', 'U', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02421       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02422       INFOT = 6
02423       CALL CTRMM( 'R', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02424       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02425       INFOT = 6
02426       CALL CTRMM( 'L', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02427       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02428       INFOT = 6
02429       CALL CTRMM( 'L', 'L', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02430       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02431       INFOT = 6
02432       CALL CTRMM( 'L', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02433       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02434       INFOT = 6
02435       CALL CTRMM( 'R', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02436       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02437       INFOT = 6
02438       CALL CTRMM( 'R', 'L', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02439       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02440       INFOT = 6
02441       CALL CTRMM( 'R', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02442       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02443       INFOT = 9
02444       CALL CTRMM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )
02445       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02446       INFOT = 9
02447       CALL CTRMM( 'L', 'U', 'C', 'N', 2, 0, ALPHA, A, 1, B, 2 )
02448       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02449       INFOT = 9
02450       CALL CTRMM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )
02451       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02452       INFOT = 9
02453       CALL CTRMM( 'R', 'U', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )
02454       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02455       INFOT = 9
02456       CALL CTRMM( 'R', 'U', 'C', 'N', 0, 2, ALPHA, A, 1, B, 1 )
02457       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02458       INFOT = 9
02459       CALL CTRMM( 'R', 'U', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )
02460       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02461       INFOT = 9
02462       CALL CTRMM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )
02463       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02464       INFOT = 9
02465       CALL CTRMM( 'L', 'L', 'C', 'N', 2, 0, ALPHA, A, 1, B, 2 )
02466       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02467       INFOT = 9
02468       CALL CTRMM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )
02469       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02470       INFOT = 9
02471       CALL CTRMM( 'R', 'L', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )
02472       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02473       INFOT = 9
02474       CALL CTRMM( 'R', 'L', 'C', 'N', 0, 2, ALPHA, A, 1, B, 1 )
02475       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02476       INFOT = 9
02477       CALL CTRMM( 'R', 'L', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )
02478       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02479       INFOT = 11
02480       CALL CTRMM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )
02481       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02482       INFOT = 11
02483       CALL CTRMM( 'L', 'U', 'C', 'N', 2, 0, ALPHA, A, 2, B, 1 )
02484       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02485       INFOT = 11
02486       CALL CTRMM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )
02487       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02488       INFOT = 11
02489       CALL CTRMM( 'R', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )
02490       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02491       INFOT = 11
02492       CALL CTRMM( 'R', 'U', 'C', 'N', 2, 0, ALPHA, A, 1, B, 1 )
02493       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02494       INFOT = 11
02495       CALL CTRMM( 'R', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )
02496       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02497       INFOT = 11
02498       CALL CTRMM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )
02499       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02500       INFOT = 11
02501       CALL CTRMM( 'L', 'L', 'C', 'N', 2, 0, ALPHA, A, 2, B, 1 )
02502       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02503       INFOT = 11
02504       CALL CTRMM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )
02505       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02506       INFOT = 11
02507       CALL CTRMM( 'R', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )
02508       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02509       INFOT = 11
02510       CALL CTRMM( 'R', 'L', 'C', 'N', 2, 0, ALPHA, A, 1, B, 1 )
02511       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02512       INFOT = 11
02513       CALL CTRMM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )
02514       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02515       GO TO 100
02516    50 INFOT = 1
02517       CALL CTRSM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )
02518       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02519       INFOT = 2
02520       CALL CTRSM( 'L', '/', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )
02521       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02522       INFOT = 3
02523       CALL CTRSM( 'L', 'U', '/', 'N', 0, 0, ALPHA, A, 1, B, 1 )
02524       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02525       INFOT = 4
02526       CALL CTRSM( 'L', 'U', 'N', '/', 0, 0, ALPHA, A, 1, B, 1 )
02527       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02528       INFOT = 5
02529       CALL CTRSM( 'L', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02530       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02531       INFOT = 5
02532       CALL CTRSM( 'L', 'U', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02533       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02534       INFOT = 5
02535       CALL CTRSM( 'L', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02536       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02537       INFOT = 5
02538       CALL CTRSM( 'R', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02539       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02540       INFOT = 5
02541       CALL CTRSM( 'R', 'U', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02542       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02543       INFOT = 5
02544       CALL CTRSM( 'R', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02545       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02546       INFOT = 5
02547       CALL CTRSM( 'L', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02548       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02549       INFOT = 5
02550       CALL CTRSM( 'L', 'L', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02551       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02552       INFOT = 5
02553       CALL CTRSM( 'L', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02554       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02555       INFOT = 5
02556       CALL CTRSM( 'R', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02557       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02558       INFOT = 5
02559       CALL CTRSM( 'R', 'L', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02560       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02561       INFOT = 5
02562       CALL CTRSM( 'R', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )
02563       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02564       INFOT = 6
02565       CALL CTRSM( 'L', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02566       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02567       INFOT = 6
02568       CALL CTRSM( 'L', 'U', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02569       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02570       INFOT = 6
02571       CALL CTRSM( 'L', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02572       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02573       INFOT = 6
02574       CALL CTRSM( 'R', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02575       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02576       INFOT = 6
02577       CALL CTRSM( 'R', 'U', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02578       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02579       INFOT = 6
02580       CALL CTRSM( 'R', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02581       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02582       INFOT = 6
02583       CALL CTRSM( 'L', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02584       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02585       INFOT = 6
02586       CALL CTRSM( 'L', 'L', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02587       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02588       INFOT = 6
02589       CALL CTRSM( 'L', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02590       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02591       INFOT = 6
02592       CALL CTRSM( 'R', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02593       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02594       INFOT = 6
02595       CALL CTRSM( 'R', 'L', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02596       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02597       INFOT = 6
02598       CALL CTRSM( 'R', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )
02599       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02600       INFOT = 9
02601       CALL CTRSM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )
02602       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02603       INFOT = 9
02604       CALL CTRSM( 'L', 'U', 'C', 'N', 2, 0, ALPHA, A, 1, B, 2 )
02605       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02606       INFOT = 9
02607       CALL CTRSM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )
02608       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02609       INFOT = 9
02610       CALL CTRSM( 'R', 'U', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )
02611       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02612       INFOT = 9
02613       CALL CTRSM( 'R', 'U', 'C', 'N', 0, 2, ALPHA, A, 1, B, 1 )
02614       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02615       INFOT = 9
02616       CALL CTRSM( 'R', 'U', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )
02617       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02618       INFOT = 9
02619       CALL CTRSM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )
02620       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02621       INFOT = 9
02622       CALL CTRSM( 'L', 'L', 'C', 'N', 2, 0, ALPHA, A, 1, B, 2 )
02623       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02624       INFOT = 9
02625       CALL CTRSM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )
02626       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02627       INFOT = 9
02628       CALL CTRSM( 'R', 'L', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )
02629       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02630       INFOT = 9
02631       CALL CTRSM( 'R', 'L', 'C', 'N', 0, 2, ALPHA, A, 1, B, 1 )
02632       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02633       INFOT = 9
02634       CALL CTRSM( 'R', 'L', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )
02635       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02636       INFOT = 11
02637       CALL CTRSM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )
02638       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02639       INFOT = 11
02640       CALL CTRSM( 'L', 'U', 'C', 'N', 2, 0, ALPHA, A, 2, B, 1 )
02641       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02642       INFOT = 11
02643       CALL CTRSM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )
02644       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02645       INFOT = 11
02646       CALL CTRSM( 'R', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )
02647       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02648       INFOT = 11
02649       CALL CTRSM( 'R', 'U', 'C', 'N', 2, 0, ALPHA, A, 1, B, 1 )
02650       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02651       INFOT = 11
02652       CALL CTRSM( 'R', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )
02653       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02654       INFOT = 11
02655       CALL CTRSM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )
02656       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02657       INFOT = 11
02658       CALL CTRSM( 'L', 'L', 'C', 'N', 2, 0, ALPHA, A, 2, B, 1 )
02659       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02660       INFOT = 11
02661       CALL CTRSM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )
02662       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02663       INFOT = 11
02664       CALL CTRSM( 'R', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )
02665       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02666       INFOT = 11
02667       CALL CTRSM( 'R', 'L', 'C', 'N', 2, 0, ALPHA, A, 1, B, 1 )
02668       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02669       INFOT = 11
02670       CALL CTRSM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )
02671       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02672       GO TO 100
02673    60 INFOT = 1
02674       CALL CHERK( '/', 'N', 0, 0, RALPHA, A, 1, RBETA, C, 1 )
02675       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02676       INFOT = 2
02677       CALL CHERK( 'U', 'T', 0, 0, RALPHA, A, 1, RBETA, C, 1 )
02678       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02679       INFOT = 3
02680       CALL CHERK( 'U', 'N', -1, 0, RALPHA, A, 1, RBETA, C, 1 )
02681       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02682       INFOT = 3
02683       CALL CHERK( 'U', 'C', -1, 0, RALPHA, A, 1, RBETA, C, 1 )
02684       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02685       INFOT = 3
02686       CALL CHERK( 'L', 'N', -1, 0, RALPHA, A, 1, RBETA, C, 1 )
02687       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02688       INFOT = 3
02689       CALL CHERK( 'L', 'C', -1, 0, RALPHA, A, 1, RBETA, C, 1 )
02690       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02691       INFOT = 4
02692       CALL CHERK( 'U', 'N', 0, -1, RALPHA, A, 1, RBETA, C, 1 )
02693       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02694       INFOT = 4
02695       CALL CHERK( 'U', 'C', 0, -1, RALPHA, A, 1, RBETA, C, 1 )
02696       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02697       INFOT = 4
02698       CALL CHERK( 'L', 'N', 0, -1, RALPHA, A, 1, RBETA, C, 1 )
02699       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02700       INFOT = 4
02701       CALL CHERK( 'L', 'C', 0, -1, RALPHA, A, 1, RBETA, C, 1 )
02702       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02703       INFOT = 7
02704       CALL CHERK( 'U', 'N', 2, 0, RALPHA, A, 1, RBETA, C, 2 )
02705       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02706       INFOT = 7
02707       CALL CHERK( 'U', 'C', 0, 2, RALPHA, A, 1, RBETA, C, 1 )
02708       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02709       INFOT = 7
02710       CALL CHERK( 'L', 'N', 2, 0, RALPHA, A, 1, RBETA, C, 2 )
02711       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02712       INFOT = 7
02713       CALL CHERK( 'L', 'C', 0, 2, RALPHA, A, 1, RBETA, C, 1 )
02714       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02715       INFOT = 10
02716       CALL CHERK( 'U', 'N', 2, 0, RALPHA, A, 2, RBETA, C, 1 )
02717       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02718       INFOT = 10
02719       CALL CHERK( 'U', 'C', 2, 0, RALPHA, A, 1, RBETA, C, 1 )
02720       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02721       INFOT = 10
02722       CALL CHERK( 'L', 'N', 2, 0, RALPHA, A, 2, RBETA, C, 1 )
02723       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02724       INFOT = 10
02725       CALL CHERK( 'L', 'C', 2, 0, RALPHA, A, 1, RBETA, C, 1 )
02726       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02727       GO TO 100
02728    70 INFOT = 1
02729       CALL CSYRK( '/', 'N', 0, 0, ALPHA, A, 1, BETA, C, 1 )
02730       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02731       INFOT = 2
02732       CALL CSYRK( 'U', 'C', 0, 0, ALPHA, A, 1, BETA, C, 1 )
02733       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02734       INFOT = 3
02735       CALL CSYRK( 'U', 'N', -1, 0, ALPHA, A, 1, BETA, C, 1 )
02736       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02737       INFOT = 3
02738       CALL CSYRK( 'U', 'T', -1, 0, ALPHA, A, 1, BETA, C, 1 )
02739       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02740       INFOT = 3
02741       CALL CSYRK( 'L', 'N', -1, 0, ALPHA, A, 1, BETA, C, 1 )
02742       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02743       INFOT = 3
02744       CALL CSYRK( 'L', 'T', -1, 0, ALPHA, A, 1, BETA, C, 1 )
02745       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02746       INFOT = 4
02747       CALL CSYRK( 'U', 'N', 0, -1, ALPHA, A, 1, BETA, C, 1 )
02748       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02749       INFOT = 4
02750       CALL CSYRK( 'U', 'T', 0, -1, ALPHA, A, 1, BETA, C, 1 )
02751       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02752       INFOT = 4
02753       CALL CSYRK( 'L', 'N', 0, -1, ALPHA, A, 1, BETA, C, 1 )
02754       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02755       INFOT = 4
02756       CALL CSYRK( 'L', 'T', 0, -1, ALPHA, A, 1, BETA, C, 1 )
02757       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02758       INFOT = 7
02759       CALL CSYRK( 'U', 'N', 2, 0, ALPHA, A, 1, BETA, C, 2 )
02760       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02761       INFOT = 7
02762       CALL CSYRK( 'U', 'T', 0, 2, ALPHA, A, 1, BETA, C, 1 )
02763       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02764       INFOT = 7
02765       CALL CSYRK( 'L', 'N', 2, 0, ALPHA, A, 1, BETA, C, 2 )
02766       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02767       INFOT = 7
02768       CALL CSYRK( 'L', 'T', 0, 2, ALPHA, A, 1, BETA, C, 1 )
02769       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02770       INFOT = 10
02771       CALL CSYRK( 'U', 'N', 2, 0, ALPHA, A, 2, BETA, C, 1 )
02772       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02773       INFOT = 10
02774       CALL CSYRK( 'U', 'T', 2, 0, ALPHA, A, 1, BETA, C, 1 )
02775       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02776       INFOT = 10
02777       CALL CSYRK( 'L', 'N', 2, 0, ALPHA, A, 2, BETA, C, 1 )
02778       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02779       INFOT = 10
02780       CALL CSYRK( 'L', 'T', 2, 0, ALPHA, A, 1, BETA, C, 1 )
02781       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02782       GO TO 100
02783    80 INFOT = 1
02784       CALL CHER2K( '/', 'N', 0, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )
02785       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02786       INFOT = 2
02787       CALL CHER2K( 'U', 'T', 0, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )
02788       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02789       INFOT = 3
02790       CALL CHER2K( 'U', 'N', -1, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )
02791       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02792       INFOT = 3
02793       CALL CHER2K( 'U', 'C', -1, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )
02794       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02795       INFOT = 3
02796       CALL CHER2K( 'L', 'N', -1, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )
02797       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02798       INFOT = 3
02799       CALL CHER2K( 'L', 'C', -1, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )
02800       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02801       INFOT = 4
02802       CALL CHER2K( 'U', 'N', 0, -1, ALPHA, A, 1, B, 1, RBETA, C, 1 )
02803       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02804       INFOT = 4
02805       CALL CHER2K( 'U', 'C', 0, -1, ALPHA, A, 1, B, 1, RBETA, C, 1 )
02806       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02807       INFOT = 4
02808       CALL CHER2K( 'L', 'N', 0, -1, ALPHA, A, 1, B, 1, RBETA, C, 1 )
02809       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02810       INFOT = 4
02811       CALL CHER2K( 'L', 'C', 0, -1, ALPHA, A, 1, B, 1, RBETA, C, 1 )
02812       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02813       INFOT = 7
02814       CALL CHER2K( 'U', 'N', 2, 0, ALPHA, A, 1, B, 1, RBETA, C, 2 )
02815       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02816       INFOT = 7
02817       CALL CHER2K( 'U', 'C', 0, 2, ALPHA, A, 1, B, 1, RBETA, C, 1 )
02818       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02819       INFOT = 7
02820       CALL CHER2K( 'L', 'N', 2, 0, ALPHA, A, 1, B, 1, RBETA, C, 2 )
02821       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02822       INFOT = 7
02823       CALL CHER2K( 'L', 'C', 0, 2, ALPHA, A, 1, B, 1, RBETA, C, 1 )
02824       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02825       INFOT = 9
02826       CALL CHER2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 1, RBETA, C, 2 )
02827       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02828       INFOT = 9
02829       CALL CHER2K( 'U', 'C', 0, 2, ALPHA, A, 2, B, 1, RBETA, C, 1 )
02830       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02831       INFOT = 9
02832       CALL CHER2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 1, RBETA, C, 2 )
02833       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02834       INFOT = 9
02835       CALL CHER2K( 'L', 'C', 0, 2, ALPHA, A, 2, B, 1, RBETA, C, 1 )
02836       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02837       INFOT = 12
02838       CALL CHER2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 2, RBETA, C, 1 )
02839       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02840       INFOT = 12
02841       CALL CHER2K( 'U', 'C', 2, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )
02842       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02843       INFOT = 12
02844       CALL CHER2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 2, RBETA, C, 1 )
02845       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02846       INFOT = 12
02847       CALL CHER2K( 'L', 'C', 2, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )
02848       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02849       GO TO 100
02850    90 INFOT = 1
02851       CALL CSYR2K( '/', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02852       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02853       INFOT = 2
02854       CALL CSYR2K( 'U', 'C', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02855       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02856       INFOT = 3
02857       CALL CSYR2K( 'U', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02858       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02859       INFOT = 3
02860       CALL CSYR2K( 'U', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02861       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02862       INFOT = 3
02863       CALL CSYR2K( 'L', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02864       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02865       INFOT = 3
02866       CALL CSYR2K( 'L', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02867       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02868       INFOT = 4
02869       CALL CSYR2K( 'U', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
02870       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02871       INFOT = 4
02872       CALL CSYR2K( 'U', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
02873       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02874       INFOT = 4
02875       CALL CSYR2K( 'L', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
02876       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02877       INFOT = 4
02878       CALL CSYR2K( 'L', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )
02879       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02880       INFOT = 7
02881       CALL CSYR2K( 'U', 'N', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )
02882       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02883       INFOT = 7
02884       CALL CSYR2K( 'U', 'T', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )
02885       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02886       INFOT = 7
02887       CALL CSYR2K( 'L', 'N', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )
02888       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02889       INFOT = 7
02890       CALL CSYR2K( 'L', 'T', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )
02891       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02892       INFOT = 9
02893       CALL CSYR2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 )
02894       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02895       INFOT = 9
02896       CALL CSYR2K( 'U', 'T', 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 )
02897       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02898       INFOT = 9
02899       CALL CSYR2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 )
02900       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02901       INFOT = 9
02902       CALL CSYR2K( 'L', 'T', 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 )
02903       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02904       INFOT = 12
02905       CALL CSYR2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )
02906       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02907       INFOT = 12
02908       CALL CSYR2K( 'U', 'T', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02909       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02910       INFOT = 12
02911       CALL CSYR2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )
02912       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02913       INFOT = 12
02914       CALL CSYR2K( 'L', 'T', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )
02915       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02916 *
02917   100 IF( OK )THEN
02918          WRITE( NOUT, FMT = 9999 )SRNAMT
02919       ELSE
02920          WRITE( NOUT, FMT = 9998 )SRNAMT
02921       END IF
02922       RETURN
02923 *
02924  9999 FORMAT( ' ', A6, ' PASSED THE TESTS OF ERROR-EXITS' )
02925  9998 FORMAT( ' ******* ', A6, ' FAILED THE TESTS OF ERROR-EXITS *****',
02926      $      '**' )
02927 *
02928 *     End of CCHKE.
02929 *
02930       END
02931       SUBROUTINE CMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET,
02932      $                  TRANSL )
02933 *
02934 *  Generates values for an M by N matrix A.
02935 *  Stores the values in the array AA in the data structure required
02936 *  by the routine, with unwanted elements set to rogue value.
02937 *
02938 *  TYPE is 'GE', 'HE', 'SY' or 'TR'.
02939 *
02940 *  Auxiliary routine for test program for Level 3 Blas.
02941 *
02942 *  -- Written on 8-February-1989.
02943 *     Jack Dongarra, Argonne National Laboratory.
02944 *     Iain Duff, AERE Harwell.
02945 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
02946 *     Sven Hammarling, Numerical Algorithms Group Ltd.
02947 *
02948 *     .. Parameters ..
02949       COMPLEX            ZERO, ONE
02950       PARAMETER          ( ZERO = ( 0.0, 0.0 ), ONE = ( 1.0, 0.0 ) )
02951       COMPLEX            ROGUE
02952       PARAMETER          ( ROGUE = ( -1.0E10, 1.0E10 ) )
02953       REAL               RZERO
02954       PARAMETER          ( RZERO = 0.0 )
02955       REAL               RROGUE
02956       PARAMETER          ( RROGUE = -1.0E10 )
02957 *     .. Scalar Arguments ..
02958       COMPLEX            TRANSL
02959       INTEGER            LDA, M, N, NMAX
02960       LOGICAL            RESET
02961       CHARACTER*1        DIAG, UPLO
02962       CHARACTER*2        TYPE
02963 *     .. Array Arguments ..
02964       COMPLEX            A( NMAX, * ), AA( * )
02965 *     .. Local Scalars ..
02966       INTEGER            I, IBEG, IEND, J, JJ
02967       LOGICAL            GEN, HER, LOWER, SYM, TRI, UNIT, UPPER
02968 *     .. External Functions ..
02969       COMPLEX            CBEG
02970       EXTERNAL           CBEG
02971 *     .. Intrinsic Functions ..
02972       INTRINSIC          CMPLX, CONJG, REAL
02973 *     .. Executable Statements ..
02974       GEN = TYPE.EQ.'GE'
02975       HER = TYPE.EQ.'HE'
02976       SYM = TYPE.EQ.'SY'
02977       TRI = TYPE.EQ.'TR'
02978       UPPER = ( HER.OR.SYM.OR.TRI ).AND.UPLO.EQ.'U'
02979       LOWER = ( HER.OR.SYM.OR.TRI ).AND.UPLO.EQ.'L'
02980       UNIT = TRI.AND.DIAG.EQ.'U'
02981 *
02982 *     Generate data in array A.
02983 *
02984       DO 20 J = 1, N
02985          DO 10 I = 1, M
02986             IF( GEN.OR.( UPPER.AND.I.LE.J ).OR.( LOWER.AND.I.GE.J ) )
02987      $          THEN
02988                A( I, J ) = CBEG( RESET ) + TRANSL
02989                IF( I.NE.J )THEN
02990 *                 Set some elements to zero
02991                   IF( N.GT.3.AND.J.EQ.N/2 )
02992      $               A( I, J ) = ZERO
02993                   IF( HER )THEN
02994                      A( J, I ) = CONJG( A( I, J ) )
02995                   ELSE IF( SYM )THEN
02996                      A( J, I ) = A( I, J )
02997                   ELSE IF( TRI )THEN
02998                      A( J, I ) = ZERO
02999                   END IF
03000                END IF
03001             END IF
03002    10    CONTINUE
03003          IF( HER )
03004      $      A( J, J ) = CMPLX( REAL( A( J, J ) ), RZERO )
03005          IF( TRI )
03006      $      A( J, J ) = A( J, J ) + ONE
03007          IF( UNIT )
03008      $      A( J, J ) = ONE
03009    20 CONTINUE
03010 *
03011 *     Store elements in array AS in data structure required by routine.
03012 *
03013       IF( TYPE.EQ.'GE' )THEN
03014          DO 50 J = 1, N
03015             DO 30 I = 1, M
03016                AA( I + ( J - 1 )*LDA ) = A( I, J )
03017    30       CONTINUE
03018             DO 40 I = M + 1, LDA
03019                AA( I + ( J - 1 )*LDA ) = ROGUE
03020    40       CONTINUE
03021    50    CONTINUE
03022       ELSE IF( TYPE.EQ.'HE'.OR.TYPE.EQ.'SY'.OR.TYPE.EQ.'TR' )THEN
03023          DO 90 J = 1, N
03024             IF( UPPER )THEN
03025                IBEG = 1
03026                IF( UNIT )THEN
03027                   IEND = J - 1
03028                ELSE
03029                   IEND = J
03030                END IF
03031             ELSE
03032                IF( UNIT )THEN
03033                   IBEG = J + 1
03034                ELSE
03035                   IBEG = J
03036                END IF
03037                IEND = N
03038             END IF
03039             DO 60 I = 1, IBEG - 1
03040                AA( I + ( J - 1 )*LDA ) = ROGUE
03041    60       CONTINUE
03042             DO 70 I = IBEG, IEND
03043                AA( I + ( J - 1 )*LDA ) = A( I, J )
03044    70       CONTINUE
03045             DO 80 I = IEND + 1, LDA
03046                AA( I + ( J - 1 )*LDA ) = ROGUE
03047    80       CONTINUE
03048             IF( HER )THEN
03049                JJ = J + ( J - 1 )*LDA
03050                AA( JJ ) = CMPLX( REAL( AA( JJ ) ), RROGUE )
03051             END IF
03052    90    CONTINUE
03053       END IF
03054       RETURN
03055 *
03056 *     End of CMAKE.
03057 *
03058       END
03059       SUBROUTINE CMMCH( TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB,
03060      $                  BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, FATAL,
03061      $                  NOUT, MV )
03062 *
03063 *  Checks the results of the computational tests.
03064 *
03065 *  Auxiliary routine for test program for Level 3 Blas.
03066 *
03067 *  -- Written on 8-February-1989.
03068 *     Jack Dongarra, Argonne National Laboratory.
03069 *     Iain Duff, AERE Harwell.
03070 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
03071 *     Sven Hammarling, Numerical Algorithms Group Ltd.
03072 *
03073 *     .. Parameters ..
03074       COMPLEX            ZERO
03075       PARAMETER          ( ZERO = ( 0.0, 0.0 ) )
03076       REAL               RZERO, RONE
03077       PARAMETER          ( RZERO = 0.0, RONE = 1.0 )
03078 *     .. Scalar Arguments ..
03079       COMPLEX            ALPHA, BETA
03080       REAL               EPS, ERR
03081       INTEGER            KK, LDA, LDB, LDC, LDCC, M, N, NOUT
03082       LOGICAL            FATAL, MV
03083       CHARACTER*1        TRANSA, TRANSB
03084 *     .. Array Arguments ..
03085       COMPLEX            A( LDA, * ), B( LDB, * ), C( LDC, * ),
03086      $                   CC( LDCC, * ), CT( * )
03087       REAL               G( * )
03088 *     .. Local Scalars ..
03089       COMPLEX            CL
03090       REAL               ERRI
03091       INTEGER            I, J, K
03092       LOGICAL            CTRANA, CTRANB, TRANA, TRANB
03093 *     .. Intrinsic Functions ..
03094       INTRINSIC          ABS, AIMAG, CONJG, MAX, REAL, SQRT
03095 *     .. Statement Functions ..
03096       REAL               ABS1
03097 *     .. Statement Function definitions ..
03098       ABS1( CL ) = ABS( REAL( CL ) ) + ABS( AIMAG( CL ) )
03099 *     .. Executable Statements ..
03100       TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C'
03101       TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C'
03102       CTRANA = TRANSA.EQ.'C'
03103       CTRANB = TRANSB.EQ.'C'
03104 *
03105 *     Compute expected result, one column at a time, in CT using data
03106 *     in A, B and C.
03107 *     Compute gauges in G.
03108 *
03109       DO 220 J = 1, N
03110 *
03111          DO 10 I = 1, M
03112             CT( I ) = ZERO
03113             G( I ) = RZERO
03114    10    CONTINUE
03115          IF( .NOT.TRANA.AND..NOT.TRANB )THEN
03116             DO 30 K = 1, KK
03117                DO 20 I = 1, M
03118                   CT( I ) = CT( I ) + A( I, K )*B( K, J )
03119                   G( I ) = G( I ) + ABS1( A( I, K ) )*ABS1( B( K, J ) )
03120    20          CONTINUE
03121    30       CONTINUE
03122          ELSE IF( TRANA.AND..NOT.TRANB )THEN
03123             IF( CTRANA )THEN
03124                DO 50 K = 1, KK
03125                   DO 40 I = 1, M
03126                      CT( I ) = CT( I ) + CONJG( A( K, I ) )*B( K, J )
03127                      G( I ) = G( I ) + ABS1( A( K, I ) )*
03128      $                        ABS1( B( K, J ) )
03129    40             CONTINUE
03130    50          CONTINUE
03131             ELSE
03132                DO 70 K = 1, KK
03133                   DO 60 I = 1, M
03134                      CT( I ) = CT( I ) + A( K, I )*B( K, J )
03135                      G( I ) = G( I ) + ABS1( A( K, I ) )*
03136      $                        ABS1( B( K, J ) )
03137    60             CONTINUE
03138    70          CONTINUE
03139             END IF
03140          ELSE IF( .NOT.TRANA.AND.TRANB )THEN
03141             IF( CTRANB )THEN
03142                DO 90 K = 1, KK
03143                   DO 80 I = 1, M
03144                      CT( I ) = CT( I ) + A( I, K )*CONJG( B( J, K ) )
03145                      G( I ) = G( I ) + ABS1( A( I, K ) )*
03146      $                        ABS1( B( J, K ) )
03147    80             CONTINUE
03148    90          CONTINUE
03149             ELSE
03150                DO 110 K = 1, KK
03151                   DO 100 I = 1, M
03152                      CT( I ) = CT( I ) + A( I, K )*B( J, K )
03153                      G( I ) = G( I ) + ABS1( A( I, K ) )*
03154      $                        ABS1( B( J, K ) )
03155   100             CONTINUE
03156   110          CONTINUE
03157             END IF
03158          ELSE IF( TRANA.AND.TRANB )THEN
03159             IF( CTRANA )THEN
03160                IF( CTRANB )THEN
03161                   DO 130 K = 1, KK
03162                      DO 120 I = 1, M
03163                         CT( I ) = CT( I ) + CONJG( A( K, I ) )*
03164      $                            CONJG( B( J, K ) )
03165                         G( I ) = G( I ) + ABS1( A( K, I ) )*
03166      $                           ABS1( B( J, K ) )
03167   120                CONTINUE
03168   130             CONTINUE
03169                ELSE
03170                   DO 150 K = 1, KK
03171                      DO 140 I = 1, M
03172                         CT( I ) = CT( I ) + CONJG( A( K, I ) )*B( J, K )
03173                         G( I ) = G( I ) + ABS1( A( K, I ) )*
03174      $                           ABS1( B( J, K ) )
03175   140                CONTINUE
03176   150             CONTINUE
03177                END IF
03178             ELSE
03179                IF( CTRANB )THEN
03180                   DO 170 K = 1, KK
03181                      DO 160 I = 1, M
03182                         CT( I ) = CT( I ) + A( K, I )*CONJG( B( J, K ) )
03183                         G( I ) = G( I ) + ABS1( A( K, I ) )*
03184      $                           ABS1( B( J, K ) )
03185   160                CONTINUE
03186   170             CONTINUE
03187                ELSE
03188                   DO 190 K = 1, KK
03189                      DO 180 I = 1, M
03190                         CT( I ) = CT( I ) + A( K, I )*B( J, K )
03191                         G( I ) = G( I ) + ABS1( A( K, I ) )*
03192      $                           ABS1( B( J, K ) )
03193   180                CONTINUE
03194   190             CONTINUE
03195                END IF
03196             END IF
03197          END IF
03198          DO 200 I = 1, M
03199             CT( I ) = ALPHA*CT( I ) + BETA*C( I, J )
03200             G( I ) = ABS1( ALPHA )*G( I ) +
03201      $               ABS1( BETA )*ABS1( C( I, J ) )
03202   200    CONTINUE
03203 *
03204 *        Compute the error ratio for this result.
03205 *
03206          ERR = ZERO
03207          DO 210 I = 1, M
03208             ERRI = ABS1( CT( I ) - CC( I, J ) )/EPS
03209             IF( G( I ).NE.RZERO )
03210      $         ERRI = ERRI/G( I )
03211             ERR = MAX( ERR, ERRI )
03212             IF( ERR*SQRT( EPS ).GE.RONE )
03213      $         GO TO 230
03214   210    CONTINUE
03215 *
03216   220 CONTINUE
03217 *
03218 *     If the loop completes, all results are at least half accurate.
03219       GO TO 250
03220 *
03221 *     Report fatal error.
03222 *
03223   230 FATAL = .TRUE.
03224       WRITE( NOUT, FMT = 9999 )
03225       DO 240 I = 1, M
03226          IF( MV )THEN
03227             WRITE( NOUT, FMT = 9998 )I, CT( I ), CC( I, J )
03228          ELSE
03229             WRITE( NOUT, FMT = 9998 )I, CC( I, J ), CT( I )
03230          END IF
03231   240 CONTINUE
03232       IF( N.GT.1 )
03233      $   WRITE( NOUT, FMT = 9997 )J
03234 *
03235   250 CONTINUE
03236       RETURN
03237 *
03238  9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',
03239      $      'F ACCURATE *******', /'                       EXPECTED RE',
03240      $      'SULT                    COMPUTED RESULT' )
03241  9998 FORMAT( 1X, I7, 2( '  (', G15.6, ',', G15.6, ')' ) )
03242  9997 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )
03243 *
03244 *     End of CMMCH.
03245 *
03246       END
03247       LOGICAL FUNCTION LCE( RI, RJ, LR )
03248 *
03249 *  Tests if two arrays are identical.
03250 *
03251 *  Auxiliary routine for test program for Level 3 Blas.
03252 *
03253 *  -- Written on 8-February-1989.
03254 *     Jack Dongarra, Argonne National Laboratory.
03255 *     Iain Duff, AERE Harwell.
03256 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
03257 *     Sven Hammarling, Numerical Algorithms Group Ltd.
03258 *
03259 *     .. Scalar Arguments ..
03260       INTEGER            LR
03261 *     .. Array Arguments ..
03262       COMPLEX            RI( * ), RJ( * )
03263 *     .. Local Scalars ..
03264       INTEGER            I
03265 *     .. Executable Statements ..
03266       DO 10 I = 1, LR
03267          IF( RI( I ).NE.RJ( I ) )
03268      $      GO TO 20
03269    10 CONTINUE
03270       LCE = .TRUE.
03271       GO TO 30
03272    20 CONTINUE
03273       LCE = .FALSE.
03274    30 RETURN
03275 *
03276 *     End of LCE.
03277 *
03278       END
03279       LOGICAL FUNCTION LCERES( TYPE, UPLO, M, N, AA, AS, LDA )
03280 *
03281 *  Tests if selected elements in two arrays are equal.
03282 *
03283 *  TYPE is 'GE' or 'HE' or 'SY'.
03284 *
03285 *  Auxiliary routine for test program for Level 3 Blas.
03286 *
03287 *  -- Written on 8-February-1989.
03288 *     Jack Dongarra, Argonne National Laboratory.
03289 *     Iain Duff, AERE Harwell.
03290 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
03291 *     Sven Hammarling, Numerical Algorithms Group Ltd.
03292 *
03293 *     .. Scalar Arguments ..
03294       INTEGER            LDA, M, N
03295       CHARACTER*1        UPLO
03296       CHARACTER*2        TYPE
03297 *     .. Array Arguments ..
03298       COMPLEX            AA( LDA, * ), AS( LDA, * )
03299 *     .. Local Scalars ..
03300       INTEGER            I, IBEG, IEND, J
03301       LOGICAL            UPPER
03302 *     .. Executable Statements ..
03303       UPPER = UPLO.EQ.'U'
03304       IF( TYPE.EQ.'GE' )THEN
03305          DO 20 J = 1, N
03306             DO 10 I = M + 1, LDA
03307                IF( AA( I, J ).NE.AS( I, J ) )
03308      $            GO TO 70
03309    10       CONTINUE
03310    20    CONTINUE
03311       ELSE IF( TYPE.EQ.'HE'.OR.TYPE.EQ.'SY' )THEN
03312          DO 50 J = 1, N
03313             IF( UPPER )THEN
03314                IBEG = 1
03315                IEND = J
03316             ELSE
03317                IBEG = J
03318                IEND = N
03319             END IF
03320             DO 30 I = 1, IBEG - 1
03321                IF( AA( I, J ).NE.AS( I, J ) )
03322      $            GO TO 70
03323    30       CONTINUE
03324             DO 40 I = IEND + 1, LDA
03325                IF( AA( I, J ).NE.AS( I, J ) )
03326      $            GO TO 70
03327    40       CONTINUE
03328    50    CONTINUE
03329       END IF
03330 *
03331       LCERES = .TRUE.
03332       GO TO 80
03333    70 CONTINUE
03334       LCERES = .FALSE.
03335    80 RETURN
03336 *
03337 *     End of LCERES.
03338 *
03339       END
03340       COMPLEX FUNCTION CBEG( RESET )
03341 *
03342 *  Generates complex numbers as pairs of random numbers uniformly
03343 *  distributed between -0.5 and 0.5.
03344 *
03345 *  Auxiliary routine for test program for Level 3 Blas.
03346 *
03347 *  -- Written on 8-February-1989.
03348 *     Jack Dongarra, Argonne National Laboratory.
03349 *     Iain Duff, AERE Harwell.
03350 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
03351 *     Sven Hammarling, Numerical Algorithms Group Ltd.
03352 *
03353 *     .. Scalar Arguments ..
03354       LOGICAL            RESET
03355 *     .. Local Scalars ..
03356       INTEGER            I, IC, J, MI, MJ
03357 *     .. Save statement ..
03358       SAVE               I, IC, J, MI, MJ
03359 *     .. Intrinsic Functions ..
03360       INTRINSIC          CMPLX
03361 *     .. Executable Statements ..
03362       IF( RESET )THEN
03363 *        Initialize local variables.
03364          MI = 891
03365          MJ = 457
03366          I = 7
03367          J = 7
03368          IC = 0
03369          RESET = .FALSE.
03370       END IF
03371 *
03372 *     The sequence of values of I or J is bounded between 1 and 999.
03373 *     If initial I or J = 1,2,3,6,7 or 9, the period will be 50.
03374 *     If initial I or J = 4 or 8, the period will be 25.
03375 *     If initial I or J = 5, the period will be 10.
03376 *     IC is used to break up the period by skipping 1 value of I or J
03377 *     in 6.
03378 *
03379       IC = IC + 1
03380    10 I = I*MI
03381       J = J*MJ
03382       I = I - 1000*( I/1000 )
03383       J = J - 1000*( J/1000 )
03384       IF( IC.GE.5 )THEN
03385          IC = 0
03386          GO TO 10
03387       END IF
03388       CBEG = CMPLX( ( I - 500 )/1001.0, ( J - 500 )/1001.0 )
03389       RETURN
03390 *
03391 *     End of CBEG.
03392 *
03393       END
03394       REAL FUNCTION SDIFF( X, Y )
03395 *
03396 *  Auxiliary routine for test program for Level 3 Blas.
03397 *
03398 *  -- Written on 8-February-1989.
03399 *     Jack Dongarra, Argonne National Laboratory.
03400 *     Iain Duff, AERE Harwell.
03401 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
03402 *     Sven Hammarling, Numerical Algorithms Group Ltd.
03403 *
03404 *     .. Scalar Arguments ..
03405       REAL               X, Y
03406 *     .. Executable Statements ..
03407       SDIFF = X - Y
03408       RETURN
03409 *
03410 *     End of SDIFF.
03411 *
03412       END
03413       SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
03414 *
03415 *  Tests whether XERBLA has detected an error when it should.
03416 *
03417 *  Auxiliary routine for test program for Level 3 Blas.
03418 *
03419 *  -- Written on 8-February-1989.
03420 *     Jack Dongarra, Argonne National Laboratory.
03421 *     Iain Duff, AERE Harwell.
03422 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
03423 *     Sven Hammarling, Numerical Algorithms Group Ltd.
03424 *
03425 *     .. Scalar Arguments ..
03426       INTEGER            INFOT, NOUT
03427       LOGICAL            LERR, OK
03428       CHARACTER*6        SRNAMT
03429 *     .. Executable Statements ..
03430       IF( .NOT.LERR )THEN
03431          WRITE( NOUT, FMT = 9999 )INFOT, SRNAMT
03432          OK = .FALSE.
03433       END IF
03434       LERR = .FALSE.
03435       RETURN
03436 *
03437  9999 FORMAT( ' ***** ILLEGAL VALUE OF PARAMETER NUMBER ', I2, ' NOT D',
03438      $      'ETECTED BY ', A6, ' *****' )
03439 *
03440 *     End of CHKXER.
03441 *
03442       END
03443       SUBROUTINE XERBLA( SRNAME, INFO )
03444 *
03445 *  This is a special version of XERBLA to be used only as part of
03446 *  the test program for testing error exits from the Level 3 BLAS
03447 *  routines.
03448 *
03449 *  XERBLA  is an error handler for the Level 3 BLAS routines.
03450 *
03451 *  It is called by the Level 3 BLAS routines if an input parameter is
03452 *  invalid.
03453 *
03454 *  Auxiliary routine for test program for Level 3 Blas.
03455 *
03456 *  -- Written on 8-February-1989.
03457 *     Jack Dongarra, Argonne National Laboratory.
03458 *     Iain Duff, AERE Harwell.
03459 *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
03460 *     Sven Hammarling, Numerical Algorithms Group Ltd.
03461 *
03462 *     .. Scalar Arguments ..
03463       INTEGER            INFO
03464       CHARACTER*6        SRNAME
03465 *     .. Scalars in Common ..
03466       INTEGER            INFOT, NOUT
03467       LOGICAL            LERR, OK
03468       CHARACTER*6        SRNAMT
03469 *     .. Common blocks ..
03470       COMMON             /INFOC/INFOT, NOUT, OK, LERR
03471       COMMON             /SRNAMC/SRNAMT
03472 *     .. Executable Statements ..
03473       LERR = .TRUE.
03474       IF( INFO.NE.INFOT )THEN
03475          IF( INFOT.NE.0 )THEN
03476             WRITE( NOUT, FMT = 9999 )INFO, INFOT
03477          ELSE
03478             WRITE( NOUT, FMT = 9997 )INFO
03479          END IF
03480          OK = .FALSE.
03481       END IF
03482       IF( SRNAME.NE.SRNAMT )THEN
03483          WRITE( NOUT, FMT = 9998 )SRNAME, SRNAMT
03484          OK = .FALSE.
03485       END IF
03486       RETURN
03487 *
03488  9999 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, ' INSTEAD',
03489      $      ' OF ', I2, ' *******' )
03490  9998 FORMAT( ' ******* XERBLA WAS CALLED WITH SRNAME = ', A6, ' INSTE',
03491      $      'AD OF ', A6, ' *******' )
03492  9997 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6,
03493      $      ' *******' )
03494 *
03495 *     End of XERBLA
03496 *
03497       END
03498 
 All Files Functions