LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches

◆ cgerfs()

subroutine cgerfs ( character trans,
integer n,
integer nrhs,
complex, dimension( lda, * ) a,
integer lda,
complex, dimension( ldaf, * ) af,
integer ldaf,
integer, dimension( * ) ipiv,
complex, dimension( ldb, * ) b,
integer ldb,
complex, dimension( ldx, * ) x,
integer ldx,
real, dimension( * ) ferr,
real, dimension( * ) berr,
complex, dimension( * ) work,
real, dimension( * ) rwork,
integer info )

CGERFS

Download CGERFS + dependencies [TGZ] [ZIP] [TXT]

Purpose:
!>
!> CGERFS improves the computed solution to a system of linear
!> equations and provides error bounds and backward error estimates for
!> the solution.
!> 
Parameters
[in]TRANS
!>          TRANS is CHARACTER*1
!>          Specifies the form of the system of equations:
!>          = 'N':  A * X = B     (No transpose)
!>          = 'T':  A**T * X = B  (Transpose)
!>          = 'C':  A**H * X = B  (Conjugate transpose)
!> 
[in]N
!>          N is INTEGER
!>          The order of the matrix A.  N >= 0.
!> 
[in]NRHS
!>          NRHS is INTEGER
!>          The number of right hand sides, i.e., the number of columns
!>          of the matrices B and X.  NRHS >= 0.
!> 
[in]A
!>          A is COMPLEX array, dimension (LDA,N)
!>          The original N-by-N matrix A.
!> 
[in]LDA
!>          LDA is INTEGER
!>          The leading dimension of the array A.  LDA >= max(1,N).
!> 
[in]AF
!>          AF is COMPLEX array, dimension (LDAF,N)
!>          The factors L and U from the factorization A = P*L*U
!>          as computed by CGETRF.
!> 
[in]LDAF
!>          LDAF is INTEGER
!>          The leading dimension of the array AF.  LDAF >= max(1,N).
!> 
[in]IPIV
!>          IPIV is INTEGER array, dimension (N)
!>          The pivot indices from CGETRF; for 1<=i<=N, row i of the
!>          matrix was interchanged with row IPIV(i).
!> 
[in]B
!>          B is COMPLEX array, dimension (LDB,NRHS)
!>          The right hand side matrix B.
!> 
[in]LDB
!>          LDB is INTEGER
!>          The leading dimension of the array B.  LDB >= max(1,N).
!> 
[in,out]X
!>          X is COMPLEX array, dimension (LDX,NRHS)
!>          On entry, the solution matrix X, as computed by CGETRS.
!>          On exit, the improved solution matrix X.
!> 
[in]LDX
!>          LDX is INTEGER
!>          The leading dimension of the array X.  LDX >= max(1,N).
!> 
[out]FERR
!>          FERR is REAL array, dimension (NRHS)
!>          The estimated forward error bound for each solution vector
!>          X(j) (the j-th column of the solution matrix X).
!>          If XTRUE is the true solution corresponding to X(j), FERR(j)
!>          is an estimated upper bound for the magnitude of the largest
!>          element in (X(j) - XTRUE) divided by the magnitude of the
!>          largest element in X(j).  The estimate is as reliable as
!>          the estimate for RCOND, and is almost always a slight
!>          overestimate of the true error.
!> 
[out]BERR
!>          BERR is REAL array, dimension (NRHS)
!>          The componentwise relative backward error of each solution
!>          vector X(j) (i.e., the smallest relative change in
!>          any element of A or B that makes X(j) an exact solution).
!> 
[out]WORK
!>          WORK is COMPLEX array, dimension (2*N)
!> 
[out]RWORK
!>          RWORK is REAL array, dimension (N)
!> 
[out]INFO
!>          INFO is INTEGER
!>          = 0:  successful exit
!>          < 0:  if INFO = -i, the i-th argument had an illegal value
!> 
Internal Parameters:
!>  ITMAX is the maximum number of steps of iterative refinement.
!> 
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.

Definition at line 182 of file cgerfs.f.

