158
159
160
161
162
163
164 LOGICAL TSTERR
165 INTEGER NMAX, NN, NOUT, NRHS
166 DOUBLE PRECISION THRESH
167
168
169 LOGICAL DOTYPE( * )
170 INTEGER IWORK( * ), NVAL( * )
171 DOUBLE PRECISION RWORK( * )
172 COMPLEX*16 A( * ), AFAC( * ), AINV( * ), B( * ), E( * ),
173 $ WORK( * ), X( * ), XACT( * )
174
175
176
177
178
179 DOUBLE PRECISION ONE, ZERO
180 parameter( one = 1.0d+0, zero = 0.0d+0 )
181 INTEGER NTYPES, NTESTS
182 parameter( ntypes = 11, ntests = 3 )
183 INTEGER NFACT
184 parameter( nfact = 2 )
185
186
187 LOGICAL ZEROT
188 CHARACTER DIST, FACT, TYPE, UPLO, XTYPE
189 CHARACTER*3 MATPATH, PATH
190 INTEGER I, I1, I2, IFACT, IMAT, IN, INFO, IOFF, IUPLO,
191 $ IZERO, J, K, KL, KU, LDA, LWORK, MODE, N,
192 $ NB, NBMIN, NERRS, NFAIL, NIMAT, NRUN, NT
193 DOUBLE PRECISION AINVNM, ANORM, CNDNUM, RCONDC
194
195
196 CHARACTER FACTS( NFACT ), UPLOS( 2 )
197 INTEGER ISEED( 4 ), ISEEDY( 4 )
198 DOUBLE PRECISION RESULT( NTESTS )
199
200
201
202 DOUBLE PRECISION ZLANSY
204
205
209
210
211 LOGICAL LERR, OK
212 CHARACTER*32 SRNAMT
213 INTEGER INFOT, NUNIT
214
215
216 COMMON / infoc / infot, nunit, ok, lerr
217 COMMON / srnamc / srnamt
218
219
220 INTRINSIC max, min
221
222
223 DATA iseedy / 1988, 1989, 1990, 1991 /
224 DATA uplos / 'U', 'L' / , facts / 'F', 'N' /
225
226
227
228
229
230
231
232 path( 1: 1 ) = 'Zomplex precision'
233 path( 2: 3 ) = 'SK'
234
235
236
237 matpath( 1: 1 ) = 'Zomplex precision'
238 matpath( 2: 3 ) = 'SY'
239
240 nrun = 0
241 nfail = 0
242 nerrs = 0
243 DO 10 i = 1, 4
244 iseed( i ) = iseedy( i )
245 10 CONTINUE
246 lwork = max( 2*nmax, nmax*nrhs )
247
248
249
250 IF( tsterr )
251 $
CALL zerrvx( path, nout )
252 infot = 0
253
254
255
256
257 nb = 1
258 nbmin = 2
261
262
263
264 DO 180 in = 1, nn
265 n = nval( in )
266 lda = max( n, 1 )
267 xtype = 'N'
268 nimat = ntypes
269 IF( n.LE.0 )
270 $ nimat = 1
271
272 DO 170 imat = 1, nimat
273
274
275
276 IF( .NOT.dotype( imat ) )
277 $ GO TO 170
278
279
280
281 zerot = imat.GE.3 .AND. imat.LE.6
282 IF( zerot .AND. n.LT.imat-2 )
283 $ GO TO 170
284
285
286
287 DO 160 iuplo = 1, 2
288 uplo = uplos( iuplo )
289
290 IF( imat.NE.ntypes ) THEN
291
292
293
294
295
296
297 CALL zlatb4( matpath, imat, n, n,
TYPE, KL, KU, ANORM,
298 $ MODE, CNDNUM, DIST )
299
300
301
302 srnamt = 'ZLATMS'
303 CALL zlatms( n, n, dist, iseed,
TYPE, RWORK, MODE,
304 $ CNDNUM, ANORM, KL, KU, UPLO, A, LDA,
305 $ WORK, INFO )
306
307
308
309 IF( info.NE.0 ) THEN
310 CALL alaerh( path,
'ZLATMS', info, 0, uplo, n, n,
311 $ -1, -1, -1, imat, nfail, nerrs, nout )
312 GO TO 160
313 END IF
314
315
316
317
318 IF( zerot ) THEN
319 IF( imat.EQ.3 ) THEN
320 izero = 1
321 ELSE IF( imat.EQ.4 ) THEN
322 izero = n
323 ELSE
324 izero = n / 2 + 1
325 END IF
326
327 IF( imat.LT.6 ) THEN
328
329
330
331 IF( iuplo.EQ.1 ) THEN
332 ioff = ( izero-1 )*lda
333 DO 20 i = 1, izero - 1
334 a( ioff+i ) = zero
335 20 CONTINUE
336 ioff = ioff + izero
337 DO 30 i = izero, n
338 a( ioff ) = zero
339 ioff = ioff + lda
340 30 CONTINUE
341 ELSE
342 ioff = izero
343 DO 40 i = 1, izero - 1
344 a( ioff ) = zero
345 ioff = ioff + lda
346 40 CONTINUE
347 ioff = ioff - izero
348 DO 50 i = izero, n
349 a( ioff+i ) = zero
350 50 CONTINUE
351 END IF
352 ELSE
353 IF( iuplo.EQ.1 ) THEN
354
355
356
357 ioff = 0
358 DO 70 j = 1, n
359 i2 = min( j, izero )
360 DO 60 i = 1, i2
361 a( ioff+i ) = zero
362 60 CONTINUE
363 ioff = ioff + lda
364 70 CONTINUE
365 ELSE
366
367
368
369 ioff = 0
370 DO 90 j = 1, n
371 i1 = max( j, izero )
372 DO 80 i = i1, n
373 a( ioff+i ) = zero
374 80 CONTINUE
375 ioff = ioff + lda
376 90 CONTINUE
377 END IF
378 END IF
379 ELSE
380 izero = 0
381 END IF
382 ELSE
383
384
385
386
387 CALL zlatsy( uplo, n, a, lda, iseed )
388 END IF
389
390 DO 150 ifact = 1, nfact
391
392
393
394 fact = facts( ifact )
395
396
397
398
399 IF( zerot ) THEN
400 IF( ifact.EQ.1 )
401 $ GO TO 150
402 rcondc = zero
403
404 ELSE IF( ifact.EQ.1 ) THEN
405
406
407
408 anorm =
zlansy(
'1', uplo, n, a, lda, rwork )
409
410
411
412
413 CALL zlacpy( uplo, n, n, a, lda, afac, lda )
414 CALL zsytrf_rk( uplo, n, afac, lda, e, iwork, ainv,
415 $ lwork, info )
416
417
418
419 CALL zlacpy( uplo, n, n, afac, lda, ainv, lda )
420 lwork = (n+nb+1)*(nb+3)
421
422
423
424
425 CALL zsytri_3( uplo, n, ainv, lda, e, iwork,
426 $ work, lwork, info )
427 ainvnm =
zlansy(
'1', uplo, n, ainv, lda, rwork )
428
429
430
431 IF( anorm.LE.zero .OR. ainvnm.LE.zero ) THEN
432 rcondc = one
433 ELSE
434 rcondc = ( one / anorm ) / ainvnm
435 END IF
436 END IF
437
438
439
440 srnamt = 'ZLARHS'
441 CALL zlarhs( matpath, xtype, uplo,
' ', n, n, kl, ku,
442 $ nrhs, a, lda, xact, lda, b, lda, iseed,
443 $ info )
444 xtype = 'C'
445
446
447
448 IF( ifact.EQ.2 ) THEN
449 CALL zlacpy( uplo, n, n, a, lda, afac, lda )
450 CALL zlacpy(
'Full', n, nrhs, b, lda, x, lda )
451
452
453
454
455 srnamt = 'ZSYSV_RK'
456 CALL zsysv_rk( uplo, n, nrhs, afac, lda, e, iwork,
457 $ x, lda, work, lwork, info )
458
459
460
461
462 k = izero
463 IF( k.GT.0 ) THEN
464 100 CONTINUE
465 IF( iwork( k ).LT.0 ) THEN
466 IF( iwork( k ).NE.-k ) THEN
467 k = -iwork( k )
468 GO TO 100
469 END IF
470 ELSE IF( iwork( k ).NE.k ) THEN
471 k = iwork( k )
472 GO TO 100
473 END IF
474 END IF
475
476
477
478 IF( info.NE.k ) THEN
479 CALL alaerh( path,
'ZSYSV_RK', info, k, uplo,
480 $ n, n, -1, -1, nrhs, imat, nfail,
481 $ nerrs, nout )
482 GO TO 120
483 ELSE IF( info.NE.0 ) THEN
484 GO TO 120
485 END IF
486
487
488
489
490 CALL zsyt01_3( uplo, n, a, lda, afac, lda, e,
491 $ iwork, ainv, lda, rwork,
492 $ result( 1 ) )
493
494
495
496 CALL zlacpy(
'Full', n, nrhs, b, lda, work, lda )
497 CALL zsyt02( uplo, n, nrhs, a, lda, x, lda, work,
498 $ lda, rwork, result( 2 ) )
499
500
501
502
503 CALL zget04( n, nrhs, x, lda, xact, lda, rcondc,
504 $ result( 3 ) )
505 nt = 3
506
507
508
509
510 DO 110 k = 1, nt
511 IF( result( k ).GE.thresh ) THEN
512 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
513 $
CALL aladhd( nout, path )
514 WRITE( nout, fmt = 9999 )'ZSYSV_RK', uplo,
515 $ n, imat, k, result( k )
516 nfail = nfail + 1
517 END IF
518 110 CONTINUE
519 nrun = nrun + nt
520 120 CONTINUE
521 END IF
522
523 150 CONTINUE
524
525 160 CONTINUE
526 170 CONTINUE
527 180 CONTINUE
528
529
530
531 CALL alasvm( path, nout, nfail, nrun, nerrs )
532
533 9999 FORMAT( 1x, a, ', UPLO=''', a1, ''', N =', i5, ', type ', i2,
534 $ ', test ', i2, ', ratio =', g12.5 )
535 RETURN
536
537
538
subroutine alasvm(type, nout, nfail, nrun, nerrs)
ALASVM
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 aladhd(iounit, path)
ALADHD
subroutine alaerh(path, subnam, info, infoe, opts, m, n, kl, ku, n5, imat, nfail, nerrs, nout)
ALAERH
subroutine zsysv_rk(uplo, n, nrhs, a, lda, e, ipiv, b, ldb, work, lwork, info)
ZSYSV_RK computes the solution to system of linear equations A * X = B for SY matrices
subroutine zsytrf_rk(uplo, n, a, lda, e, ipiv, work, lwork, info)
ZSYTRF_RK computes the factorization of a complex symmetric indefinite matrix using the bounded Bunch...
subroutine zsytri_3(uplo, n, a, lda, e, ipiv, work, lwork, info)
ZSYTRI_3
subroutine zlacpy(uplo, m, n, a, lda, b, ldb)
ZLACPY copies all or part of one two-dimensional array to another.
double precision function zlansy(norm, uplo, n, a, lda, work)
ZLANSY returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
subroutine zerrvx(path, nunit)
ZERRVX
subroutine zget04(n, nrhs, x, ldx, xact, ldxact, rcond, resid)
ZGET04
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 zlatsy(uplo, n, x, ldx, iseed)
ZLATSY
subroutine zsyt01_3(uplo, n, a, lda, afac, ldafac, e, ipiv, c, ldc, rwork, resid)
ZSYT01_3
subroutine zsyt02(uplo, n, nrhs, a, lda, x, ldx, b, ldb, rwork, resid)
ZSYT02