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