980
  981
  982
  983
  984
  985
  986
  987
  988
  989
  990
  991
  992      COMPLEX*16         ZERO, ONE
  993      parameter( zero = ( 0.0d0, 0.0d0 ),
  994     $                   one = ( 1.0d0, 0.0d0 ) )
  995      DOUBLE PRECISION   RZERO
  996      parameter( rzero = 0.0d0 )
  997
  998      DOUBLE PRECISION   EPS, THRESH
  999      INTEGER            NALF, NIDIM, NMAX, NOUT, NTRA
 1000      LOGICAL            FATAL, REWI, TRACE
 1001      CHARACTER*7        SNAME
 1002
 1003      COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
 1004     $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),
 1005     $                   BB( NMAX*NMAX ), BS( NMAX*NMAX ),
 1006     $                   C( NMAX, NMAX ), CT( NMAX )
 1007      DOUBLE PRECISION   G( NMAX )
 1008      INTEGER            IDIM( NIDIM )
 1009
 1010      COMPLEX*16         ALPHA, ALS
 1011      DOUBLE PRECISION   ERR, ERRMAX
 1012      INTEGER            I, IA, ICD, ICS, ICT, ICU, IM, IN, J, LAA, LBB,
 1013     $                   LDA, LDAS, LDB, LDBS, M, MS, N, NA, NARGS, NC,
 1014     $                   NS
 1015      LOGICAL            LEFT, NULL, RESET, SAME
 1016      CHARACTER*1        DIAG, DIAGS, SIDE, SIDES, TRANAS, TRANSA, UPLO,
 1017     $                   UPLOS
 1018      CHARACTER*2        ICHD, ICHS, ICHU
 1019      CHARACTER*3        ICHT
 1020
 1021      LOGICAL            ISAME( 13 )
 1022
 1023      LOGICAL            LZE, LZERES
 1025
 1027
 1028      INTRINSIC          max
 1029
 1030      INTEGER            INFOT, NOUTC
 1031      LOGICAL            LERR, OK
 1032
 1033      COMMON             /infoc/infot, noutc, ok, lerr
 1034
 1035      DATA               ichu/'UL'/, icht/'NTC'/, ichd/'UN'/, ichs/'LR'/
 1036
 1037
 1038      nargs = 11
 1039      nc = 0
 1040      reset = .true.
 1041      errmax = rzero
 1042
 1043      DO 20 j = 1, nmax
 1044         DO 10 i = 1, nmax
 1045            c( i, j ) = zero
 1046   10    CONTINUE
 1047   20 CONTINUE
 1048
 1049      DO 140 im = 1, nidim
 1050         m = idim( im )
 1051
 1052         DO 130 in = 1, nidim
 1053            n = idim( in )
 1054
 1055            ldb = m
 1056            IF( ldb.LT.nmax )
 1057     $         ldb = ldb + 1
 1058
 1059            IF( ldb.GT.nmax )
 1060     $         GO TO 130
 1061            lbb = ldb*n
 1062            null = m.LE.0.OR.n.LE.0
 1063
 1064            DO 120 ics = 1, 2
 1065               side = ichs( ics: ics )
 1066               left = side.EQ.'L'
 1067               IF( left )THEN
 1068                  na = m
 1069               ELSE
 1070                  na = n
 1071               END IF
 1072
 1073               lda = na
 1074               IF( lda.LT.nmax )
 1075     $            lda = lda + 1
 1076
 1077               IF( lda.GT.nmax )
 1078     $            GO TO 130
 1079               laa = lda*na
 1080
 1081               DO 110 icu = 1, 2
 1082                  uplo = ichu( icu: icu )
 1083
 1084                  DO 100 ict = 1, 3
 1085                     transa = icht( ict: ict )
 1086
 1087                     DO 90 icd = 1, 2
 1088                        diag = ichd( icd: icd )
 1089
 1090                        DO 80 ia = 1, nalf
 1091                           alpha = alf( ia )
 1092
 1093
 1094
 1095                           CALL zmake( 
'TR', uplo, diag, na, na, a,
 
 1096     $                                 nmax, aa, lda, reset, zero )
 1097
 1098
 1099
 1100                           CALL zmake( 
'GE', 
' ', 
' ', m, n, b, nmax,
 
 1101     $                                 bb, ldb, reset, zero )
 1102
 1103                           nc = nc + 1
 1104
 1105
 1106
 1107
 1108                           sides = side
 1109                           uplos = uplo
 1110                           tranas = transa
 1111                           diags = diag
 1112                           ms = m
 1113                           ns = n
 1114                           als = alpha
 1115                           DO 30 i = 1, laa
 1116                              as( i ) = aa( i )
 1117   30                      CONTINUE
 1118                           ldas = lda
 1119                           DO 40 i = 1, lbb
 1120                              bs( i ) = bb( i )
 1121   40                      CONTINUE
 1122                           ldbs = ldb
 1123
 1124
 1125
 1126                           IF( sname( 4: 5 ).EQ.'MM' )THEN
 1127                              IF( trace )
 1128     $                           WRITE( ntra, fmt = 9995 )nc, sname,
 1129     $                           side, uplo, transa, diag, m, n, alpha,
 1130     $                           lda, ldb
 1131                              IF( rewi )
 1132     $                           rewind ntra
 1133                              CALL ztrmm( side, uplo, transa, diag, m,
 
 1134     $                                    n, alpha, aa, lda, bb, ldb )
 1135                           ELSE IF( sname( 4: 5 ).EQ.'SM' )THEN
 1136                              IF( trace )
 1137     $                           WRITE( ntra, fmt = 9995 )nc, sname,
 1138     $                           side, uplo, transa, diag, m, n, alpha,
 1139     $                           lda, ldb
 1140                              IF( rewi )
 1141     $                           rewind ntra
 1142                              CALL ztrsm( side, uplo, transa, diag, m,
 
 1143     $                                    n, alpha, aa, lda, bb, ldb )
 1144                           END IF
 1145
 1146
 1147
 1148                           IF( .NOT.ok )THEN
 1149                              WRITE( nout, fmt = 9994 )
 1150                              fatal = .true.
 1151                              GO TO 150
 1152                           END IF
 1153
 1154
 1155
 1156                           isame( 1 ) = sides.EQ.side
 1157                           isame( 2 ) = uplos.EQ.uplo
 1158                           isame( 3 ) = tranas.EQ.transa
 1159                           isame( 4 ) = diags.EQ.diag
 1160                           isame( 5 ) = ms.EQ.m
 1161                           isame( 6 ) = ns.EQ.n
 1162                           isame( 7 ) = als.EQ.alpha
 1163                           isame( 8 ) = 
