147
148
149
150
151
152
153 LOGICAL TSTERR
154 INTEGER NN, NNS, NOUT
155 REAL THRESH
156
157
158 LOGICAL DOTYPE( * )
159 INTEGER NSVAL( * ), NVAL( * )
160 REAL D( * ), RWORK( * )
161 COMPLEX A( * ), B( * ), E( * ), WORK( * ), X( * ),
162 $ XACT( * )
163
164
165
166
167
168 REAL ONE, ZERO
169 parameter( one = 1.0e+0, zero = 0.0e+0 )
170 INTEGER NTYPES
171 parameter( ntypes = 12 )
172 INTEGER NTESTS
173 parameter( ntests = 7 )
174
175
176 LOGICAL ZEROT
177 CHARACTER DIST, TYPE, UPLO
178 CHARACTER*3 PATH
179 INTEGER I, IA, IMAT, IN, INFO, IRHS, IUPLO, IX, IZERO,
180 $ J, K, KL, KU, LDA, MODE, N, NERRS, NFAIL,
181 $ NIMAT, NRHS, NRUN
182 REAL AINVNM, ANORM, COND, DMAX, RCOND, RCONDC
183
184
185 CHARACTER UPLOS( 2 )
186 INTEGER ISEED( 4 ), ISEEDY( 4 )
187 REAL RESULT( NTESTS )
188 COMPLEX Z( 3 )
189
190
191 INTEGER ISAMAX
192 REAL CLANHT, SCASUM, SGET06
194
195
200
201
202 INTRINSIC abs, max, real
203
204
205 LOGICAL LERR, OK
206 CHARACTER*32 SRNAMT
207 INTEGER INFOT, NUNIT
208
209
210 COMMON / infoc / infot, nunit, ok, lerr
211 COMMON / srnamc / srnamt
212
213
214 DATA iseedy / 0, 0, 0, 1 / , uplos / 'U', 'L' /
215
216
217
218 path( 1: 1 ) = 'Complex precision'
219 path( 2: 3 ) = 'PT'
220 nrun = 0
221 nfail = 0
222 nerrs = 0
223 DO 10 i = 1, 4
224 iseed( i ) = iseedy( i )
225 10 CONTINUE
226
227
228
229 IF( tsterr )
230 $
CALL cerrgt( path, nout )
231 infot = 0
232
233 DO 120 in = 1, nn
234
235
236
237 n = nval( in )
238 lda = max( 1, n )
239 nimat = ntypes
240 IF( n.LE.0 )
241 $ nimat = 1
242
243 DO 110 imat = 1, nimat
244
245
246
247 IF( n.GT.0 .AND. .NOT.dotype( imat ) )
248 $ GO TO 110
249
250
251
252 CALL clatb4( path, imat, n, n,
TYPE, KL, KU, ANORM, MODE,
253 $ COND, DIST )
254
255 zerot = imat.GE.8 .AND. imat.LE.10
256 IF( imat.LE.6 ) THEN
257
258
259
260
261 srnamt = 'CLATMS'
262 CALL clatms( n, n, dist, iseed,
TYPE, RWORK, MODE, COND,
263 $ ANORM, KL, KU, 'B', A, 2, WORK, INFO )
264
265
266
267 IF( info.NE.0 ) THEN
268 CALL alaerh( path,
'CLATMS', info, 0,
' ', n, n, kl,
269 $ ku, -1, imat, nfail, nerrs, nout )
270 GO TO 110
271 END IF
272 izero = 0
273
274
275
276 ia = 1
277 DO 20 i = 1, n - 1
278 d( i ) = real( a( ia ) )
279 e( i ) = a( ia+1 )
280 ia = ia + 2
281 20 CONTINUE
282 IF( n.GT.0 )
283 $ d( n ) = real( a( ia ) )
284 ELSE
285
286
287
288
289 IF( .NOT.zerot .OR. .NOT.dotype( 7 ) ) THEN
290
291
292
293 CALL slarnv( 2, iseed, n, d )
294 CALL clarnv( 2, iseed, n-1, e )
295
296
297
298 IF( n.EQ.1 ) THEN
299 d( 1 ) = abs( d( 1 ) )
300 ELSE
301 d( 1 ) = abs( d( 1 ) ) + abs( e( 1 ) )
302 d( n ) = abs( d( n ) ) + abs( e( n-1 ) )
303 DO 30 i = 2, n - 1
304 d( i ) = abs( d( i ) ) + abs( e( i ) ) +
305 $ abs( e( i-1 ) )
306 30 CONTINUE
307 END IF
308
309
310
312 dmax = d( ix )
313 CALL sscal( n, anorm / dmax, d, 1 )
314 CALL csscal( n-1, anorm / dmax, e, 1 )
315
316 ELSE IF( izero.GT.0 ) THEN
317
318
319
320
321 IF( izero.EQ.1 ) THEN
322 d( 1 ) = real( z( 2 ) )
323 IF( n.GT.1 )
324 $ e( 1 ) = z( 3 )
325 ELSE IF( izero.EQ.n ) THEN
326 e( n-1 ) = z( 1 )
327 d( n ) = real( z( 2 ) )
328 ELSE
329 e( izero-1 ) = z( 1 )
330 d( izero ) = real( z( 2 ) )
331 e( izero ) = z( 3 )
332 END IF
333 END IF
334
335
336
337
338 izero = 0
339 IF( imat.EQ.8 ) THEN
340 izero = 1
341 z( 2 ) = d( 1 )
342 d( 1 ) = zero
343 IF( n.GT.1 ) THEN
344 z( 3 ) = e( 1 )
345 e( 1 ) = zero
346 END IF
347 ELSE IF( imat.EQ.9 ) THEN
348 izero = n
349 IF( n.GT.1 ) THEN
350 z( 1 ) = e( n-1 )
351 e( n-1 ) = zero
352 END IF
353 z( 2 ) = d( n )
354 d( n ) = zero
355 ELSE IF( imat.EQ.10 ) THEN
356 izero = ( n+1 ) / 2
357 IF( izero.GT.1 ) THEN
358 z( 1 ) = e( izero-1 )
359 z( 3 ) = e( izero )
360 e( izero-1 ) = zero
361 e( izero ) = zero
362 END IF
363 z( 2 ) = d( izero )
364 d( izero ) = zero
365 END IF
366 END IF
367
368 CALL scopy( n, d, 1, d( n+1 ), 1 )
369 IF( n.GT.1 )
370 $
CALL ccopy( n-1, e, 1, e( n+1 ), 1 )
371
372
373
374
375
376 CALL cpttrf( n, d( n+1 ), e( n+1 ), info )
377
378
379
380 IF( info.NE.izero ) THEN
381 CALL alaerh( path,
'CPTTRF', info, izero,
' ', n, n, -1,
382 $ -1, -1, imat, nfail, nerrs, nout )
383 GO TO 110
384 END IF
385
386 IF( info.GT.0 ) THEN
387 rcondc = zero
388 GO TO 100
389 END IF
390
391 CALL cptt01( n, d, e, d( n+1 ), e( n+1 ), work,
392 $ result( 1 ) )
393
394
395
396 IF( result( 1 ).GE.thresh ) THEN
397 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
398 $
CALL alahd( nout, path )
399 WRITE( nout, fmt = 9999 )n, imat, 1, result( 1 )
400 nfail = nfail + 1
401 END IF
402 nrun = nrun + 1
403
404
405
406
407
408 anorm =
clanht(
'1', n, d, e )
409
410
411
412
413 ainvnm = zero
414 DO 50 i = 1, n
415 DO 40 j = 1, n
416 x( j ) = zero
417 40 CONTINUE
418 x( i ) = one
419 CALL cpttrs(
'Lower', n, 1, d( n+1 ), e( n+1 ), x, lda,
420 $ info )
421 ainvnm = max( ainvnm,
scasum( n, x, 1 ) )
422 50 CONTINUE
423 rcondc = one / max( one, anorm*ainvnm )
424
425 DO 90 irhs = 1, nns
426 nrhs = nsval( irhs )
427
428
429
430 ix = 1
431 DO 60 j = 1, nrhs
432 CALL clarnv( 2, iseed, n, xact( ix ) )
433 ix = ix + lda
434 60 CONTINUE
435
436 DO 80 iuplo = 1, 2
437
438
439
440 uplo = uplos( iuplo )
441
442
443
444 CALL claptm( uplo, n, nrhs, one, d, e, xact, lda,
445 $ zero, b, lda )
446
447
448
449
450 CALL clacpy(
'Full', n, nrhs, b, lda, x, lda )
451 CALL cpttrs( uplo, n, nrhs, d( n+1 ), e( n+1 ), x,
452 $ lda, info )
453
454
455
456 IF( info.NE.0 )
457 $
CALL alaerh( path,
'CPTTRS', info, 0, uplo, n, n,
458 $ -1, -1, nrhs, imat, nfail, nerrs,
459 $ nout )
460
461 CALL clacpy(
'Full', n, nrhs, b, lda, work, lda )
462 CALL cptt02( uplo, n, nrhs, d, e, x, lda, work, lda,
463 $ result( 2 ) )
464
465
466
467
468 CALL cget04( n, nrhs, x, lda, xact, lda, rcondc,
469 $ result( 3 ) )
470
471
472
473
474 srnamt = 'CPTRFS'
475 CALL cptrfs( uplo, n, nrhs, d, e, d( n+1 ), e( n+1 ),
476 $ b, lda, x, lda, rwork, rwork( nrhs+1 ),
477 $ work, rwork( 2*nrhs+1 ), info )
478
479
480
481 IF( info.NE.0 )
482 $
CALL alaerh( path,
'CPTRFS', info, 0, uplo, n, n,
483 $ -1, -1, nrhs, imat, nfail, nerrs,
484 $ nout )
485
486 CALL cget04( n, nrhs, x, lda, xact, lda, rcondc,
487 $ result( 4 ) )
488 CALL cptt05( n, nrhs, d, e, b, lda, x, lda, xact, lda,
489 $ rwork, rwork( nrhs+1 ), result( 5 ) )
490
491
492
493
494 DO 70 k = 2, 6
495 IF( result( k ).GE.thresh ) THEN
496 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
497 $
CALL alahd( nout, path )
498 WRITE( nout, fmt = 9998 )uplo, n, nrhs, imat,
499 $ k, result( k )
500 nfail = nfail + 1
501 END IF
502 70 CONTINUE
503 nrun = nrun + 5
504
505 80 CONTINUE
506 90 CONTINUE
507
508
509
510
511
512 100 CONTINUE
513 srnamt = 'CPTCON'
514 CALL cptcon( n, d( n+1 ), e( n+1 ), anorm, rcond, rwork,
515 $ info )
516
517
518
519 IF( info.NE.0 )
520 $
CALL alaerh( path,
'CPTCON', info, 0,
' ', n, n, -1, -1,
521 $ -1, imat, nfail, nerrs, nout )
522
523 result( 7 ) =
sget06( rcond, rcondc )
524
525
526
527 IF( result( 7 ).GE.thresh ) THEN
528 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
529 $
CALL alahd( nout, path )
530 WRITE( nout, fmt = 9999 )n, imat, 7, result( 7 )
531 nfail = nfail + 1
532 END IF
533 nrun = nrun + 1
534 110 CONTINUE
535 120 CONTINUE
536
537
538
539 CALL alasum( path, nout, nfail, nrun, nerrs )
540
541 9999 FORMAT( ' N =', i5, ', type ', i2, ', test ', i2, ', ratio = ',
542 $ g12.5 )
543 9998 FORMAT( ' UPLO = ''', a1, ''', N =', i5, ', NRHS =', i3,
544 $ ', type ', i2, ', test ', i2, ', ratio = ', g12.5 )
545 RETURN
546
547
548
subroutine alasum(type, nout, nfail, nrun, nerrs)
ALASUM
subroutine alaerh(path, subnam, info, infoe, opts, m, n, kl, ku, n5, imat, nfail, nerrs, nout)
ALAERH
subroutine alahd(iounit, path)
ALAHD
subroutine cerrgt(path, nunit)
CERRGT
subroutine cget04(n, nrhs, x, ldx, xact, ldxact, rcond, resid)
CGET04
subroutine claptm(uplo, n, nrhs, alpha, d, e, x, ldx, beta, b, ldb)
CLAPTM
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 cptt01(n, d, e, df, ef, work, resid)
CPTT01
subroutine cptt02(uplo, n, nrhs, d, e, x, ldx, b, ldb, resid)
CPTT02
subroutine cptt05(n, nrhs, d, e, b, ldb, x, ldx, xact, ldxact, ferr, berr, reslts)
CPTT05
real function scasum(n, cx, incx)
SCASUM
subroutine scopy(n, sx, incx, sy, incy)
SCOPY
subroutine ccopy(n, cx, incx, cy, incy)
CCOPY
integer function isamax(n, sx, incx)
ISAMAX
subroutine clacpy(uplo, m, n, a, lda, b, ldb)
CLACPY copies all or part of one two-dimensional array to another.
real function clanht(norm, n, d, e)
CLANHT returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
subroutine slarnv(idist, iseed, n, x)
SLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine clarnv(idist, iseed, n, x)
CLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine cptcon(n, d, e, anorm, rcond, rwork, info)
CPTCON
subroutine cptrfs(uplo, n, nrhs, d, e, df, ef, b, ldb, x, ldx, ferr, berr, work, rwork, info)
CPTRFS
subroutine cpttrf(n, d, e, info)
CPTTRF
subroutine cpttrs(uplo, n, nrhs, d, e, b, ldb, info)
CPTTRS
subroutine csscal(n, sa, cx, incx)
CSSCAL
subroutine sscal(n, sa, sx, incx)
SSCAL
real function sget06(rcond, rcondc)
SGET06