171
172
173
174
175
176 IMPLICIT NONE
177
178
179 LOGICAL TSTERR
180 INTEGER NMAX, NN, NNB, NNS, NOUT
181 DOUBLE PRECISION THRESH
182
183
184 LOGICAL DOTYPE( * )
185 INTEGER IWORK( * ), NBVAL( * ), NSVAL( * ), NVAL( * )
186 DOUBLE PRECISION RWORK( * )
187 COMPLEX*16 A( * ), AFAC( * ), AINV( * ), B( * ),
188 $ WORK( * ), X( * ), XACT( * )
189
190
191
192
193
194 DOUBLE PRECISION ZERO
195 parameter( zero = 0.0d+0 )
196 COMPLEX*16 CZERO
197 parameter( czero = ( 0.0d+0, 0.0d+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 DOUBLE PRECISION ANORM, CNDNUM
211
212
213 CHARACTER UPLOS( 2 )
214 INTEGER ISEED( 4 ), ISEEDY( 4 )
215 DOUBLE PRECISION 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 path( 1: 1 ) = 'Zomplex precision'
245 path( 2: 3 ) = 'HA'
246
247
248
249 matpath( 1: 1 ) = 'Zomplex precision'
250 matpath( 2: 3 ) = 'HE'
251 nrun = 0
252 nfail = 0
253 nerrs = 0
254 DO 10 i = 1, 4
255 iseed( i ) = iseedy( i )
256 10 CONTINUE
257
258
259
260 IF( tsterr )
261 $
CALL zerrhe( path, nout )
262 infot = 0
263
264
265
266
268
269
270
271 DO 180 in = 1, nn
272 n = nval( in )
273 IF( n .GT. nmax ) THEN
274 nfail = nfail + 1
275 WRITE(nout, 9995) 'M ', n, nmax
276 GO TO 180
277 END IF
278 lda = max( n, 1 )
279 xtype = 'N'
280 nimat = ntypes
281 IF( n.LE.0 )
282 $ nimat = 1
283
284 izero = 0
285 DO 170 imat = 1, nimat
286
287
288
289 IF( .NOT.dotype( imat ) )
290 $ GO TO 170
291
292
293
294 zerot = imat.GE.3 .AND. imat.LE.6
295 IF( zerot .AND. n.LT.imat-2 )
296 $ GO TO 170
297
298
299
300 DO 160 iuplo = 1, 2
301 uplo = uplos( iuplo )
302
303
304
305
306 CALL zlatb4( matpath, imat, n, n,
TYPE, KL, KU,
307 $ ANORM, MODE, CNDNUM, DIST )
308
309
310
311 srnamt = 'ZLATMS'
312 CALL zlatms( n, n, dist, iseed,
TYPE, RWORK, MODE,
313 $ CNDNUM, ANORM, KL, KU, UPLO, A, LDA, WORK,
314 $ INFO )
315
316
317
318 IF( info.NE.0 ) THEN
319 CALL alaerh( path,
'ZLATMS', info, 0, uplo, n, n, -1,
320 $ -1, -1, imat, nfail, nerrs, nout )
321
322
323
324 GO TO 160
325 END IF
326
327
328
329
330 IF( zerot ) THEN
331 IF( imat.EQ.3 ) THEN
332 izero = 1
333 ELSE IF( imat.EQ.4 ) THEN
334 izero = n
335 ELSE
336 izero = n / 2 + 1
337 END IF
338
339 IF( imat.LT.6 ) THEN
340
341
342
343 IF( iuplo.EQ.1 ) THEN
344 ioff = ( izero-1 )*lda
345 DO 20 i = 1, izero - 1
346 a( ioff+i ) = czero
347 20 CONTINUE
348 ioff = ioff + izero
349 DO 30 i = izero, n
350 a( ioff ) = czero
351 ioff = ioff + lda
352 30 CONTINUE
353 ELSE
354 ioff = izero
355 DO 40 i = 1, izero - 1
356 a( ioff ) = czero
357 ioff = ioff + lda
358 40 CONTINUE
359 ioff = ioff - izero
360 DO 50 i = izero, n
361 a( ioff+i ) = czero
362 50 CONTINUE
363 END IF
364 ELSE
365 IF( iuplo.EQ.1 ) THEN
366
367
368
369 ioff = 0
370 DO 70 j = 1, n
371 i2 = min( j, izero )
372 DO 60 i = 1, i2
373 a( ioff+i ) = czero
374 60 CONTINUE
375 ioff = ioff + lda
376 70 CONTINUE
377 izero = 1
378 ELSE
379
380
381
382 ioff = 0
383 DO 90 j = 1, n
384 i1 = max( j, izero )
385 DO 80 i = i1, n
386 a( ioff+i ) = czero
387 80 CONTINUE
388 ioff = ioff + lda
389 90 CONTINUE
390 END IF
391 END IF
392 ELSE
393 izero = 0
394 END IF
395
396
397
398
399
400
401 CALL zlaipd( n, a, lda+1, 0 )
402
403
404
405 DO 150 inb = 1, nnb
406
407
408
409
410 nb = nbval( inb )
412
413
414
415
416
417 CALL zlacpy( uplo, n, n, a, lda, afac, lda )
418
419
420
421
422
423
424 lwork = max( 1, ( nb+1 )*lda )
425 srnamt = 'ZHETRF_AA'
426 CALL zhetrf_aa( uplo, n, afac, lda, iwork, ainv,
427 $ lwork, info )
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446 k = 0
447
448
449
450
451 IF( info.NE.k ) THEN
452 CALL alaerh( path,
'ZHETRF_AA', info, k, uplo,
453 $ n, n, -1, -1, nb, imat, nfail, nerrs,
454 $ nout )
455 END IF
456
457
458
459
460 CALL zhet01_aa( uplo, n, a, lda, afac, lda, iwork,
461 $ ainv, lda, rwork, result( 1 ) )
462 nt = 1
463
464
465
466
467
468 DO 110 k = 1, nt
469 IF( result( k ).GE.thresh ) THEN
470 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
471 $
CALL alahd( nout, path )
472 WRITE( nout, fmt = 9999 )uplo, n, nb, imat, k,
473 $ result( k )
474 nfail = nfail + 1
475 END IF
476 110 CONTINUE
477 nrun = nrun + nt
478
479
480
481 IF( info.NE.0 ) THEN
482 GO TO 140
483 END IF
484
485
486
487 DO 130 irhs = 1, nns
488 nrhs = nsval( irhs )
489
490
491
492
493
494
495
496 srnamt = 'ZLARHS'
497 CALL zlarhs( matpath, xtype, uplo,
' ', n, n,
498 $ kl, ku, nrhs, a, lda, xact, lda,
499 $ b, lda, iseed, info )
500 CALL zlacpy(
'Full', n, nrhs, b, lda, x, lda )
501
502 srnamt = 'ZHETRS_AA'
503 lwork = max( 1, 3*n-2 )
504 CALL zhetrs_aa( uplo, n, nrhs, afac, lda, iwork,
505 $ x, lda, work, lwork, info )
506
507
508
509 IF( info.NE.0 ) THEN
510 IF( izero.EQ.0 ) THEN
511 CALL alaerh( path,
'ZHETRS_AA', info, 0,
512 $ uplo, n, n, -1, -1, nrhs, imat,
513 $ nfail, nerrs, nout )
514 END IF
515 ELSE
516
517 CALL zlacpy(
'Full', n, nrhs, b, lda, work, lda
518 $ )
519
520
521
522 CALL zpot02( 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
558
559 9995 FORMAT( ' Invalid input value: ', a4, '=', i6, '; must be <=',
560 $ i6 )
561 RETURN
562
563
564
subroutine alasum(type, nout, nfail, nrun, nerrs)
ALASUM
subroutine xlaenv(ispec, nvalue)
XLAENV
subroutine zlarhs(path, xtype, uplo, trans, m, n, kl, ku, nrhs, a, lda, x, ldx, b, ldb, iseed, info)
ZLARHS
subroutine alaerh(path, subnam, info, infoe, opts, m, n, kl, ku, n5, imat, nfail, nerrs, nout)
ALAERH
subroutine alahd(iounit, path)
ALAHD
subroutine zhetrf_aa(uplo, n, a, lda, ipiv, work, lwork, info)
ZHETRF_AA
subroutine zhetrs_aa(uplo, n, nrhs, a, lda, ipiv, b, ldb, work, lwork, info)
ZHETRS_AA
subroutine zlacpy(uplo, m, n, a, lda, b, ldb)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zerrhe(path, nunit)
ZERRHE
subroutine zhet01_aa(uplo, n, a, lda, afac, ldafac, ipiv, c, ldc, rwork, resid)
ZHET01_AA
subroutine zlaipd(n, a, inda, vinda)
ZLAIPD
subroutine zlatb4(path, imat, m, n, type, kl, ku, anorm, mode, cndnum, dist)
ZLATB4
subroutine zlatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, work, info)
ZLATMS
subroutine zpot02(uplo, n, nrhs, a, lda, x, ldx, b, ldb, rwork, resid)
ZPOT02