summaryrefslogtreecommitdiff
path: root/SRC/sla_lin_berr.f
diff options
context:
space:
mode:
Diffstat (limited to 'SRC/sla_lin_berr.f')
-rw-r--r--SRC/sla_lin_berr.f60
1 files changed, 60 insertions, 0 deletions
diff --git a/SRC/sla_lin_berr.f b/SRC/sla_lin_berr.f
new file mode 100644
index 00000000..2ef69af3
--- /dev/null
+++ b/SRC/sla_lin_berr.f
@@ -0,0 +1,60 @@
+ SUBROUTINE SLA_LIN_BERR ( N, NZ, NRHS, RES, AYB, BERR )
+*
+* -- LAPACK routine (version 3.2) --
+* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
+* -- Jason Riedy of Univ. of California Berkeley. --
+* -- November 2008 --
+*
+* -- LAPACK is a software package provided by Univ. of Tennessee, --
+* -- Univ. of California Berkeley and NAG Ltd. --
+*
+ IMPLICIT NONE
+* ..
+* .. Scalar Arguments ..
+ INTEGER N, NZ, NRHS
+* ..
+* .. Array Arguments ..
+ REAL AYB( N, NRHS ), BERR( NRHS )
+ REAL RES( N, NRHS )
+*
+* SLA_LIN_BERR computes componentwise relative backward error from
+* the formula
+* max(i) ( abs(R(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
+* where abs(Z) is the componentwise absolute value of the matrix
+* or vector Z.
+* ..
+* .. Local Scalars ..
+ REAL TMP
+ INTEGER I, J
+* ..
+* .. Intrinsic Functions ..
+ INTRINSIC ABS, MAX
+* ..
+* .. External Functions ..
+ EXTERNAL SLAMCH
+ REAL SLAMCH
+ REAL SAFE1
+* ..
+* .. Executable Statements ..
+*
+* Adding SAFE1 to the numerator guards against spuriously zero
+* residuals. A similar safeguard is in the SLA_yyAMV routine used
+* to compute AYB.
+*
+ SAFE1 = SLAMCH( 'Safe minimum' )
+ SAFE1 = (NZ+1)*SAFE1
+
+ DO J = 1, NRHS
+ BERR(J) = 0.0
+ DO I = 1, N
+ IF (AYB(I,J) .NE. 0.0) THEN
+ TMP = (SAFE1+ABS(RES(I,J)))/AYB(I,J)
+ BERR(J) = MAX( BERR(J), TMP )
+ END IF
+*
+* If AYB is exactly 0.0 (and if computed by SLA_yyAMV), then we know
+* the true residual also must be exactly 0.0.
+*
+ END DO
+ END DO
+ END SUBROUTINE