1*> \brief \b CGTT02
2*
3*  =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6*            http://www.netlib.org/lapack/explore-html/
7*
8*  Definition:
9*  ===========
10*
11*       SUBROUTINE CGTT02( TRANS, N, NRHS, DL, D, DU, X, LDX, B, LDB,
12*                          RESID )
13*
14*       .. Scalar Arguments ..
15*       CHARACTER          TRANS
16*       INTEGER            LDB, LDX, N, NRHS
17*       REAL               RESID
18*       ..
19*       .. Array Arguments ..
20*       COMPLEX            B( LDB, * ), D( * ), DL( * ), DU( * ),
21*      $                   X( LDX, * )
22*       ..
23*
24*
25*> \par Purpose:
26*  =============
27*>
28*> \verbatim
29*>
30*> CGTT02 computes the residual for the solution to a tridiagonal
31*> system of equations:
32*>    RESID = norm(B - op(A)*X) / (norm(op(A)) * norm(X) * EPS),
33*> where EPS is the machine epsilon.
34*> \endverbatim
35*
36*  Arguments:
37*  ==========
38*
39*> \param[in] TRANS
40*> \verbatim
41*>          TRANS is CHARACTER
42*>          Specifies the form of the residual.
43*>          = 'N':  B - A    * X  (No transpose)
44*>          = 'T':  B - A**T * X  (Transpose)
45*>          = 'C':  B - A**H * X  (Conjugate transpose)
46*> \endverbatim
47*>
48*> \param[in] N
49*> \verbatim
50*>          N is INTEGTER
51*>          The order of the matrix A.  N >= 0.
52*> \endverbatim
53*>
54*> \param[in] NRHS
55*> \verbatim
56*>          NRHS is INTEGER
57*>          The number of right hand sides, i.e., the number of columns
58*>          of the matrices B and X.  NRHS >= 0.
59*> \endverbatim
60*>
61*> \param[in] DL
62*> \verbatim
63*>          DL is COMPLEX array, dimension (N-1)
64*>          The (n-1) sub-diagonal elements of A.
65*> \endverbatim
66*>
67*> \param[in] D
68*> \verbatim
69*>          D is COMPLEX array, dimension (N)
70*>          The diagonal elements of A.
71*> \endverbatim
72*>
73*> \param[in] DU
74*> \verbatim
75*>          DU is COMPLEX array, dimension (N-1)
76*>          The (n-1) super-diagonal elements of A.
77*> \endverbatim
78*>
79*> \param[in] X
80*> \verbatim
81*>          X is COMPLEX array, dimension (LDX,NRHS)
82*>          The computed solution vectors X.
83*> \endverbatim
84*>
85*> \param[in] LDX
86*> \verbatim
87*>          LDX is INTEGER
88*>          The leading dimension of the array X.  LDX >= max(1,N).
89*> \endverbatim
90*>
91*> \param[in,out] B
92*> \verbatim
93*>          B is COMPLEX array, dimension (LDB,NRHS)
94*>          On entry, the right hand side vectors for the system of
95*>          linear equations.
96*>          On exit, B is overwritten with the difference B - op(A)*X.
97*> \endverbatim
98*>
99*> \param[in] LDB
100*> \verbatim
101*>          LDB is INTEGER
102*>          The leading dimension of the array B.  LDB >= max(1,N).
103*> \endverbatim
104*>
105*> \param[out] RESID
106*> \verbatim
107*>          RESID is REAL
108*>          norm(B - op(A)*X) / (norm(op(A)) * norm(X) * EPS)
109*> \endverbatim
110*
111*  Authors:
112*  ========
113*
114*> \author Univ. of Tennessee
115*> \author Univ. of California Berkeley
116*> \author Univ. of Colorado Denver
117*> \author NAG Ltd.
118*
119*> \ingroup complex_lin
120*
121*  =====================================================================
122      SUBROUTINE CGTT02( TRANS, N, NRHS, DL, D, DU, X, LDX, B, LDB,
123     $                   RESID )
124*
125*  -- LAPACK test routine --
126*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
127*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
128*
129*     .. Scalar Arguments ..
130      CHARACTER          TRANS
131      INTEGER            LDB, LDX, N, NRHS
132      REAL               RESID
133*     ..
134*     .. Array Arguments ..
135      COMPLEX            B( LDB, * ), D( * ), DL( * ), DU( * ),
136     $                   X( LDX, * )
137*     ..
138*
139*  =====================================================================
140*
141*     .. Parameters ..
142      REAL               ONE, ZERO
143      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
144*     ..
145*     .. Local Scalars ..
146      INTEGER            J
147      REAL               ANORM, BNORM, EPS, XNORM
148*     ..
149*     .. External Functions ..
150      LOGICAL            LSAME
151      REAL               CLANGT, SCASUM, SLAMCH
152      EXTERNAL           LSAME, CLANGT, SCASUM, SLAMCH
153*     ..
154*     .. External Subroutines ..
155      EXTERNAL           CLAGTM
156*     ..
157*     .. Intrinsic Functions ..
158      INTRINSIC          MAX
159*     ..
160*     .. Executable Statements ..
161*
162*     Quick exit if N = 0 or NRHS = 0
163*
164      RESID = ZERO
165      IF( N.LE.0 .OR. NRHS.EQ.0 )
166     $   RETURN
167*
168*     Compute the maximum over the number of right hand sides of
169*        norm(B - op(A)*X) / ( norm(op(A)) * norm(X) * EPS ).
170*
171      IF( LSAME( TRANS, 'N' ) ) THEN
172         ANORM = CLANGT( '1', N, DL, D, DU )
173      ELSE
174         ANORM = CLANGT( 'I', N, DL, D, DU )
175      END IF
176*
177*     Exit with RESID = 1/EPS if ANORM = 0.
178*
179      EPS = SLAMCH( 'Epsilon' )
180      IF( ANORM.LE.ZERO ) THEN
181         RESID = ONE / EPS
182         RETURN
183      END IF
184*
185*     Compute B - op(A)*X and store in B.
186*
187      CALL CLAGTM( TRANS, N, NRHS, -ONE, DL, D, DU, X, LDX, ONE, B,
188     $             LDB )
189*
190      DO 10 J = 1, NRHS
191         BNORM = SCASUM( N, B( 1, J ), 1 )
192         XNORM = SCASUM( N, X( 1, J ), 1 )
193         IF( XNORM.LE.ZERO ) THEN
194            RESID = ONE / EPS
195         ELSE
196            RESID = MAX( RESID, ( ( BNORM / ANORM ) / XNORM ) / EPS )
197         END IF
198   10 CONTINUE
199*
200      RETURN
201*
202*     End of CGTT02
203*
204      END
205