lze( as, aa, laa )
 
 1164                           isame( 9 ) = ldas.EQ.lda
 1165                           IF( null )THEN
 1166                              isame( 10 ) = 
lze( bs, bb, lbb )
 
 1167                           ELSE
 1168                              isame( 10 ) = 
lzeres( 
'GE', 
' ', m, n, bs,
 
 1169     $                                      bb, ldb )
 1170                           END IF
 1171                           isame( 11 ) = ldbs.EQ.ldb
 1172
 1173
 1174
 1175
 1176                           same = .true.
 1177                           DO 50 i = 1, nargs
 1178                              same = same.AND.isame( i )
 1179                              IF( .NOT.isame( i ) )
 1180     $                           WRITE( nout, fmt = 9998 )i
 1181   50                      CONTINUE
 1182                           IF( .NOT.same )THEN
 1183                              fatal = .true.
 1184                              GO TO 150
 1185                           END IF
 1186
 1187                           IF( .NOT.null )THEN
 1188                              IF( sname( 4: 5 ).EQ.'MM' )THEN
 1189
 1190
 1191
 1192                                 IF( left )THEN
 1193                                    CALL zmmch( transa, 
'N', m, n, m,
 
 1194     $                                          alpha, a, nmax, b, nmax,
 1195     $                                          zero, c, nmax, ct, g,
 1196     $                                          bb, ldb, eps, err,
 1197     $                                          fatal, nout, .true. )
 1198                                 ELSE
 1199                                    CALL zmmch( 
'N', transa, m, n, n,
 
 1200     $                                          alpha, b, nmax, a, nmax,
 1201     $                                          zero, c, nmax, ct, g,
 1202     $                                          bb, ldb, eps, err,
 1203     $                                          fatal, nout, .true. )
 1204                                 END IF
 1205                              ELSE IF( sname( 4: 5 ).EQ.'SM' )THEN
 1206
 1207
 1208
 1209
 1210                                 DO 70 j = 1, n
 1211                                    DO 60 i = 1, m
 1212                                       c( i, j ) = bb( i + ( j - 1 )*
 1213     $                                             ldb )
 1214                                       bb( i + ( j - 1 )*ldb ) = alpha*
 1215     $                                    b( i, j )
 1216   60                               CONTINUE
 1217   70                            CONTINUE
 1218
 1219                                 IF( left )THEN
 1220                                    CALL zmmch( transa, 
'N', m, n, m,
 
 1221     $                                          one, a, nmax, c, nmax,
 1222     $                                          zero, b, nmax, ct, g,
 1223     $                                          bb, ldb, eps, err,
 1224     $                                          fatal, nout, .false. )
 1225                                 ELSE
 1226                                    CALL zmmch( 
'N', transa, m, n, n,
 
 1227     $                                          one, c, nmax, a, nmax,
 1228     $                                          zero, b, nmax, ct, g,
 1229     $                                          bb, ldb, eps, err,
 1230     $                                          fatal, nout, .false. )
 1231                                 END IF
 1232                              END IF
 1233                              errmax = max( errmax, err )
 1234
 1235
 1236                              IF( fatal )
 1237     $                           GO TO 150
 1238                           END IF
 1239
 1240   80                   CONTINUE
 1241
 1242   90                CONTINUE
 1243
 1244  100             CONTINUE
 1245
 1246  110          CONTINUE
 1247
 1248  120       CONTINUE
 1249
 1250  130    CONTINUE
 1251
 1252  140 CONTINUE
 1253
 1254
 1255
 1256      IF( errmax.LT.thresh )THEN
 1257         WRITE( nout, fmt = 9999 )sname, nc
 1258      ELSE
 1259         WRITE( nout, fmt = 9997 )sname, nc, errmax
 1260      END IF
 1261      GO TO 160
 1262
 1263  150 CONTINUE
 1264      WRITE( nout, fmt = 9996 )sname
 1265      WRITE( nout, fmt = 9995 )nc, sname, side, uplo, transa, diag, m,
 1266     $   n, alpha, lda, ldb
 1267
 1268  160 CONTINUE
 1269      RETURN
 1270
 1271 9999 FORMAT( ' ', a6, ' PASSED THE COMPUTATIONAL TESTS (', i6, ' CALL',
 1272     $      'S)' )
 1273 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', i2, ' WAS CH',
 1274     $      'ANGED INCORRECTLY *******' )
 1275 9997 FORMAT( ' ', a6, ' COMPLETED THE COMPUTATIONAL TESTS (', i6, ' C',
 1276     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', f8.2,
 1277     $      ' - SUSPECT *******' )
 1278 9996 FORMAT( ' ******* ', a6, ' FAILED ON CALL NUMBER:' )
 1279 9995 FORMAT( 1x, i6, ': ', a6, '(', 4( '''', a1, ''',' ), 2( i3, ',' ),
 1280     $      '(', f4.1, ',', f4.1, '), A,', i3, ', B,', i3, ')         ',
 1281     $      '      .' )
 1282 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
 1283     $      '******' )
 1284
 1285
 1286
subroutine ztrmm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
ZTRMM
subroutine ztrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
ZTRSM
logical function lze(ri, rj, lr)
logical function lzeres(type, uplo, m, n, aa, as, lda)
subroutine zmake(type, uplo, diag, m, n, a, nmax, aa, lda, kl, ku, reset, transl)
subroutine zmmch(transa, transb, m, n, kk, alpha, a, lda, b, ldb, beta, c, ldc, ct, g, cc, ldcc, eps, err, fatal, nout, mv)