LAPACK 3.12.0
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
zla_gerfsx_extended.f
Go to the documentation of this file.
1*> \brief \b ZLA_GERFSX_EXTENDED
2*
3* =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6* http://www.netlib.org/lapack/explore-html/
7*
8*> \htmlonly
9*> Download ZLA_GERFSX_EXTENDED + dependencies
10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zla_gerfsx_extended.f">
11*> [TGZ]</a>
12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zla_gerfsx_extended.f">
13*> [ZIP]</a>
14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zla_gerfsx_extended.f">
15*> [TXT]</a>
16*> \endhtmlonly
17*
18* Definition:
19* ===========
20*
21* SUBROUTINE ZLA_GERFSX_EXTENDED( PREC_TYPE, TRANS_TYPE, N, NRHS, A,
22* LDA, AF, LDAF, IPIV, COLEQU, C, B,
23* LDB, Y, LDY, BERR_OUT, N_NORMS,
24* ERRS_N, ERRS_C, RES, AYB, DY,
25* Y_TAIL, RCOND, ITHRESH, RTHRESH,
26* DZ_UB, IGNORE_CWISE, INFO )
27*
28* .. Scalar Arguments ..
29* INTEGER INFO, LDA, LDAF, LDB, LDY, N, NRHS, PREC_TYPE,
30* $ TRANS_TYPE, N_NORMS
31* LOGICAL COLEQU, IGNORE_CWISE
32* INTEGER ITHRESH
33* DOUBLE PRECISION RTHRESH, DZ_UB
34* ..
35* .. Array Arguments
36* INTEGER IPIV( * )
37* COMPLEX*16 A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
38* $ Y( LDY, * ), RES( * ), DY( * ), Y_TAIL( * )
39* DOUBLE PRECISION C( * ), AYB( * ), RCOND, BERR_OUT( * ),
40* $ ERRS_N( NRHS, * ), ERRS_C( NRHS, * )
41* ..
42*
43*
44*> \par Purpose:
45* =============
46*>
47*> \verbatim
48*>
49*> ZLA_GERFSX_EXTENDED improves the computed solution to a system of
50*> linear equations by performing extra-precise iterative refinement
51*> and provides error bounds and backward error estimates for the solution.
52*> This subroutine is called by ZGERFSX to perform iterative refinement.
53*> In addition to normwise error bound, the code provides maximum
54*> componentwise error bound if possible. See comments for ERRS_N
55*> and ERRS_C for details of the error bounds. Note that this
56*> subroutine is only responsible for setting the second fields of
57*> ERRS_N and ERRS_C.
58*> \endverbatim
59*
60* Arguments:
61* ==========
62*
63*> \param[in] PREC_TYPE
64*> \verbatim
65*> PREC_TYPE is INTEGER
66*> Specifies the intermediate precision to be used in refinement.
67*> The value is defined by ILAPREC(P) where P is a CHARACTER and P
68*> = 'S': Single
69*> = 'D': Double
70*> = 'I': Indigenous
71*> = 'X' or 'E': Extra
72*> \endverbatim
73*>
74*> \param[in] TRANS_TYPE
75*> \verbatim
76*> TRANS_TYPE is INTEGER
77*> Specifies the transposition operation on A.
78*> The value is defined by ILATRANS(T) where T is a CHARACTER and T
79*> = 'N': No transpose
80*> = 'T': Transpose
81*> = 'C': Conjugate transpose
82*> \endverbatim
83*>
84*> \param[in] N
85*> \verbatim
86*> N is INTEGER
87*> The number of linear equations, i.e., the order of the
88*> matrix A. N >= 0.
89*> \endverbatim
90*>
91*> \param[in] NRHS
92*> \verbatim
93*> NRHS is INTEGER
94*> The number of right-hand-sides, i.e., the number of columns of the
95*> matrix B.
96*> \endverbatim
97*>
98*> \param[in] A
99*> \verbatim
100*> A is COMPLEX*16 array, dimension (LDA,N)
101*> On entry, the N-by-N matrix A.
102*> \endverbatim
103*>
104*> \param[in] LDA
105*> \verbatim
106*> LDA is INTEGER
107*> The leading dimension of the array A. LDA >= max(1,N).
108*> \endverbatim
109*>
110*> \param[in] AF
111*> \verbatim
112*> AF is COMPLEX*16 array, dimension (LDAF,N)
113*> The factors L and U from the factorization
114*> A = P*L*U as computed by ZGETRF.
115*> \endverbatim
116*>
117*> \param[in] LDAF
118*> \verbatim
119*> LDAF is INTEGER
120*> The leading dimension of the array AF. LDAF >= max(1,N).
121*> \endverbatim
122*>
123*> \param[in] IPIV
124*> \verbatim
125*> IPIV is INTEGER array, dimension (N)
126*> The pivot indices from the factorization A = P*L*U
127*> as computed by ZGETRF; row i of the matrix was interchanged
128*> with row IPIV(i).
129*> \endverbatim
130*>
131*> \param[in] COLEQU
132*> \verbatim
133*> COLEQU is LOGICAL
134*> If .TRUE. then column equilibration was done to A before calling
135*> this routine. This is needed to compute the solution and error
136*> bounds correctly.
137*> \endverbatim
138*>
139*> \param[in] C
140*> \verbatim
141*> C is DOUBLE PRECISION array, dimension (N)
142*> The column scale factors for A. If COLEQU = .FALSE., C
143*> is not accessed. If C is input, each element of C should be a power
144*> of the radix to ensure a reliable solution and error estimates.
145*> Scaling by powers of the radix does not cause rounding errors unless
146*> the result underflows or overflows. Rounding errors during scaling
147*> lead to refining with a matrix that is not equivalent to the
148*> input matrix, producing error estimates that may not be
149*> reliable.
150*> \endverbatim
151*>
152*> \param[in] B
153*> \verbatim
154*> B is COMPLEX*16 array, dimension (LDB,NRHS)
155*> The right-hand-side matrix B.
156*> \endverbatim
157*>
158*> \param[in] LDB
159*> \verbatim
160*> LDB is INTEGER
161*> The leading dimension of the array B. LDB >= max(1,N).
162*> \endverbatim
163*>
164*> \param[in,out] Y
165*> \verbatim
166*> Y is COMPLEX*16 array, dimension (LDY,NRHS)
167*> On entry, the solution matrix X, as computed by ZGETRS.
168*> On exit, the improved solution matrix Y.
169*> \endverbatim
170*>
171*> \param[in] LDY
172*> \verbatim
173*> LDY is INTEGER
174*> The leading dimension of the array Y. LDY >= max(1,N).
175*> \endverbatim
176*>
177*> \param[out] BERR_OUT
178*> \verbatim
179*> BERR_OUT is DOUBLE PRECISION array, dimension (NRHS)
180*> On exit, BERR_OUT(j) contains the componentwise relative backward
181*> error for right-hand-side j from the formula
182*> max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
183*> where abs(Z) is the componentwise absolute value of the matrix
184*> or vector Z. This is computed by ZLA_LIN_BERR.
185*> \endverbatim
186*>
187*> \param[in] N_NORMS
188*> \verbatim
189*> N_NORMS is INTEGER
190*> Determines which error bounds to return (see ERRS_N
191*> and ERRS_C).
192*> If N_NORMS >= 1 return normwise error bounds.
193*> If N_NORMS >= 2 return componentwise error bounds.
194*> \endverbatim
195*>
196*> \param[in,out] ERRS_N
197*> \verbatim
198*> ERRS_N is DOUBLE PRECISION array, dimension (NRHS, N_ERR_BNDS)
199*> For each right-hand side, this array contains information about
200*> various error bounds and condition numbers corresponding to the
201*> normwise relative error, which is defined as follows:
202*>
203*> Normwise relative error in the ith solution vector:
204*> max_j (abs(XTRUE(j,i) - X(j,i)))
205*> ------------------------------
206*> max_j abs(X(j,i))
207*>
208*> The array is indexed by the type of error information as described
209*> below. There currently are up to three pieces of information
210*> returned.
211*>
212*> The first index in ERRS_N(i,:) corresponds to the ith
213*> right-hand side.
214*>
215*> The second index in ERRS_N(:,err) contains the following
216*> three fields:
217*> err = 1 "Trust/don't trust" boolean. Trust the answer if the
218*> reciprocal condition number is less than the threshold
219*> sqrt(n) * slamch('Epsilon').
220*>
221*> err = 2 "Guaranteed" error bound: The estimated forward error,
222*> almost certainly within a factor of 10 of the true error
223*> so long as the next entry is greater than the threshold
224*> sqrt(n) * slamch('Epsilon'). This error bound should only
225*> be trusted if the previous boolean is true.
226*>
227*> err = 3 Reciprocal condition number: Estimated normwise
228*> reciprocal condition number. Compared with the threshold
229*> sqrt(n) * slamch('Epsilon') to determine if the error
230*> estimate is "guaranteed". These reciprocal condition
231*> numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
232*> appropriately scaled matrix Z.
233*> Let Z = S*A, where S scales each row by a power of the
234*> radix so all absolute row sums of Z are approximately 1.
235*>
236*> This subroutine is only responsible for setting the second field
237*> above.
238*> See Lapack Working Note 165 for further details and extra
239*> cautions.
240*> \endverbatim
241*>
242*> \param[in,out] ERRS_C
243*> \verbatim
244*> ERRS_C is DOUBLE PRECISION array, dimension (NRHS, N_ERR_BNDS)
245*> For each right-hand side, this array contains information about
246*> various error bounds and condition numbers corresponding to the
247*> componentwise relative error, which is defined as follows:
248*>
249*> Componentwise relative error in the ith solution vector:
250*> abs(XTRUE(j,i) - X(j,i))
251*> max_j ----------------------
252*> abs(X(j,i))
253*>
254*> The array is indexed by the right-hand side i (on which the
255*> componentwise relative error depends), and the type of error
256*> information as described below. There currently are up to three
257*> pieces of information returned for each right-hand side. If
258*> componentwise accuracy is not requested (PARAMS(3) = 0.0), then
259*> ERRS_C is not accessed. If N_ERR_BNDS < 3, then at most
260*> the first (:,N_ERR_BNDS) entries are returned.
261*>
262*> The first index in ERRS_C(i,:) corresponds to the ith
263*> right-hand side.
264*>
265*> The second index in ERRS_C(:,err) contains the following
266*> three fields:
267*> err = 1 "Trust/don't trust" boolean. Trust the answer if the
268*> reciprocal condition number is less than the threshold
269*> sqrt(n) * slamch('Epsilon').
270*>
271*> err = 2 "Guaranteed" error bound: The estimated forward error,
272*> almost certainly within a factor of 10 of the true error
273*> so long as the next entry is greater than the threshold
274*> sqrt(n) * slamch('Epsilon'). This error bound should only
275*> be trusted if the previous boolean is true.
276*>
277*> err = 3 Reciprocal condition number: Estimated componentwise
278*> reciprocal condition number. Compared with the threshold
279*> sqrt(n) * slamch('Epsilon') to determine if the error
280*> estimate is "guaranteed". These reciprocal condition
281*> numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
282*> appropriately scaled matrix Z.
283*> Let Z = S*(A*diag(x)), where x is the solution for the
284*> current right-hand side and S scales each row of
285*> A*diag(x) by a power of the radix so all absolute row
286*> sums of Z are approximately 1.
287*>
288*> This subroutine is only responsible for setting the second field
289*> above.
290*> See Lapack Working Note 165 for further details and extra
291*> cautions.
292*> \endverbatim
293*>
294*> \param[in] RES
295*> \verbatim
296*> RES is COMPLEX*16 array, dimension (N)
297*> Workspace to hold the intermediate residual.
298*> \endverbatim
299*>
300*> \param[in] AYB
301*> \verbatim
302*> AYB is DOUBLE PRECISION array, dimension (N)
303*> Workspace.
304*> \endverbatim
305*>
306*> \param[in] DY
307*> \verbatim
308*> DY is COMPLEX*16 array, dimension (N)
309*> Workspace to hold the intermediate solution.
310*> \endverbatim
311*>
312*> \param[in] Y_TAIL
313*> \verbatim
314*> Y_TAIL is COMPLEX*16 array, dimension (N)
315*> Workspace to hold the trailing bits of the intermediate solution.
316*> \endverbatim
317*>
318*> \param[in] RCOND
319*> \verbatim
320*> RCOND is DOUBLE PRECISION
321*> Reciprocal scaled condition number. This is an estimate of the
322*> reciprocal Skeel condition number of the matrix A after
323*> equilibration (if done). If this is less than the machine
324*> precision (in particular, if it is zero), the matrix is singular
325*> to working precision. Note that the error may still be small even
326*> if this number is very small and the matrix appears ill-
327*> conditioned.
328*> \endverbatim
329*>
330*> \param[in] ITHRESH
331*> \verbatim
332*> ITHRESH is INTEGER
333*> The maximum number of residual computations allowed for
334*> refinement. The default is 10. For 'aggressive' set to 100 to
335*> permit convergence using approximate factorizations or
336*> factorizations other than LU. If the factorization uses a
337*> technique other than Gaussian elimination, the guarantees in
338*> ERRS_N and ERRS_C may no longer be trustworthy.
339*> \endverbatim
340*>
341*> \param[in] RTHRESH
342*> \verbatim
343*> RTHRESH is DOUBLE PRECISION
344*> Determines when to stop refinement if the error estimate stops
345*> decreasing. Refinement will stop when the next solution no longer
346*> satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is
347*> the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The
348*> default value is 0.5. For 'aggressive' set to 0.9 to permit
349*> convergence on extremely ill-conditioned matrices. See LAWN 165
350*> for more details.
351*> \endverbatim
352*>
353*> \param[in] DZ_UB
354*> \verbatim
355*> DZ_UB is DOUBLE PRECISION
356*> Determines when to start considering componentwise convergence.
357*> Componentwise convergence is only considered after each component
358*> of the solution Y is stable, which we define as the relative
359*> change in each component being less than DZ_UB. The default value
360*> is 0.25, requiring the first bit to be stable. See LAWN 165 for
361*> more details.
362*> \endverbatim
363*>
364*> \param[in] IGNORE_CWISE
365*> \verbatim
366*> IGNORE_CWISE is LOGICAL
367*> If .TRUE. then ignore componentwise convergence. Default value
368*> is .FALSE..
369*> \endverbatim
370*>
371*> \param[out] INFO
372*> \verbatim
373*> INFO is INTEGER
374*> = 0: Successful exit.
375*> < 0: if INFO = -i, the ith argument to ZGETRS had an illegal
376*> value
377*> \endverbatim
378*
379* Authors:
380* ========
381*
382*> \author Univ. of Tennessee
383*> \author Univ. of California Berkeley
384*> \author Univ. of Colorado Denver
385*> \author NAG Ltd.
386*
387*> \ingroup la_gerfsx_extended
388*
389* =====================================================================
390 SUBROUTINE zla_gerfsx_extended( PREC_TYPE, TRANS_TYPE, N, NRHS, A,
391 $ LDA, AF, LDAF, IPIV, COLEQU, C, B,
392 $ LDB, Y, LDY, BERR_OUT, N_NORMS,
393 $ ERRS_N, ERRS_C, RES, AYB, DY,
394 $ Y_TAIL, RCOND, ITHRESH, RTHRESH,
395 $ DZ_UB, IGNORE_CWISE, INFO )
396*
397* -- LAPACK computational routine --
398* -- LAPACK is a software package provided by Univ. of Tennessee, --
399* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
400*
401* .. Scalar Arguments ..
402 INTEGER INFO, LDA, LDAF, LDB, LDY, N, NRHS, PREC_TYPE,
403 $ TRANS_TYPE, N_NORMS
404 LOGICAL COLEQU, IGNORE_CWISE
405 INTEGER ITHRESH
406 DOUBLE PRECISION RTHRESH, DZ_UB
407* ..
408* .. Array Arguments
409 INTEGER IPIV( * )
410 COMPLEX*16 A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
411 $ y( ldy, * ), res( * ), dy( * ), y_tail( * )
412 DOUBLE PRECISION C( * ), AYB( * ), RCOND, BERR_OUT( * ),
413 $ ERRS_N( NRHS, * ), ERRS_C( NRHS, * )
414* ..
415*
416* =====================================================================
417*
418* .. Local Scalars ..
419 CHARACTER TRANS
420 INTEGER CNT, I, J, X_STATE, Z_STATE, Y_PREC_STATE
421 DOUBLE PRECISION YK, DYK, YMIN, NORMY, NORMX, NORMDX, DXRAT,
422 $ DZRAT, PREVNORMDX, PREV_DZ_Z, DXRATMAX,
423 $ DZRATMAX, DX_X, DZ_Z, FINAL_DX_X, FINAL_DZ_Z,
424 $ eps, hugeval, incr_thresh
425 LOGICAL INCR_PREC
426 COMPLEX*16 ZDUM
427* ..
428* .. Parameters ..
429 INTEGER UNSTABLE_STATE, WORKING_STATE, CONV_STATE,
430 $ noprog_state, base_residual, extra_residual,
431 $ extra_y
432 parameter( unstable_state = 0, working_state = 1,
433 $ conv_state = 2,
434 $ noprog_state = 3 )
435 parameter( base_residual = 0, extra_residual = 1,
436 $ extra_y = 2 )
437 INTEGER FINAL_NRM_ERR_I, FINAL_CMP_ERR_I, BERR_I
438 INTEGER RCOND_I, NRM_RCOND_I, NRM_ERR_I, CMP_RCOND_I
439 INTEGER CMP_ERR_I, PIV_GROWTH_I
440 parameter( final_nrm_err_i = 1, final_cmp_err_i = 2,
441 $ berr_i = 3 )
442 parameter( rcond_i = 4, nrm_rcond_i = 5, nrm_err_i = 6 )
443 parameter( cmp_rcond_i = 7, cmp_err_i = 8,
444 $ piv_growth_i = 9 )
445 INTEGER LA_LINRX_ITREF_I, LA_LINRX_ITHRESH_I,
446 $ LA_LINRX_CWISE_I
447 parameter( la_linrx_itref_i = 1,
448 $ la_linrx_ithresh_i = 2 )
449 parameter( la_linrx_cwise_i = 3 )
450 INTEGER LA_LINRX_TRUST_I, LA_LINRX_ERR_I,
451 $ LA_LINRX_RCOND_I
452 parameter( la_linrx_trust_i = 1, la_linrx_err_i = 2 )
453 parameter( la_linrx_rcond_i = 3 )
454* ..
455* .. External Subroutines ..
456 EXTERNAL zaxpy, zcopy, zgetrs, zgemv, blas_zgemv_x,
457 $ blas_zgemv2_x, zla_geamv, zla_wwaddw, dlamch,
459 DOUBLE PRECISION DLAMCH
460 CHARACTER CHLA_TRANSTYPE
461* ..
462* .. Intrinsic Functions ..
463 INTRINSIC abs, max, min
464* ..
465* .. Statement Functions ..
466 DOUBLE PRECISION CABS1
467* ..
468* .. Statement Function Definitions ..
469 cabs1( zdum ) = abs( dble( zdum ) ) + abs( dimag( zdum ) )
470* ..
471* .. Executable Statements ..
472*
473 IF ( info.NE.0 ) RETURN
474 trans = chla_transtype(trans_type)
475 eps = dlamch( 'Epsilon' )
476 hugeval = dlamch( 'Overflow' )
477* Force HUGEVAL to Inf
478 hugeval = hugeval * hugeval
479* Using HUGEVAL may lead to spurious underflows.
480 incr_thresh = dble( n ) * eps
481*
482 DO j = 1, nrhs
483 y_prec_state = extra_residual
484 IF ( y_prec_state .EQ. extra_y ) THEN
485 DO i = 1, n
486 y_tail( i ) = 0.0d+0
487 END DO
488 END IF
489
490 dxrat = 0.0d+0
491 dxratmax = 0.0d+0
492 dzrat = 0.0d+0
493 dzratmax = 0.0d+0
494 final_dx_x = hugeval
495 final_dz_z = hugeval
496 prevnormdx = hugeval
497 prev_dz_z = hugeval
498 dz_z = hugeval
499 dx_x = hugeval
500
501 x_state = working_state
502 z_state = unstable_state
503 incr_prec = .false.
504
505 DO cnt = 1, ithresh
506*
507* Compute residual RES = B_s - op(A_s) * Y,
508* op(A) = A, A**T, or A**H depending on TRANS (and type).
509*
510 CALL zcopy( n, b( 1, j ), 1, res, 1 )
511 IF ( y_prec_state .EQ. base_residual ) THEN
512 CALL zgemv( trans, n, n, (-1.0d+0,0.0d+0), a, lda,
513 $ y( 1, j ), 1, (1.0d+0,0.0d+0), res, 1)
514 ELSE IF (y_prec_state .EQ. extra_residual) THEN
515 CALL blas_zgemv_x( trans_type, n, n, (-1.0d+0,0.0d+0), a,
516 $ lda, y( 1, j ), 1, (1.0d+0,0.0d+0),
517 $ res, 1, prec_type )
518 ELSE
519 CALL blas_zgemv2_x( trans_type, n, n, (-1.0d+0,0.0d+0),
520 $ a, lda, y(1, j), y_tail, 1, (1.0d+0,0.0d+0), res, 1,
521 $ prec_type)
522 END IF
523
524! XXX: RES is no longer needed.
525 CALL zcopy( n, res, 1, dy, 1 )
526 CALL zgetrs( trans, n, 1, af, ldaf, ipiv, dy, n, info )
527*
528* Calculate relative changes DX_X, DZ_Z and ratios DXRAT, DZRAT.
529*
530 normx = 0.0d+0
531 normy = 0.0d+0
532 normdx = 0.0d+0
533 dz_z = 0.0d+0
534 ymin = hugeval
535*
536 DO i = 1, n
537 yk = cabs1( y( i, j ) )
538 dyk = cabs1( dy( i ) )
539
540 IF ( yk .NE. 0.0d+0 ) THEN
541 dz_z = max( dz_z, dyk / yk )
542 ELSE IF ( dyk .NE. 0.0d+0 ) THEN
543 dz_z = hugeval
544 END IF
545
546 ymin = min( ymin, yk )
547
548 normy = max( normy, yk )
549
550 IF ( colequ ) THEN
551 normx = max( normx, yk * c( i ) )
552 normdx = max( normdx, dyk * c( i ) )
553 ELSE
554 normx = normy
555 normdx = max(normdx, dyk)
556 END IF
557 END DO
558
559 IF ( normx .NE. 0.0d+0 ) THEN
560 dx_x = normdx / normx
561 ELSE IF ( normdx .EQ. 0.0d+0 ) THEN
562 dx_x = 0.0d+0
563 ELSE
564 dx_x = hugeval
565 END IF
566
567 dxrat = normdx / prevnormdx
568 dzrat = dz_z / prev_dz_z
569*
570* Check termination criteria
571*
572 IF (.NOT.ignore_cwise
573 $ .AND. ymin*rcond .LT. incr_thresh*normy
574 $ .AND. y_prec_state .LT. extra_y )
575 $ incr_prec = .true.
576
577 IF ( x_state .EQ. noprog_state .AND. dxrat .LE. rthresh )
578 $ x_state = working_state
579 IF ( x_state .EQ. working_state ) THEN
580 IF (dx_x .LE. eps) THEN
581 x_state = conv_state
582 ELSE IF ( dxrat .GT. rthresh ) THEN
583 IF ( y_prec_state .NE. extra_y ) THEN
584 incr_prec = .true.
585 ELSE
586 x_state = noprog_state
587 END IF
588 ELSE
589 IF ( dxrat .GT. dxratmax ) dxratmax = dxrat
590 END IF
591 IF ( x_state .GT. working_state ) final_dx_x = dx_x
592 END IF
593
594 IF ( z_state .EQ. unstable_state .AND. dz_z .LE. dz_ub )
595 $ z_state = working_state
596 IF ( z_state .EQ. noprog_state .AND. dzrat .LE. rthresh )
597 $ z_state = working_state
598 IF ( z_state .EQ. working_state ) THEN
599 IF ( dz_z .LE. eps ) THEN
600 z_state = conv_state
601 ELSE IF ( dz_z .GT. dz_ub ) THEN
602 z_state = unstable_state
603 dzratmax = 0.0d+0
604 final_dz_z = hugeval
605 ELSE IF ( dzrat .GT. rthresh ) THEN
606 IF ( y_prec_state .NE. extra_y ) THEN
607 incr_prec = .true.
608 ELSE
609 z_state = noprog_state
610 END IF
611 ELSE
612 IF ( dzrat .GT. dzratmax ) dzratmax = dzrat
613 END IF
614 IF ( z_state .GT. working_state ) final_dz_z = dz_z
615 END IF
616*
617* Exit if both normwise and componentwise stopped working,
618* but if componentwise is unstable, let it go at least two
619* iterations.
620*
621 IF ( x_state.NE.working_state ) THEN
622 IF ( ignore_cwise ) GOTO 666
623 IF ( z_state.EQ.noprog_state .OR. z_state.EQ.conv_state )
624 $ GOTO 666
625 IF ( z_state.EQ.unstable_state .AND. cnt.GT.1 ) GOTO 666
626 END IF
627
628 IF ( incr_prec ) THEN
629 incr_prec = .false.
630 y_prec_state = y_prec_state + 1
631 DO i = 1, n
632 y_tail( i ) = 0.0d+0
633 END DO
634 END IF
635
636 prevnormdx = normdx
637 prev_dz_z = dz_z
638*
639* Update solution.
640*
641 IF ( y_prec_state .LT. extra_y ) THEN
642 CALL zaxpy( n, (1.0d+0,0.0d+0), dy, 1, y(1,j), 1 )
643 ELSE
644 CALL zla_wwaddw( n, y( 1, j ), y_tail, dy )
645 END IF
646
647 END DO
648* Target of "IF (Z_STOP .AND. X_STOP)". Sun's f77 won't EXIT.
649 666 CONTINUE
650*
651* Set final_* when cnt hits ithresh
652*
653 IF ( x_state .EQ. working_state ) final_dx_x = dx_x
654 IF ( z_state .EQ. working_state ) final_dz_z = dz_z
655*
656* Compute error bounds
657*
658 IF (n_norms .GE. 1) THEN
659 errs_n( j, la_linrx_err_i ) = final_dx_x / (1 - dxratmax)
660
661 END IF
662 IF ( n_norms .GE. 2 ) THEN
663 errs_c( j, la_linrx_err_i ) = final_dz_z / (1 - dzratmax)
664 END IF
665*
666* Compute componentwise relative backward error from formula
667* max(i) ( abs(R(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
668* where abs(Z) is the componentwise absolute value of the matrix
669* or vector Z.
670*
671* Compute residual RES = B_s - op(A_s) * Y,
672* op(A) = A, A**T, or A**H depending on TRANS (and type).
673*
674 CALL zcopy( n, b( 1, j ), 1, res, 1 )
675 CALL zgemv( trans, n, n, (-1.0d+0,0.0d+0), a, lda, y(1,j), 1,
676 $ (1.0d+0,0.0d+0), res, 1 )
677
678 DO i = 1, n
679 ayb( i ) = cabs1( b( i, j ) )
680 END DO
681*
682* Compute abs(op(A_s))*abs(Y) + abs(B_s).
683*
684 CALL zla_geamv ( trans_type, n, n, 1.0d+0,
685 $ a, lda, y(1, j), 1, 1.0d+0, ayb, 1 )
686
687 CALL zla_lin_berr ( n, n, 1, res, ayb, berr_out( j ) )
688*
689* End of loop for each RHS.
690*
691 END DO
692*
693 RETURN
694*
695* End of ZLA_GERFSX_EXTENDED
696*
697 END
subroutine zaxpy(n, za, zx, incx, zy, incy)
ZAXPY
Definition zaxpy.f:88
subroutine zcopy(n, zx, incx, zy, incy)
ZCOPY
Definition zcopy.f:81
subroutine zgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
ZGEMV
Definition zgemv.f:160
subroutine zgetrs(trans, n, nrhs, a, lda, ipiv, b, ldb, info)
ZGETRS
Definition zgetrs.f:121
subroutine zla_geamv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
ZLA_GEAMV computes a matrix-vector product using a general matrix to calculate error bounds.
Definition zla_geamv.f:177
subroutine zla_gerfsx_extended(prec_type, trans_type, n, nrhs, a, lda, af, ldaf, ipiv, colequ, c, b, ldb, y, ldy, berr_out, n_norms, errs_n, errs_c, res, ayb, dy, y_tail, rcond, ithresh, rthresh, dz_ub, ignore_cwise, info)
ZLA_GERFSX_EXTENDED
subroutine zla_lin_berr(n, nz, nrhs, res, ayb, berr)
ZLA_LIN_BERR computes a component-wise relative backward error.
character *1 function chla_transtype(trans)
CHLA_TRANSTYPE
subroutine zla_wwaddw(n, x, y, w)
ZLA_WWADDW adds a vector into a doubled-single vector.
Definition zla_wwaddw.f:81
double precision function dlamch(cmach)
DLAMCH
Definition dlamch.f:69