153
154
155
156
157
158
159 LOGICAL TSTERR
160 INTEGER NMAX, NN, NOUT, NRHS
161 DOUBLE PRECISION THRESH
162
163
164 LOGICAL DOTYPE( * )
165 INTEGER IWORK( * ), NVAL( * )
166 DOUBLE PRECISION RWORK( * )
167 COMPLEX*16 A( * ), AFAC( * ), AINV( * ), B( * ),
168 $ WORK( * ), X( * ), XACT( * )
169
170
171
172
173
174 DOUBLE PRECISION ONE, ZERO
175 parameter( one = 1.0d+0, zero = 0.0d+0 )
176 INTEGER NTYPES, NTESTS
177 parameter( ntypes = 10, ntests = 3 )
178 INTEGER NFACT
179 parameter( nfact = 2 )
180
181
182 LOGICAL ZEROT
183 CHARACTER DIST, FACT, TYPE, UPLO, XTYPE
184 CHARACTER*3 MATPATH, PATH
185 INTEGER I, I1, I2, IFACT, IMAT, IN, INFO, IOFF, IUPLO,
186 $ IZERO, J, K, KL, KU, LDA, LWORK, MODE, N,
187 $ NB, NBMIN, NERRS, NFAIL, NIMAT, NRUN, NT
188 DOUBLE PRECISION ANORM, CNDNUM
189
190
191 CHARACTER FACTS( NFACT ), UPLOS( 2 )
192 INTEGER ISEED( 4 ), ISEEDY( 4 )
193 DOUBLE PRECISION RESULT( NTESTS )
194
195
196 DOUBLE PRECISION DGET06, ZLANHE
198
199
204
205
206 LOGICAL LERR, OK
207 CHARACTER*32 SRNAMT
208 INTEGER INFOT, NUNIT
209
210
211 COMMON / infoc / infot, nunit, ok, lerr
212 COMMON / srnamc / srnamt
213
214
215 INTRINSIC dcmplx, max, min
216
217
218 DATA iseedy / 1988, 1989, 1990, 1991 /
219 DATA uplos / 'U', 'L' / , facts / 'F', 'N' /
220
221
222
223
224
225
226
227 path( 1: 1 ) = 'Zomplex precision'
228 path( 2: 3 ) = 'HA'
229
230
231
232 matpath( 1: 1 ) = 'Zomplex precision'
233 matpath( 2: 3 ) = 'HE'
234
235 nrun = 0
236 nfail = 0
237 nerrs = 0
238 DO 10 i = 1, 4
239 iseed( i ) = iseedy( i )
240 10 CONTINUE
241
242
243
244 IF( tsterr )
245 $
CALL zerrvx( path, nout )
246 infot = 0
247
248
249
250 nb = 1
251 nbmin = 2
254
255
256
257 DO 180 in = 1, nn
258 n = nval( in )
259 lwork = max( 3*n-2, n*(1+nb) )
260 lwork = max( lwork, 1 )
261 lda = max( n, 1 )
262 xtype = 'N'
263 nimat = ntypes
264 IF( n.LE.0 )
265 $ nimat = 1
266
267 DO 170 imat = 1, nimat
268
269
270
271 IF( .NOT.dotype( imat ) )
272 $ GO TO 170
273
274
275
276 zerot = imat.GE.3 .AND. imat.LE.6
277 IF( zerot .AND. n.LT.imat-2 )
278 $ GO TO 170
279
280
281
282 DO 160 iuplo = 1, 2
283 uplo = uplos( iuplo )
284
285
286
287
288
289
290 CALL zlatb4( matpath, imat, n, n,
TYPE, KL, KU, ANORM,
291 $ MODE, CNDNUM, DIST )
292
293 srnamt = 'ZLATMS'
294 CALL zlatms( n, n, dist, iseed,
TYPE, RWORK, MODE,
295 $ CNDNUM, ANORM, KL, KU, UPLO, A, LDA, WORK,
296 $ INFO )
297
298
299
300 IF( info.NE.0 ) THEN
301 CALL alaerh( path,
'ZLATMS', info, 0, uplo, n, n, -1,
302 $ -1, -1, imat, nfail, nerrs, nout )
303 GO TO 160
304 END IF
305
306
307
308
309 IF( zerot ) THEN
310 IF( imat.EQ.3 ) THEN
311 izero = 1
312 ELSE IF( imat.EQ.4 ) THEN
313 izero = n
314 ELSE
315 izero = n / 2 + 1
316 END IF
317
318 IF( imat.LT.6 ) THEN
319
320
321
322 IF( iuplo.EQ.1 ) THEN
323 ioff = ( izero-1 )*lda
324 DO 20 i = 1, izero - 1
325 a( ioff+i ) = zero
326 20 CONTINUE
327 ioff = ioff + izero
328 DO 30 i = izero, n
329 a( ioff ) = zero
330 ioff = ioff + lda
331 30 CONTINUE
332 ELSE
333 ioff = izero
334 DO 40 i = 1, izero - 1
335 a( ioff ) = zero
336 ioff = ioff + lda
337 40 CONTINUE
338 ioff = ioff - izero
339 DO 50 i = izero, n
340 a( ioff+i ) = zero
341 50 CONTINUE
342 END IF
343 ELSE
344 ioff = 0
345 IF( iuplo.EQ.1 ) THEN
346
347
348
349 DO 70 j = 1, n
350 i2 = min( j, izero )
351 DO 60 i = 1, i2
352 a( ioff+i ) = zero
353 60 CONTINUE
354 ioff = ioff + lda
355 70 CONTINUE
356 izero = 1
357 ELSE
358
359
360
361 DO 90 j = 1, n
362 i1 = max( j, izero )
363 DO 80 i = i1, n
364 a( ioff+i ) = zero
365 80 CONTINUE
366 ioff = ioff + lda
367 90 CONTINUE
368 END IF
369 END IF
370 ELSE
371 izero = 0
372 END IF
373
374
375
376 CALL zlaipd( n, a, lda+1, 0 )
377
378 DO 150 ifact = 1, nfact
379
380
381
382 fact = facts( ifact )
383
384
385
386 srnamt = 'ZLARHS'
387 CALL zlarhs( matpath, xtype, uplo,
' ', n, n, kl, ku,
388 $ nrhs, a, lda, xact, lda, b, lda, iseed,
389 $ info )
390 xtype = 'C'
391
392
393
394 IF( ifact.EQ.2 ) THEN
395 CALL zlacpy( uplo, n, n, a, lda, afac, lda )
396 CALL zlacpy(
'Full', n, nrhs, b, lda, x, lda )
397
398
399
400 srnamt = 'ZHESV_AA '
401 CALL zhesv_aa( uplo, n, nrhs, afac, lda, iwork,
402 $ x, lda, work, lwork, info )
403
404
405
406
407 IF( izero.GT.0 ) THEN
408 j = 1
409 k = izero
410 100 CONTINUE
411 IF( j.EQ.k ) THEN
412 k = iwork( j )
413 ELSE IF( iwork( j ).EQ.k ) THEN
414 k = j
415 END IF
416 IF( j.LT.k ) THEN
417 j = j + 1
418 GO TO 100
419 END IF
420 ELSE
421 k = 0
422 END IF
423
424
425
426 IF( info.NE.k ) THEN
427 CALL alaerh( path,
'ZHESV_AA', info, k, uplo, n,
428 $ n, -1, -1, nrhs, imat, nfail,
429 $ nerrs, nout )
430 GO TO 120
431 ELSE IF( info.NE.0 ) THEN
432 GO TO 120
433 END IF
434
435
436
437
438 CALL zhet01_aa( uplo, n, a, lda, afac, lda,
439 $ iwork, ainv, lda, rwork,
440 $ result( 1 ) )
441
442
443
444 CALL zlacpy(
'Full', n, nrhs, b, lda, work, lda )
445 CALL zpot02( uplo, n, nrhs, a, lda, x, lda, work,
446 $ lda, rwork, result( 2 ) )
447 nt = 2
448
449
450
451
452 DO 110 k = 1, nt
453 IF( result( k ).GE.thresh ) THEN
454 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
455 $
CALL aladhd( nout, path )
456 WRITE( nout, fmt = 9999 )'ZHESV_AA', uplo, n,
457 $ imat, k, result( k )
458 nfail = nfail + 1
459 END IF
460 110 CONTINUE
461 nrun = nrun + nt
462 120 CONTINUE
463 END IF
464
465 150 CONTINUE
466
467 160 CONTINUE
468 170 CONTINUE
469 180 CONTINUE
470
471
472
473 CALL alasvm( path, nout, nfail, nrun, nerrs )
474
475 9999 FORMAT( 1x, a, ', UPLO=''', a1, ''', N =', i5, ', type ', i2,
476 $ ', test ', i2, ', ratio =', g12.5 )
477 RETURN
478
479
480
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
double precision function dget06(rcond, rcondc)
DGET06
subroutine zhesv_aa(uplo, n, nrhs, a, lda, ipiv, b, ldb, work, lwork, info)
ZHESV_AA computes the solution to system of linear equations A * X = B for HE matrices
subroutine zhetrf_aa(uplo, n, a, lda, ipiv, work, lwork, info)
ZHETRF_AA
subroutine zhetri2(uplo, n, a, lda, ipiv, work, lwork, info)
ZHETRI2
subroutine zlacpy(uplo, m, n, a, lda, b, ldb)
ZLACPY copies all or part of one two-dimensional array to another.
double precision function zlanhe(norm, uplo, n, a, lda, work)
ZLANHE 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 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