101 INTEGER NMAX, NPARAMS, NERRBND, NTESTS, KL, KU
102 parameter(nmax = 6, nparams = 2, nerrbnd = 3,
106 INTEGER N, NRHS, INFO, I ,J, k, NFAIL, LDA,
107 $ N_AUX_TESTS, LDAB, LDAFB
108 CHARACTER FACT, TRANS, UPLO, EQUED
110 CHARACTER(3) NGUAR, CGUAR
111 LOGICAL printed_guide
112 REAL NCOND, CCOND, M, NORMDIF, NORMT, RCOND,
113 $ RNORM, RINORM, SUMR, SUMRI, EPS,
114 $ BERR(NMAX), RPVGRW, ORCOND,
115 $ CWISE_ERR, NWISE_ERR, CWISE_BND, NWISE_BND,
116 $ CWISE_RCOND, NWISE_RCOND,
117 $ CONDTHRESH, ERRTHRESH
121 REAL TSTRAT(NTESTS), RINV(NMAX), PARAMS(NPARAMS),
122 $ S(NMAX), R(NMAX),C(NMAX),RWORK(3*NMAX),
124 $ ERRBND_N(NMAX*3), ERRBND_C(NMAX*3)
126 COMPLEX A(NMAX,NMAX),INVHILB(NMAX,NMAX),X(NMAX,NMAX),
127 $ WORK(NMAX*3*5), AF(NMAX, NMAX),B(NMAX, NMAX),
129 $ AB( (NMAX-1)+(NMAX-1)+1, NMAX ),
130 $ ABCOPY( (NMAX-1)+(NMAX-1)+1, NMAX ),
131 $ AFB( 2*(NMAX-1)+(NMAX-1)+1, NMAX )
142 INTRINSIC sqrt,
max, abs, real, aimag
148 cabs1( zdum ) = abs( real( zdum ) ) + abs( aimag( zdum ) )
151 INTEGER NWISE_I, CWISE_I
152 parameter(nwise_i = 1, cwise_i = 1)
153 INTEGER BND_I, COND_I
154 parameter(bnd_i = 2, cond_i = 3)
162 EPS = SLAMCH('epsilon
')
166 LDAB = (NMAX-1)+(NMAX-1)+1
167 LDAFB = 2*(NMAX-1)+(NMAX-1)+1
172 printed_guide = .false.
181 M = MAX(SQRT(REAL(N)), 10.0)
185 CALL CLAHILB(N, N, A, LDA, INVHILB, LDA, B,
186 $ LDA, WORK, INFO, PATH)
189 CALL CLACPY('all
', N, N, A, NMAX, ACOPY, NMAX)
194 AB( I, J ) = (0.0E+0,0.0E+0)
198 DO I = MAX( 1, J-KU ), MIN( N, J+KL )
199 AB( KU+1+I-J, J ) = A( I, J )
206 ABCOPY( I, J ) = (0.0E+0,0.0E+0)
209 CALL CLACPY('all
', KL+KU+1, N, AB, LDAB, ABCOPY, LDAB)
212 IF ( LSAMEN( 2, C2, 'sy
' ) ) THEN
213 CALL CSYSVXX(FACT, UPLO, N, NRHS, ACOPY, LDA, AF, LDA,
214 $ IPIV, EQUED, S, B, LDA, X, LDA, ORCOND,
215 $ RPVGRW, BERR, NERRBND, ERRBND_N, ERRBND_C, NPARAMS,
216 $ PARAMS, WORK, RWORK, INFO)
217 ELSE IF ( LSAMEN( 2, C2, 'po
' ) ) THEN
218 CALL CPOSVXX(FACT, UPLO, N, NRHS, ACOPY, LDA, AF, LDA,
219 $ EQUED, S, B, LDA, X, LDA, ORCOND,
220 $ RPVGRW, BERR, NERRBND, ERRBND_N, ERRBND_C, NPARAMS,
221 $ PARAMS, WORK, RWORK, INFO)
222 ELSE IF ( LSAMEN( 2, C2, 'he
' ) ) THEN
223 CALL CHESVXX(FACT, UPLO, N, NRHS, ACOPY, LDA, AF, LDA,
224 $ IPIV, EQUED, S, B, LDA, X, LDA, ORCOND,
225 $ RPVGRW, BERR, NERRBND, ERRBND_N, ERRBND_C, NPARAMS,
226 $ PARAMS, WORK, RWORK, INFO)
227 ELSE IF ( LSAMEN( 2, C2, 'gb
' ) ) THEN
228 CALL CGBSVXX(FACT, TRANS, N, KL, KU, NRHS, ABCOPY,
229 $ LDAB, AFB, LDAFB, IPIV, EQUED, R, C, B,
230 $ LDA, X, LDA, ORCOND, RPVGRW, BERR, NERRBND,
231 $ ERRBND_N, ERRBND_C, NPARAMS, PARAMS, WORK, RWORK,
234 CALL CGESVXX(FACT, TRANS, N, NRHS, ACOPY, LDA, AF, LDA,
235 $ IPIV, EQUED, R, C, B, LDA, X, LDA, ORCOND,
236 $ RPVGRW, BERR, NERRBND, ERRBND_N, ERRBND_C, NPARAMS,
237 $ PARAMS, WORK, RWORK, INFO)
240 N_AUX_TESTS = N_AUX_TESTS + 1
241.LT.
IF (ORCOND EPS) THEN
242! Either factorization failed or the matrix is flagged, and 1 <=
243! INFO <= N+1. We don't decide based on rcond anymore.
251 IF (info .GT. 0 .AND. info .LE. n+1)
THEN
253 WRITE (*, fmt=8000) c2, n, info, orcond, rcond
260 diff(i,j) = x(i,j) - invhilb(i,j)
267 IF (
lsamen( 2, c2,
'PO' ) .OR.
lsamen( 2, c2,
'SY' ) .OR.
268 $
lsamen( 2, c2,
'HE' ) )
THEN
273 sumr = sumr + s(i) * cabs1(a(i,j)) * s(j)
274 sumri = sumri + cabs1(invhilb(i, j)) / (s(j) * s(i))
276 rnorm =
max(rnorm,sumr)
277 rinorm =
max(rinorm,sumri)
279 ELSE IF (
lsamen( 2, c2,
'GE' ) .OR.
lsamen( 2, c2,
'GB' ) )
285 sumr = sumr + r(i) * cabs1(a(i,j)) * c(j)
286 sumri = sumri + cabs1(invhilb(i, j)) / (r(j) * c(i))
288 rnorm =
max(rnorm,sumr)
289 rinorm =
max(rinorm,sumri)
293 rnorm = rnorm / cabs1(a(1, 1))
294 rcond = 1.0/(rnorm * rinorm)
302 rinv(i) = rinv(i) + cabs1(a(i,j))
311 sumri = sumri + cabs1(invhilb(i,j) * rinv(j))
313 rinorm =
max(rinorm, sumri)
318 ncond = cabs1(a(1,1)) / rinorm
328 normt =
max(cabs1(invhilb(i, k)), normt)
329 normdif =
max(cabs1(x(i,k) - invhilb(i,k)), normdif)
330 IF (invhilb(i,k) .NE. 0.0)
THEN
331 cwise_err =
max(cabs1(x(i,k) - invhilb(i,k))
332 $ /cabs1(invhilb(i,k)), cwise_err)
333 ELSE IF (x(i, k) .NE. 0.0)
THEN
334 cwise_err = slamch(
'OVERFLOW')
337 IF (normt .NE. 0.0)
THEN
338 nwise_err = normdif / normt
339 ELSE IF (normdif .NE. 0.0)
THEN
340 nwise_err = slamch(
'OVERFLOW')
350 rinv(i) = rinv(i) + cabs1(a(i, j) * invhilb(j, k))
358 $ + cabs1(invhilb(i, j) * rinv(j) / invhilb(i, k))
360 rinorm =
max(rinorm, sumri)
364 ccond = cabs1(a(1,1))/rinorm
367 nwise_bnd = errbnd_n(k + (bnd_i-1)*nrhs)
368 cwise_bnd = errbnd_c(k + (bnd_i-1)*nrhs)
369 nwise_rcond = errbnd_n(k + (cond_i-1)*nrhs)
370 cwise_rcond = errbnd_c(k + (cond_i-1)*nrhs)
372! $ condthresh, ncond.ge.condthresh
373!
write (*,*)
'nwise2: ', k, nwise_bnd, nwise_err, errthresh
374 IF (ncond .GE. condthresh)
THEN
376 IF (nwise_bnd .GT. errthresh)
THEN
377 tstrat(1) = 1/(2.0*eps)
379 IF (nwise_bnd .NE. 0.0)
THEN
380 tstrat(1) = nwise_err / nwise_bnd
381 ELSE IF (nwise_err .NE. 0.0)
THEN
382 tstrat(1) = 1/(16.0*eps)
386 IF (tstrat(1) .GT. 1.0)
THEN
387 tstrat(1) = 1/(4.0*eps)
392 IF (nwise_bnd .LT. 1.0)
THEN
393 tstrat(1) = 1/(8.0*eps)
401 IF (ccond .GE. condthresh)
THEN
403 IF (cwise_bnd .GT. errthresh)
THEN
404 tstrat(2) = 1/(2.0*eps)
406 IF (cwise_bnd .NE. 0.0)
THEN
407 tstrat(2) = cwise_err / cwise_bnd
408 ELSE IF (cwise_err .NE. 0.0)
THEN
409 tstrat(2) = 1/(16.0*eps)
413 IF (tstrat(2) .GT. 1.0) tstrat(2) = 1/(4.0*eps)
417 IF (cwise_bnd .LT. 1.0)
THEN
418 tstrat(2) = 1/(8.0*eps)
425 tstrat(3) = berr(k)/eps
428 tstrat(4) = rcond / orcond
429 IF (rcond .GE. condthresh .AND. tstrat(4) .LT. 1.0)
430 $ tstrat(4) = 1.0 / tstrat(4)
432 tstrat(5) = ncond / nwise_rcond
433 IF (ncond .GE. condthresh .AND. tstrat(5) .LT. 1.0)
434 $ tstrat(5) = 1.0 / tstrat(5)
436 tstrat(6) = ccond / nwise_rcond
437 IF (ccond .GE. condthresh .AND. tstrat(6) .LT. 1.0)
438 $ tstrat(6) = 1.0 / tstrat(6)
441 IF (tstrat(i) .GT. thresh)
THEN
442 IF (.NOT.printed_guide)
THEN
453 printed_guide = .true.
455 WRITE( *, 9999) c2, n, k, nguar, cguar, i, tstrat(i)
478 IF( nfail .GT. 0 )
THEN
479 WRITE(*,9998) c2, nfail, ntests*n+n_aux_tests
483 9999
FORMAT(
' C', a2,
'SVXX: N =', i2,
', RHS = ', i2,
484 $
', NWISE GUAR. = ', a, ', cwise guar. =
', A,
485 $ ' test(
',I1,') =
', G12.5 )
486 9998 FORMAT( ' c
', A2, 'svxx:
', I6, ' out of
', I6,
487 $ ' tests failed to pass
the threshold
' )
488 9997 FORMAT( ' c
', A2, 'svxx passed
the tests of error bounds
' )
490 9996 FORMAT( 3X, I2, ': normwise guaranteed forward error
', / 5X,
491 $ 'guaranteed case:
if norm( abs( xc - xt )
',
492 $ ' /
norm( xt ) .LE. errbnd( *, nwise_i, bnd_i ), then
',
494 $ 'errbnd( *, nwise_i, bnd_i ) .LE.
max(sqrt(n), 10) * eps
')
495 9995 FORMAT( 3X, I2, ': componentwise guaranteed forward
' )
496 9994 FORMAT( 3X, I2, ': backwards error
' )
497 9993 FORMAT( 3X, I2, ': reciprocal condition number
' )
498 9992 FORMAT( 3X, I2, ': reciprocal normwise condition number
' )
499 9991 FORMAT( 3X, I2, ': raw normwise error estimate
' )
500 9990 FORMAT( 3X, I2, ': reciprocal componentwise condition number
' )
501 9989 FORMAT( 3X, I2, ': raw componentwise error estimate
' )
503 8000 FORMAT( ' c
', A2, 'svxx: n =
', I2, ', info =
', I3,
504 $ ', orcond =
', G12.5, ', real rcond = ', g12.5 )
subroutine cgbsvxx(fact, trans, n, kl, ku, nrhs, ab, ldab, afb, ldafb, ipiv, equed, r, c, b, ldb, x, ldx, rcond, rpvgrw, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params, work, rwork, info)
CGBSVXX computes the solution to system of linear equations A * X = B for GB matrices
subroutine cgesvxx(fact, trans, n, nrhs, a, lda, af, ldaf, ipiv, equed, r, c, b, ldb, x, ldx, rcond, rpvgrw, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params, work, rwork, info)
CGESVXX computes the solution to system of linear equations A * X = B for GE matrices
subroutine cposvxx(fact, uplo, n, nrhs, a, lda, af, ldaf, equed, s, b, ldb, x, ldx, rcond, rpvgrw, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params, work, rwork, info)
CPOSVXX computes the solution to system of linear equations A * X = B for PO matrices
subroutine csysvxx(fact, uplo, n, nrhs, a, lda, af, ldaf, ipiv, equed, s, b, ldb, x, ldx, rcond, rpvgrw, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params, work, rwork, info)
CSYSVXX computes the solution to system of linear equations A * X = B for SY matrices