171
172
173
174
175
176 IMPLICIT NONE
177
178
179 LOGICAL TSTERR
180 INTEGER NMAX, NN, NNB, NNS, NOUT
181 REAL THRESH
182
183
184 LOGICAL DOTYPE( * )
185 INTEGER IWORK( * ), NBVAL( * ), NSVAL( * ), NVAL( * )
186 REAL RWORK( * )
187 COMPLEX A( * ), AFAC( * ), AINV( * ), B( * ),
188 $ WORK( * ), X( * ), XACT( * )
189
190
191
192
193
194 REAL ZERO
195 parameter( zero = 0.0e+0 )
196 COMPLEX CZERO
197 parameter( czero = ( 0.0e+0, 0.0e+0 ) )
198 INTEGER NTYPES
199 parameter( ntypes = 10 )
200 INTEGER NTESTS
201 parameter( ntests = 9 )
202
203
204 LOGICAL ZEROT
205 CHARACTER DIST, TYPE, UPLO, XTYPE
206 CHARACTER*3 PATH, MATPATH
207 INTEGER I, I1, I2, IMAT, IN, INB, INFO, IOFF, IRHS,
208 $ IUPLO, IZERO, J, K, KL, KU, LDA, LWORK, MODE,
209 $ N, NB, NERRS, NFAIL, NIMAT, NRHS, NRUN, NT
210 REAL ANORM, CNDNUM
211
212
213 CHARACTER UPLOS( 2 )
214 INTEGER ISEED( 4 ), ISEEDY( 4 )
215 REAL RESULT( NTESTS )
216
217
221
222
223 INTRINSIC max, min
224
225
226 LOGICAL LERR, OK
227 CHARACTER*32 SRNAMT
228 INTEGER INFOT, NUNIT
229
230
231 COMMON / infoc / infot, nunit, ok, lerr
232 COMMON / srnamc / srnamt
233
234
235 DATA iseedy / 1988, 1989, 1990, 1991 /
236 DATA uplos / 'U', 'L' /
237
238
239
240
241
242
243
244
245 path( 1: 1 ) = 'Complex precision'
246 path( 2: 3 ) = 'HA'
247
248
249
250 matpath( 1: 1 ) = 'Complex precision'
251 matpath( 2: 3 ) = 'HE'
252 nrun = 0
253 nfail = 0
254 nerrs = 0
255 DO 10 i = 1, 4
256 iseed( i ) = iseedy( i )
257 10 CONTINUE
258
259
260
261 IF( tsterr )
262 $
CALL cerrhe( path, nout )
263 infot = 0
264
265
266
267
269
270
271
272 DO 180 in = 1, nn
273 n = nval( in )
274 IF( n .GT. nmax ) THEN
275 nfail = nfail + 1
276 WRITE(nout, 9995) 'M ', n, nmax
277 GO TO 180
278 END IF
279 lda = max( n, 1 )
280 xtype = 'N'
281 nimat = ntypes
282 IF( n.LE.0 )
283 $ nimat = 1
284
285 izero = 0
286 DO 170 imat = 1, nimat
287
288
289
290 IF( .NOT.dotype( imat ) )
291 $ GO TO 170
292
293
294
295 zerot = imat.GE.3 .AND. imat.LE.6
296 IF( zerot .AND. n.LT.imat-2 )
297 $ GO TO 170
298
299
300
301 DO 160 iuplo = 1, 2
302 uplo = uplos( iuplo )
303
304
305
306
307 CALL clatb4( matpath, imat, n, n,
TYPE, KL, KU,
308 $ ANORM, MODE, CNDNUM, DIST )
309
310
311
312 srnamt = 'CLATMS'
313 CALL clatms( n, n, dist, iseed,
TYPE, RWORK, MODE,
314 $ CNDNUM, ANORM, KL, KU, UPLO, A, LDA, WORK,
315 $ INFO )
316
317
318
319 IF( info.NE.0 ) THEN
320 CALL alaerh( path,
'CLATMS', info, 0, uplo, n, n, -1,
321 $ -1, -1, imat, nfail, nerrs, nout )
322
323
324
325 GO TO 160
326 END IF
327
328
329
330
331 IF( zerot ) THEN
332 IF( imat.EQ.3 ) THEN
333 izero = 1
334 ELSE IF( imat.EQ.4 ) THEN
335 izero = n
336 ELSE
337 izero = n / 2 + 1
338 END IF
339
340 IF( imat.LT.6 ) THEN
341
342
343
344 IF( iuplo.EQ.1 ) THEN
345 ioff = ( izero-1 )*lda
346 DO 20 i = 1, izero - 1
347 a( ioff+i ) = czero
348 20 CONTINUE
349 ioff = ioff + izero
350 DO 30 i = izero, n
351 a( ioff ) = czero
352 ioff = ioff + lda
353 30 CONTINUE
354 ELSE
355 ioff = izero
356 DO 40 i = 1, izero - 1
357 a( ioff ) = czero
358 ioff = ioff + lda
359 40 CONTINUE
360 ioff = ioff - izero
361 DO 50 i = izero, n
362 a( ioff+i ) = czero
363 50 CONTINUE
364 END IF
365 ELSE
366 IF( iuplo.EQ.1 ) THEN
367
368
369
370 ioff = 0
371 DO 70 j = 1, n
372 i2 = min( j, izero )
373 DO 60 i = 1, i2
374 a( ioff+i ) = czero
375 60 CONTINUE
376 ioff = ioff + lda
377 70 CONTINUE
378 izero = 1
379 ELSE
380
381
382
383 ioff = 0
384 DO 90 j = 1, n
385 i1 = max( j, izero )
386 DO 80 i = i1, n
387 a( ioff+i ) = czero
388 80 CONTINUE
389 ioff = ioff + lda
390 90 CONTINUE
391 END IF
392 END IF
393 ELSE
394 izero = 0
395 END IF
396
397
398
399
400
401
402 CALL claipd( n, a, lda+1, 0 )
403
404
405
406 DO 150 inb = 1, nnb
407
408
409
410
411 nb = nbval( inb )
413
414
415
416
417
418 CALL clacpy( uplo, n, n, a, lda, afac, lda )
419
420
421
422
423
424
425 lwork = max( 1, ( nb+1 )*lda )
426 srnamt = 'CHETRF_AA'
427 CALL chetrf_aa( uplo, n, afac, lda, iwork, ainv,
428 $ lwork, info )
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447 k = 0
448
449
450
451
452 IF( info.NE.k ) THEN
453 CALL alaerh( path,
'CHETRF_AA', info, k, uplo,
454 $ n, n, -1, -1, nb, imat, nfail, nerrs,
455 $ nout )
456 END IF
457
458
459
460
461 CALL chet01_aa( uplo, n, a, lda, afac, lda, iwork,
462 $ ainv, lda, rwork, result( 1 ) )
463 nt = 1
464
465
466
467
468
469 DO 110 k = 1, nt
470 IF( result( k ).GE.thresh ) THEN
471 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
472 $
CALL alahd( nout, path )
473 WRITE( nout, fmt = 9999 )uplo, n, nb, imat, k,
474 $ result( k )
475 nfail = nfail + 1
476 END IF
477 110 CONTINUE
478 nrun = nrun + nt
479
480
481
482 IF( info.NE.0 ) THEN
483 GO TO 140
484 END IF
485
486
487
488 DO 130 irhs = 1, nns
489 nrhs = nsval( irhs )
490
491
492
493
494
495
496
497 srnamt = 'CLARHS'
498 CALL clarhs( matpath, xtype, uplo,
' ', n, n,
499 $ kl, ku, nrhs, a, lda, xact, lda,
500 $ b, lda, iseed, info )
501 CALL clacpy(
'Full', n, nrhs, b, lda, x, lda )
502
503 srnamt = 'CHETRS_AA'
504 lwork = max( 1, 3*n-2 )
505 CALL chetrs_aa( uplo, n, nrhs, afac, lda, iwork,
506 $ x, lda, work, lwork, info )
507
508
509
510 IF( info.NE.0 ) THEN
511 IF( izero.EQ.0 ) THEN
512 CALL alaerh( path,
'CHETRS_AA', info, 0,
513 $ uplo, n, n, -1, -1, nrhs, imat,
514 $ nfail, nerrs, nout )
515 END IF
516 ELSE
517 CALL clacpy(
'Full', n, nrhs, b, lda, work, lda
518 $ )
519
520
521
522 CALL cpot02( uplo, n, nrhs, a, lda, x, lda,
523 $ work, lda, rwork, result( 2 ) )
524
525
526
527
528 DO 120 k = 2, 2
529 IF( result( k ).GE.thresh ) THEN
530 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
531 $
CALL alahd( nout, path )
532 WRITE( nout, fmt = 9998 )uplo, n, nrhs,
533 $ imat, k, result( k )
534 nfail = nfail + 1
535 END IF
536 120 CONTINUE
537 END IF
538 nrun = nrun + 1
539
540
541
542 130 CONTINUE
543 140 CONTINUE
544 150 CONTINUE
545 160 CONTINUE
546 170 CONTINUE
547 180 CONTINUE
548
549
550
551 CALL alasum( path, nout, nfail, nrun, nerrs )
552
553 9999 FORMAT( ' UPLO = ''', a1, ''', N =', i5, ', NB =', i4, ', type ',
554 $ i2, ', test ', i2, ', ratio =', g12.5 )
555 9998 FORMAT( ' UPLO = ''', a1, ''', N =', i5, ', NRHS=', i3, ', type ',
556 $ i2, ', test(', i2, ') =', g12.5 )
557 9995 FORMAT( ' Invalid input value: ', a4, '=', i6, '; must be <=',
558 $ i6 )
559 RETURN
560
561
562
subroutine alasum(type, nout, nfail, nrun, nerrs)
ALASUM
subroutine clarhs(path, xtype, uplo, trans, m, n, kl, ku, nrhs, a, lda, x, ldx, b, ldb, iseed, info)
CLARHS
subroutine xlaenv(ispec, nvalue)
XLAENV
subroutine alaerh(path, subnam, info, infoe, opts, m, n, kl, ku, n5, imat, nfail, nerrs, nout)
ALAERH
subroutine alahd(iounit, path)
ALAHD
subroutine cerrhe(path, nunit)
CERRHE
subroutine chet01_aa(uplo, n, a, lda, afac, ldafac, ipiv, c, ldc, rwork, resid)
CHET01_AA
subroutine claipd(n, a, inda, vinda)
CLAIPD
subroutine clatb4(path, imat, m, n, type, kl, ku, anorm, mode, cndnum, dist)
CLATB4
subroutine clatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, work, info)
CLATMS
subroutine cpot02(uplo, n, nrhs, a, lda, x, ldx, b, ldb, rwork, resid)
CPOT02
subroutine chetrf_aa(uplo, n, a, lda, ipiv, work, lwork, info)
CHETRF_AA
subroutine chetrs_aa(uplo, n, nrhs, a, lda, ipiv, b, ldb, work, lwork, info)
CHETRS_AA
subroutine clacpy(uplo, m, n, a, lda, b, ldb)
CLACPY copies all or part of one two-dimensional array to another.