185*
186* -- LAPACK computational routine --
187* -- LAPACK is a software package provided by Univ. of Tennessee, --
188* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
189*
190* .. Scalar Arguments ..
191 CHARACTER TRANS
192 INTEGER INFO, LDA, LDAF, LDB, LDX, N, NRHS
193* ..
194* .. Array Arguments ..
195 INTEGER IPIV( * )
196 REAL BERR( * ), FERR( * ), RWORK( * )
197 COMPLEX A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
198 $ WORK( * ), X( LDX, * )
199* ..
200*
201* =====================================================================
202*
203* .. Parameters ..
204 INTEGER ITMAX
205 parameter( itmax = 5 )
206 REAL ZERO
207 parameter( zero = 0.0e+0 )
208 COMPLEX ONE
209 parameter( one = ( 1.0e+0, 0.0e+0 ) )
210 REAL TWO
211 parameter( two = 2.0e+0 )
212 REAL THREE
213 parameter( three = 3.0e+0 )
214* ..
215* .. Local Scalars ..
216 LOGICAL NOTRAN
217 CHARACTER TRANSN, TRANST
218 INTEGER COUNT, I, J, K, KASE, NZ
219 REAL EPS, LSTRES, S, SAFE1, SAFE2, SAFMIN, XK
220 COMPLEX ZDUM
221* ..
222* .. Local Arrays ..
223 INTEGER ISAVE( 3 )
224* ..
225* .. External Functions ..
226 LOGICAL LSAME
227 REAL SLAMCH
228 EXTERNAL lsame, slamch
229* ..
230* .. External Subroutines ..
231 EXTERNAL caxpy, ccopy, cgemv, cgetrs, clacn2,
232 $ xerbla
233* ..
234* .. Intrinsic Functions ..
235 INTRINSIC abs, aimag, max, real
236* ..
237* .. Statement Functions ..
238 REAL CABS1
239* ..
240* .. Statement Function definitions ..
241 cabs1( zdum ) = abs( real( zdum ) ) + abs( aimag( zdum ) )
242* ..
243* .. Executable Statements ..
244*
245* Test the input parameters.
246*
247 info = 0
248 notran = lsame( trans, 'N' )
249 IF( .NOT.notran .AND. .NOT.lsame( trans, 'T' ) .AND. .NOT.
250 $ lsame( trans, 'C' ) ) THEN
251 info = -1
252 ELSE IF( n.LT.0 ) THEN
253 info = -2
254 ELSE IF( nrhs.LT.0 ) THEN
255 info = -3
256 ELSE IF( lda.LT.max( 1, n ) ) THEN
257 info = -5
258 ELSE IF( ldaf.LT.max( 1, n ) ) THEN
259 info = -7
260 ELSE IF( ldb.LT.max( 1, n ) ) THEN
261 info = -10
262 ELSE IF( ldx.LT.max( 1, n ) ) THEN
263 info = -12
264 END IF
265 IF( info.NE.0 ) THEN
266 CALL xerbla( 'CGERFS', -info )
267 RETURN
268 END IF
269*
270* Quick return if possible
271*
272 IF( n.EQ.0 .OR. nrhs.EQ.0 ) THEN
273 DO 10 j = 1, nrhs
274 ferr( j ) = zero
275 berr( j ) = zero
276 10 CONTINUE
277 RETURN
278 END IF
279*
280 IF( notran ) THEN
281 transn = 'N'
282 transt = 'C'
283 ELSE
284 transn = 'C'
285 transt = 'N'
286 END IF
287*
288* NZ = maximum number of nonzero elements in each row of A, plus 1
289*
290 nz = n + 1
291 eps = slamch( 'Epsilon' )
292 safmin = slamch( 'Safe minimum' )
293 safe1 = real( nz )*safmin
294 safe2 = safe1 / eps
295*
296* Do for each right hand side
297*
298 DO 140 j = 1, nrhs
299*
300 count = 1
301 lstres = three
302 20 CONTINUE
303*
304* Loop until stopping criterion is satisfied.
305*
306* Compute residual R = B - op(A) * X,
307* where op(A) = A, A**T, or A**H, depending on TRANS.
308*
309 CALL ccopy( n, b( 1, j ), 1, work, 1 )
310 CALL cgemv( trans, n, n, -one, a, lda, x( 1, j ), 1, one,
311 $ work,
312 $ 1 )
313*
314* Compute componentwise relative backward error from formula
315*
316* max(i) ( abs(R(i)) / ( abs(op(A))*abs(X) + abs(B) )(i) )
317*
318* where abs(Z) is the componentwise absolute value of the matrix
319* or vector Z. If the i-th component of the denominator is less
320* than SAFE2, then SAFE1 is added to the i-th components of the
321* numerator and denominator before dividing.
322*
323 DO 30 i = 1, n
324 rwork( i ) = cabs1( b( i, j ) )
325 30 CONTINUE
326*
327* Compute abs(op(A))*abs(X) + abs(B).
328*
329 IF( notran ) THEN
330 DO 50 k = 1, n
331 xk = cabs1( x( k, j ) )
332 DO 40 i = 1, n
333 rwork( i ) = rwork( i ) + cabs1( a( i, k ) )*xk
334 40 CONTINUE
335 50 CONTINUE
336 ELSE
337 DO 70 k = 1, n
338 s = zero
339 DO 60 i = 1, n
340 s = s + cabs1( a( i, k ) )*cabs1( x( i, j ) )
341 60 CONTINUE
342 rwork( k ) = rwork( k ) + s
343 70 CONTINUE
344 END IF
345 s = zero
346 DO 80 i = 1, n
347 IF( rwork( i ).GT.safe2 ) THEN
348 s = max( s, cabs1( work( i ) ) / rwork( i ) )
349 ELSE
350 s = max( s, ( cabs1( work( i ) )+safe1 ) /
351 $ ( rwork( i )+safe1 ) )
352 END IF
353 80 CONTINUE
354 berr( j ) = s
355*
356* Test stopping criterion. Continue iterating if
357* 1) The residual BERR(J) is larger than machine epsilon, and
358* 2) BERR(J) decreased by at least a factor of 2 during the
359* last iteration, and
360* 3) At most ITMAX iterations tried.
361*
362 IF( berr( j ).GT.eps .AND. two*berr( j ).LE.lstres .AND.
363 $ count.LE.itmax ) THEN
364*
365* Update solution and try again.
366*
367 CALL cgetrs( trans, n, 1, af, ldaf, ipiv, work, n, info )
368 CALL caxpy( n, one, work, 1, x( 1, j ), 1 )
369 lstres = berr( j )
370 count = count + 1
371 GO TO 20
372 END IF
373*
374* Bound error from formula
375*
376* norm(X - XTRUE) / norm(X) .le. FERR =
377* norm( abs(inv(op(A)))*
378* ( abs(R) + NZ*EPS*( abs(op(A))*abs(X)+abs(B) ))) / norm(X)
379*
380* where
381* norm(Z) is the magnitude of the largest component of Z
382* inv(op(A)) is the inverse of op(A)
383* abs(Z) is the componentwise absolute value of the matrix or
384* vector Z
385* NZ is the maximum number of nonzeros in any row of A, plus 1
386* EPS is machine epsilon
387*
388* The i-th component of abs(R)+NZ*EPS*(abs(op(A))*abs(X)+abs(B))
389* is incremented by SAFE1 if the i-th component of
390* abs(op(A))*abs(X) + abs(B) is less than SAFE2.
391*
392* Use CLACN2 to estimate the infinity-norm of the matrix
393* inv(op(A)) * diag(W),
394* where W = abs(R) + NZ*EPS*( abs(op(A))*abs(X)+abs(B) )))
395*
396 DO 90 i = 1, n
397 IF( rwork( i ).GT.safe2 ) THEN
398 rwork( i ) = cabs1( work( i ) ) + real( nz )*
399 $ eps*rwork( i )
400 ELSE
401 rwork( i ) = cabs1( work( i ) ) + real( nz )*
402 $ eps*rwork( i ) + safe1
403 END IF
404 90 CONTINUE
405*
406 kase = 0
407 100 CONTINUE
408 CALL clacn2( n, work( n+1 ), work, ferr( j ), kase, isave )
409 IF( kase.NE.0 ) THEN
410 IF( kase.EQ.1 ) THEN
411*
412* Multiply by diag(W)*inv(op(A)**H).
413*
414 CALL cgetrs( transt, n, 1, af, ldaf, ipiv, work, n,
415 $ info )
416 DO 110 i = 1, n
417 work( i ) = rwork( i )*work( i )
418 110 CONTINUE
419 ELSE
420*
421* Multiply by inv(op(A))*diag(W).
422*
423 DO 120 i = 1, n
424 work( i ) = rwork( i )*work( i )
425 120 CONTINUE
426 CALL cgetrs( transn, n, 1, af, ldaf, ipiv, work, n,
427 $ info )
428 END IF
429 GO TO 100
430 END IF
431*
432* Normalize error.
433*
434 lstres = zero
435 DO 130 i = 1, n
436 lstres = max( lstres, cabs1( x( i, j ) ) )
437 130 CONTINUE
438 IF( lstres.NE.zero )
439 $ ferr( j ) = ferr( j ) / lstres
440*
441 140 CONTINUE
442*
443 RETURN
444*
445* End of CGERFS
446*
subroutine xerbla(srname, info)
Definition cblat2.f:3285
subroutine caxpy(n, ca, cx, incx, cy, incy)
CAXPY
Definition caxpy.f:88
subroutine ccopy(n, cx, incx, cy, incy)
CCOPY
Definition ccopy.f:81
subroutine cgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
CGEMV
Definition cgemv.f:160
subroutine cgetrs(trans, n, nrhs, a, lda, ipiv, b, ldb, info)
CGETRS
Definition cgetrs.f:119
subroutine clacn2(n, v, x, est, kase, isave)
CLACN2 estimates the 1-norm of a square matrix, using reverse communication for evaluating matrix-vec...
Definition clacn2.f:131
real function slamch(cmach)
SLAMCH
Definition slamch.f:68
logical function lsame(ca, cb)
LSAME
Definition lsame.f:48
Here is the call graph for this function:
Here is the caller graph for this function: