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