1       SUBROUTINE ZPTT01( N, D, E, DF, EF, WORK, RESID )
  2 *
  3 *  -- LAPACK test routine (version 3.1) --
  4 *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
  5 *     November 2006
  6 *
  7 *     .. Scalar Arguments ..
  8       INTEGER            N
  9       DOUBLE PRECISION   RESID
 10 *     ..
 11 *     .. Array Arguments ..
 12       DOUBLE PRECISION   D( * ), DF( * )
 13       COMPLEX*16         E( * ), EF( * ), WORK( * )
 14 *     ..
 15 *
 16 *  Purpose
 17 *  =======
 18 *
 19 *  ZPTT01 reconstructs a tridiagonal matrix A from its L*D*L'
 20 *  factorization and computes the residual
 21 *     norm(L*D*L' - A) / ( n * norm(A) * EPS ),
 22 *  where EPS is the machine epsilon.
 23 *
 24 *  Arguments
 25 *  =========
 26 *
 27 *  N       (input) INTEGTER
 28 *          The order of the matrix A.
 29 *
 30 *  D       (input) DOUBLE PRECISION array, dimension (N)
 31 *          The n diagonal elements of the tridiagonal matrix A.
 32 *
 33 *  E       (input) COMPLEX*16 array, dimension (N-1)
 34 *          The (n-1) subdiagonal elements of the tridiagonal matrix A.
 35 *
 36 *  DF      (input) DOUBLE PRECISION array, dimension (N)
 37 *          The n diagonal elements of the factor L from the L*D*L'
 38 *          factorization of A.
 39 *
 40 *  EF      (input) COMPLEX*16 array, dimension (N-1)
 41 *          The (n-1) subdiagonal elements of the factor L from the
 42 *          L*D*L' factorization of A.
 43 *
 44 *  WORK    (workspace) COMPLEX*16 array, dimension (2*N)
 45 *
 46 *  RESID   (output) DOUBLE PRECISION
 47 *          norm(L*D*L' - A) / (n * norm(A) * EPS)
 48 *
 49 *  =====================================================================
 50 *
 51 *     .. Parameters ..
 52       DOUBLE PRECISION   ONE, ZERO
 53       PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
 54 *     ..
 55 *     .. Local Scalars ..
 56       INTEGER            I
 57       DOUBLE PRECISION   ANORM, EPS
 58       COMPLEX*16         DE
 59 *     ..
 60 *     .. External Functions ..
 61       DOUBLE PRECISION   DLAMCH
 62       EXTERNAL           DLAMCH
 63 *     ..
 64 *     .. Intrinsic Functions ..
 65       INTRINSIC          ABSDBLEDCONJGMAX
 66 *     ..
 67 *     .. Executable Statements ..
 68 *
 69 *     Quick return if possible
 70 *
 71       IF( N.LE.0 ) THEN
 72          RESID = ZERO
 73          RETURN
 74       END IF
 75 *
 76       EPS = DLAMCH( 'Epsilon' )
 77 *
 78 *     Construct the difference L*D*L' - A.
 79 *
 80       WORK( 1 ) = DF( 1 ) - D( 1 )
 81       DO 10 I = 1, N - 1
 82          DE = DF( I )*EF( I )
 83          WORK( N+I ) = DE - E( I )
 84          WORK( 1+I ) = DE*DCONJG( EF( I ) ) + DF( I+1 ) - D( I+1 )
 85    10 CONTINUE
 86 *
 87 *     Compute the 1-norms of the tridiagonal matrices A and WORK.
 88 *
 89       IF( N.EQ.1 ) THEN
 90          ANORM = D( 1 )
 91          RESID = ABS( WORK( 1 ) )
 92       ELSE
 93          ANORM = MAX( D( 1 )+ABS( E( 1 ) ), D( N )+ABS( E( N-1 ) ) )
 94          RESID = MAXABS( WORK( 1 ) )+ABS( WORK( N+1 ) ),
 95      $           ABS( WORK( N ) )+ABS( WORK( 2*N-1 ) ) )
 96          DO 20 I = 2, N - 1
 97             ANORM = MAX( ANORM, D( I )+ABS( E( I ) )+ABS( E( I-1 ) ) )
 98             RESID = MAX( RESID, ABS( WORK( I ) )+ABS( WORK( N+I-1 ) )+
 99      $              ABS( WORK( N+I ) ) )
100    20    CONTINUE
101       END IF
102 *
103 *     Compute norm(L*D*L' - A) / (n * norm(A) * EPS)
104 *
105       IF( ANORM.LE.ZERO ) THEN
106          IF( RESID.NE.ZERO )
107      $      RESID = ONE / EPS
108       ELSE
109          RESID = ( ( RESID / DBLE( N ) ) / ANORM ) / EPS
110       END IF
111 *
112       RETURN
113 *
114 *     End of ZPTT01
115 *
116       END