1*> \brief \b DLA_LIN_BERR computes a component-wise relative backward error.
2*
3*  =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6*            http://www.netlib.org/lapack/explore-html/
7*
8*> \htmlonly
9*> Download DLA_LIN_BERR + dependencies
10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dla_lin_berr.f">
11*> [TGZ]</a>
12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dla_lin_berr.f">
13*> [ZIP]</a>
14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dla_lin_berr.f">
15*> [TXT]</a>
16*> \endhtmlonly
17*
18*  Definition:
19*  ===========
20*
21*       SUBROUTINE DLA_LIN_BERR( N, NZ, NRHS, RES, AYB, BERR )
22*
23*       .. Scalar Arguments ..
24*       INTEGER            N, NZ, NRHS
25*       ..
26*       .. Array Arguments ..
27*       DOUBLE PRECISION   AYB( N, NRHS ), BERR( NRHS )
28*       DOUBLE PRECISION   RES( N, NRHS )
29*       ..
30*
31*
32*> \par Purpose:
33*  =============
34*>
35*> \verbatim
36*>
37*>    DLA_LIN_BERR computes component-wise relative backward error from
38*>    the formula
39*>        max(i) ( abs(R(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
40*>    where abs(Z) is the component-wise absolute value of the matrix
41*>    or vector Z.
42*> \endverbatim
43*
44*  Arguments:
45*  ==========
46*
47*> \param[in] N
48*> \verbatim
49*>          N is INTEGER
50*>     The number of linear equations, i.e., the order of the
51*>     matrix A.  N >= 0.
52*> \endverbatim
53*>
54*> \param[in] NZ
55*> \verbatim
56*>          NZ is INTEGER
57*>     We add (NZ+1)*SLAMCH( 'Safe minimum' ) to R(i) in the numerator to
58*>     guard against spuriously zero residuals. Default value is N.
59*> \endverbatim
60*>
61*> \param[in] NRHS
62*> \verbatim
63*>          NRHS is INTEGER
64*>     The number of right hand sides, i.e., the number of columns
65*>     of the matrices AYB, RES, and BERR.  NRHS >= 0.
66*> \endverbatim
67*>
68*> \param[in] RES
69*> \verbatim
70*>          RES is DOUBLE PRECISION array, dimension (N,NRHS)
71*>     The residual matrix, i.e., the matrix R in the relative backward
72*>     error formula above.
73*> \endverbatim
74*>
75*> \param[in] AYB
76*> \verbatim
77*>          AYB is DOUBLE PRECISION array, dimension (N, NRHS)
78*>     The denominator in the relative backward error formula above, i.e.,
79*>     the matrix abs(op(A_s))*abs(Y) + abs(B_s). The matrices A, Y, and B
80*>     are from iterative refinement (see dla_gerfsx_extended.f).
81*> \endverbatim
82*>
83*> \param[out] BERR
84*> \verbatim
85*>          BERR is DOUBLE PRECISION array, dimension (NRHS)
86*>     The component-wise relative backward error from the formula above.
87*> \endverbatim
88*
89*  Authors:
90*  ========
91*
92*> \author Univ. of Tennessee
93*> \author Univ. of California Berkeley
94*> \author Univ. of Colorado Denver
95*> \author NAG Ltd.
96*
97*> \ingroup doubleOTHERcomputational
98*
99*  =====================================================================
100      SUBROUTINE DLA_LIN_BERR ( N, NZ, NRHS, RES, AYB, BERR )
101*
102*  -- LAPACK computational routine --
103*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
104*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
105*
106*     .. Scalar Arguments ..
107      INTEGER            N, NZ, NRHS
108*     ..
109*     .. Array Arguments ..
110      DOUBLE PRECISION   AYB( N, NRHS ), BERR( NRHS )
111      DOUBLE PRECISION   RES( N, NRHS )
112*     ..
113*
114*  =====================================================================
115*
116*     .. Local Scalars ..
117      DOUBLE PRECISION   TMP
118      INTEGER            I, J
119*     ..
120*     .. Intrinsic Functions ..
121      INTRINSIC          ABS, MAX
122*     ..
123*     .. External Functions ..
124      EXTERNAL           DLAMCH
125      DOUBLE PRECISION   DLAMCH
126      DOUBLE PRECISION   SAFE1
127*     ..
128*     .. Executable Statements ..
129*
130*     Adding SAFE1 to the numerator guards against spuriously zero
131*     residuals.  A similar safeguard is in the SLA_yyAMV routine used
132*     to compute AYB.
133*
134      SAFE1 = DLAMCH( 'Safe minimum' )
135      SAFE1 = (NZ+1)*SAFE1
136
137      DO J = 1, NRHS
138         BERR(J) = 0.0D+0
139         DO I = 1, N
140            IF (AYB(I,J) .NE. 0.0D+0) THEN
141               TMP = (SAFE1+ABS(RES(I,J)))/AYB(I,J)
142               BERR(J) = MAX( BERR(J), TMP )
143            END IF
144*
145*     If AYB is exactly 0.0 (and if computed by SLA_yyAMV), then we know
146*     the true residual also must be exactly 0.0.
147*
148         END DO
149      END DO
150*
151*     End of DLA_LIN_BERR
152*
153      END
154