1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070 REAL ZERO, ONE
1071 parameter( zero = 0.0, one = 1.0 )
1072
1073 REAL EPS, THRESH
1074 INTEGER NALF, NIDIM, NMAX, NOUT, NTRA, IORDER
1075 LOGICAL FATAL, REWI, TRACE
1076 CHARACTER*12 SNAME
1077
1078 REAL A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
1079 $ AS( NMAX*NMAX ), B( NMAX, NMAX ),
1080 $ BB( NMAX*NMAX ), BS( NMAX*NMAX ),
1081 $ C( NMAX, NMAX ), CT( NMAX ), G( NMAX )
1082 INTEGER IDIM( NIDIM )
1083
1084 REAL ALPHA, ALS, ERR, ERRMAX
1085 INTEGER I, IA, ICD, ICS, ICT, ICU, IM, IN, J, LAA, LBB,
1086 $ LDA, LDAS, LDB, LDBS, M, MS, N, NA, NARGS, NC,
1087 $ NS
1088 LOGICAL LEFT, NULL, RESET, SAME
1089 CHARACTER*1 DIAG, DIAGS, SIDE, SIDES, TRANAS, TRANSA, UPLO,
1090 $ UPLOS
1091 CHARACTER*2 ICHD, ICHS, ICHU
1092 CHARACTER*3 ICHT
1093
1094 LOGICAL ISAME( 13 )
1095
1096 LOGICAL LSE, LSERES
1098
1100
1101 INTRINSIC max
1102
1103 INTEGER INFOT, NOUTC
1104 LOGICAL OK
1105
1106 COMMON /infoc/infot, noutc, ok
1107
1108 DATA ichu/'UL'/, icht/'NTC'/, ichd/'UN'/, ichs/'LR'/
1109
1110
1111 nargs = 11
1112 nc = 0
1113 reset = .true.
1114 errmax = zero
1115
1116 DO 20 j = 1, nmax
1117 DO 10 i = 1, nmax
1118 c( i, j ) = zero
1119 10 CONTINUE
1120 20 CONTINUE
1121
1122 DO 140 im = 1, nidim
1123 m = idim( im )
1124
1125 DO 130 in = 1, nidim
1126 n = idim( in )
1127
1128 ldb = m
1129 IF( ldb.LT.nmax )
1130 $ ldb = ldb + 1
1131
1132 IF( ldb.GT.nmax )
1133 $ GO TO 130
1134 lbb = ldb*n
1135 null = m.LE.0.OR.n.LE.0
1136
1137 DO 120 ics = 1, 2
1138 side = ichs( ics: ics )
1139 left = side.EQ.'L'
1140 IF( left )THEN
1141 na = m
1142 ELSE
1143 na = n
1144 END IF
1145
1146 lda = na
1147 IF( lda.LT.nmax )
1148 $ lda = lda + 1
1149
1150 IF( lda.GT.nmax )
1151 $ GO TO 130
1152 laa = lda*na
1153
1154 DO 110 icu = 1, 2
1155 uplo = ichu( icu: icu )
1156
1157 DO 100 ict = 1, 3
1158 transa = icht( ict: ict )
1159
1160 DO 90 icd = 1, 2
1161 diag = ichd( icd: icd )
1162
1163 DO 80 ia = 1, nalf
1164 alpha = alf( ia )
1165
1166
1167
1168 CALL smake(
'TR', uplo, diag, na, na, a,
1169 $ nmax, aa, lda, reset, zero )
1170
1171
1172
1173 CALL smake(
'GE',
' ',
' ', m, n, b, nmax,
1174 $ bb, ldb, reset, zero )
1175
1176 nc = nc + 1
1177
1178
1179
1180
1181 sides = side
1182 uplos = uplo
1183 tranas = transa
1184 diags = diag
1185 ms = m
1186 ns = n
1187 als = alpha
1188 DO 30 i = 1, laa
1189 as( i ) = aa( i )
1190 30 CONTINUE
1191 ldas = lda
1192 DO 40 i = 1, lbb
1193 bs( i ) = bb( i )
1194 40 CONTINUE
1195 ldbs = ldb
1196
1197
1198
1199 IF( sname( 10: 11 ).EQ.'mm' )THEN
1200 IF( trace )
1201 $
CALL sprcn3( ntra, nc, sname, iorder,
1202 $ side, uplo, transa, diag, m, n, alpha,
1203 $ lda, ldb)
1204 IF( rewi )
1205 $ rewind ntra
1206 CALL cstrmm( iorder, side, uplo, transa,
1207 $ diag, m, n, alpha, aa, lda,
1208 $ bb, ldb )
1209 ELSE IF( sname( 10: 11 ).EQ.'sm' )THEN
1210 IF( trace )
1211 $
CALL sprcn3( ntra, nc, sname, iorder,
1212 $ side, uplo, transa, diag, m, n, alpha,
1213 $ lda, ldb)
1214 IF( rewi )
1215 $ rewind ntra
1216 CALL cstrsm( iorder, side, uplo, transa,
1217 $ diag, m, n, alpha, aa, lda,
1218 $ bb, ldb )
1219 END IF
1220
1221
1222
1223 IF( .NOT.ok )THEN
1224 WRITE( nout, fmt = 9994 )
1225 fatal = .true.
1226 GO TO 150
1227 END IF
1228
1229
1230
1231 isame( 1 ) = sides.EQ.side
1232 isame( 2 ) = uplos.EQ.uplo
1233 isame( 3 ) = tranas.EQ.transa
1234 isame( 4 ) = diags.EQ.diag
1235 isame( 5 ) = ms.EQ.m
1236 isame( 6 ) = ns.EQ.n
1237 isame( 7 ) = als.EQ.alpha
1238 isame( 8 ) =
lse( as, aa, laa )
1239 isame( 9 ) = ldas.EQ.lda
1240 IF( null )THEN
1241 isame( 10 ) =
lse( bs, bb, lbb )
1242 ELSE
1243 isame( 10 ) =
lseres(
'GE',
' ', m, n, bs,
1244 $ bb, ldb )
1245 END IF
1246 isame( 11 ) = ldbs.EQ.ldb
1247
1248
1249
1250
1251 same = .true.
1252 DO 50 i = 1, nargs
1253 same = same.AND.isame( i )
1254 IF( .NOT.isame( i ) )
1255 $ WRITE( nout, fmt = 9998 )i+1
1256 50 CONTINUE
1257 IF( .NOT.same )THEN
1258 fatal = .true.
1259 GO TO 150
1260 END IF
1261
1262 IF( .NOT.null )THEN
1263 IF( sname( 10: 11 ).EQ.'mm' )THEN
1264
1265
1266
1267 IF( left )THEN
1268 CALL smmch( transa,
'N', m, n, m,
1269 $ alpha, a, nmax, b, nmax,
1270 $ zero, c, nmax, ct, g,
1271 $ bb, ldb, eps, err,
1272 $ fatal, nout, .true. )
1273 ELSE
1274 CALL smmch(
'N', transa, m, n, n,
1275 $ alpha, b, nmax, a, nmax,
1276 $ zero, c, nmax, ct, g,
1277 $ bb, ldb, eps, err,
1278 $ fatal, nout, .true. )
1279 END IF
1280 ELSE IF( sname( 10: 11 ).EQ.'sm' )THEN
1281
1282
1283
1284
1285 DO 70 j = 1, n
1286 DO 60 i = 1, m
1287 c( i, j ) = bb( i + ( j - 1 )*
1288 $ ldb )
1289 bb( i + ( j - 1 )*ldb ) = alpha*
1290 $ b( i, j )
1291 60 CONTINUE
1292 70 CONTINUE
1293
1294 IF( left )THEN
1295 CALL smmch( transa,
'N', m, n, m,
1296 $ one, a, nmax, c, nmax,
1297 $ zero, b, nmax, ct, g,
1298 $ bb, ldb, eps, err,
1299 $ fatal, nout, .false. )
1300 ELSE
1301 CALL smmch(
'N', transa, m, n, n,
1302 $ one, c, nmax, a, nmax,
1303 $ zero, b, nmax, ct, g,
1304 $ bb, ldb, eps, err,
1305 $ fatal, nout, .false. )
1306 END IF
1307 END IF
1308 errmax = max( errmax, err )
1309
1310
1311 IF( fatal )
1312 $ GO TO 150
1313 END IF
1314
1315 80 CONTINUE
1316
1317 90 CONTINUE
1318
1319 100 CONTINUE
1320
1321 110 CONTINUE
1322
1323 120 CONTINUE
1324
1325 130 CONTINUE
1326
1327 140 CONTINUE
1328
1329
1330
1331 IF( errmax.LT.thresh )THEN
1332 IF ( iorder.EQ.0) WRITE( nout, fmt = 10000 )sname, nc
1333 IF ( iorder.EQ.1) WRITE( nout, fmt = 10001 )sname, nc
1334 ELSE
1335 IF ( iorder.EQ.0) WRITE( nout, fmt = 10002 )sname, nc, errmax
1336 IF ( iorder.EQ.1) WRITE( nout, fmt = 10003 )sname, nc, errmax
1337 END IF
1338 GO TO 160
1339
1340 150 CONTINUE
1341 WRITE( nout, fmt = 9996 )sname
1342 IF( trace )
1343 $
CALL sprcn3( ntra, nc, sname, iorder, side, uplo, transa, diag,
1344 $ m, n, alpha, lda, ldb)
1345
1346 160 CONTINUE
1347 RETURN
1348
134910003 FORMAT( ' ', a12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
1350 $ 'TESTS (', i6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
1351 $ 'RATIO ', f8.2, ' - SUSPECT *******' )
135210002 FORMAT( ' ', a12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
1353 $ 'TESTS (', i6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
1354 $ 'RATIO ', f8.2, ' - SUSPECT *******' )
135510001 FORMAT( ' ', a12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
1356 $ ' (', i6, ' CALL', 'S)' )
135710000 FORMAT( ' ', a12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
1358 $ ' (', i6, ' CALL', 'S)' )
1359 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', i2, ' WAS CH',
1360 $ 'ANGED INCORRECTLY *******' )
1361 9996 FORMAT( ' ******* ', a12,' FAILED ON CALL NUMBER:' )
1362 9995 FORMAT( 1x, i6, ': ', a12,'(', 4( '''', a1, ''',' ), 2( i3, ',' ),
1363 $ f4.1, ', A,', i3, ', B,', i3, ') .' )
1364 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
1365 $ '******' )
1366
1367
1368
subroutine sprcn3(nout, nc, sname, iorder, side, uplo, transa, diag, m, n, alpha, lda, ldb)
logical function lseres(type, uplo, m, n, aa, as, lda)
subroutine smake(type, uplo, diag, m, n, a, nmax, aa, lda, kl, ku, reset, transl)
logical function lse(ri, rj, lr)
subroutine smmch(transa, transb, m, n, kk, alpha, a, lda, b, ldb, beta, c, ldc, ct, g, cc, ldcc, eps, err, fatal, nout, mv)