skip checking solution in tester since xSYTRI is not implemented to
[platform/upstream/lapack.git] / TESTING / LIN / zsyt01_aa.f
1 *> \brief \b ZSYT01
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 ZSYT01_AA( UPLO, N, A, LDA, AFAC, LDAFAC, IPIV, C, LDC,
12 *                             RWORK, RESID )
13 *
14 *       .. Scalar Arguments ..
15 *       CHARACTER          UPLO
16 *       INTEGER            LDA, LDAFAC, LDC, N
17 *       DOUBLE PRECISION   RESID
18 *       ..
19 *       .. Array Arguments ..
20 *       INTEGER            IPIV( * )
21 *       DOUBLE PRECISION   RWORK( * )
22 *       COMPLEX*16         A( LDA, * ), AFAC( LDAFAC, * ), C( LDC, * ),
23 *       ..
24 *
25 *
26 *> \par Purpose:
27 *  =============
28 *>
29 *> \verbatim
30 *>
31 *> ZSYT01 reconstructs a hermitian indefinite matrix A from its
32 *> block L*D*L' or U*D*U' factorization and computes the residual
33 *>    norm( C - A ) / ( N * norm(A) * EPS ),
34 *> where C is the reconstructed matrix and EPS is the machine epsilon.
35 *> \endverbatim
36 *
37 *  Arguments:
38 *  ==========
39 *
40 *> \param[in] UPLO
41 *> \verbatim
42 *>          UPLO is CHARACTER*1
43 *>          Specifies whether the upper or lower triangular part of the
44 *>          hermitian matrix A is stored:
45 *>          = 'U':  Upper triangular
46 *>          = 'L':  Lower triangular
47 *> \endverbatim
48 *>
49 *> \param[in] N
50 *> \verbatim
51 *>          N is INTEGER
52 *>          The number of rows and columns of the matrix A.  N >= 0.
53 *> \endverbatim
54 *>
55 *> \param[in] A
56 *> \verbatim
57 *>          A is COMPLEX*16 array, dimension (LDA,N)
58 *>          The original hermitian matrix A.
59 *> \endverbatim
60 *>
61 *> \param[in] LDA
62 *> \verbatim
63 *>          LDA is INTEGER
64 *>          The leading dimension of the array A.  LDA >= max(1,N)
65 *> \endverbatim
66 *>
67 *> \param[in] AFAC
68 *> \verbatim
69 *>          AFAC is COMPLEX*16 array, dimension (LDAFAC,N)
70 *>          The factored form of the matrix A.  AFAC contains the block
71 *>          diagonal matrix D and the multipliers used to obtain the
72 *>          factor L or U from the block L*D*L' or U*D*U' factorization
73 *>          as computed by ZSYTRF.
74 *> \endverbatim
75 *>
76 *> \param[in] LDAFAC
77 *> \verbatim
78 *>          LDAFAC is INTEGER
79 *>          The leading dimension of the array AFAC.  LDAFAC >= max(1,N).
80 *> \endverbatim
81 *>
82 *> \param[in] IPIV
83 *> \verbatim
84 *>          IPIV is INTEGER array, dimension (N)
85 *>          The pivot indices from ZSYTRF.
86 *> \endverbatim
87 *>
88 *> \param[out] C
89 *> \verbatim
90 *>          C is COMPLEX*16 array, dimension (LDC,N)
91 *> \endverbatim
92 *>
93 *> \param[in] LDC
94 *> \verbatim
95 *>          LDC is INTEGER
96 *>          The leading dimension of the array C.  LDC >= max(1,N).
97 *> \endverbatim
98 *>
99 *> \param[out] RWORK
100 *> \verbatim
101 *>          RWORK is COMPLEX*16 array, dimension (N)
102 *> \endverbatim
103 *>
104 *> \param[out] RESID
105 *> \verbatim
106 *>          RESID is COMPLEX*16
107 *>          If UPLO = 'L', norm(L*D*L' - A) / ( N * norm(A) * EPS )
108 *>          If UPLO = 'U', norm(U*D*U' - A) / ( N * norm(A) * 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 *> \date November 2016
120 *
121 *  @generated from LIN/dsyt01_aa.f, fortran d -> z, Thu Nov 17 13:01:50 2016
122 *
123 *> \ingroup complex16_lin
124 *
125 *  =====================================================================
126       SUBROUTINE ZSYT01_AA( UPLO, N, A, LDA, AFAC, LDAFAC, IPIV, C,
127      $                      LDC, RWORK, RESID )
128 *
129 *  -- LAPACK test routine (version 3.5.0) --
130 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
131 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
132 *     November 2016
133 *
134 *     .. Scalar Arguments ..
135       CHARACTER          UPLO
136       INTEGER            LDA, LDAFAC, LDC, N
137       DOUBLE PRECISION   RESID
138 *     ..
139 *     .. Array Arguments ..
140       INTEGER            IPIV( * )
141       COMPLEX*16         A( LDA, * ), AFAC( LDAFAC, * ), C( LDC, * )
142       DOUBLE PRECISION   RWORK( * )
143 *     ..
144 *
145 *  =====================================================================
146 *
147 *     .. Parameters ..
148       DOUBLE PRECISION   ZERO, ONE
149       PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
150       COMPLEX*16         CZERO, CONE
151       PARAMETER          ( CZERO = 0.0E+0, CONE = 1.0E+0 )
152 *     ..
153 *     .. Local Scalars ..
154       INTEGER            I, J
155       DOUBLE PRECISION   ANORM, EPS
156 *     ..
157 *     .. External Functions ..
158       LOGICAL            LSAME
159       DOUBLE PRECISION   DLAMCH, ZLANSY
160       EXTERNAL           LSAME, DLAMCH, ZLANSY
161 *     ..
162 *     .. External Subroutines ..
163       EXTERNAL           ZLASET, ZLAVSY
164 *     ..
165 *     .. Intrinsic Functions ..
166       INTRINSIC          DBLE
167 *     ..
168 *     .. Executable Statements ..
169 *
170 *     Quick exit if N = 0.
171 *
172       IF( N.LE.0 ) THEN
173          RESID = ZERO
174          RETURN
175       END IF
176 *
177 *     Determine EPS and the norm of A.
178 *
179       EPS = DLAMCH( 'Epsilon' )
180       ANORM = ZLANSY( '1', UPLO, N, A, LDA, RWORK )
181 *
182 *     Initialize C to the tridiagonal matrix T.
183 *
184       CALL ZLASET( 'Full', N, N, CZERO, CZERO, C, LDC )
185       CALL ZLACPY( 'F', 1, N, AFAC( 1, 1 ), LDAFAC+1, C( 1, 1 ), LDC+1 )
186       IF( N.GT.1 ) THEN
187          IF( LSAME( UPLO, 'U' ) ) THEN
188             CALL ZLACPY( 'F', 1, N-1, AFAC( 1, 2 ), LDAFAC+1, C( 1, 2 ),
189      $                   LDC+1 )
190             CALL ZLACPY( 'F', 1, N-1, AFAC( 1, 2 ), LDAFAC+1, C( 2, 1 ),
191      $                   LDC+1 )
192          ELSE
193             CALL ZLACPY( 'F', 1, N-1, AFAC( 2, 1 ), LDAFAC+1, C( 1, 2 ),
194      $                   LDC+1 )
195             CALL ZLACPY( 'F', 1, N-1, AFAC( 2, 1 ), LDAFAC+1, C( 2, 1 ),
196      $                   LDC+1 )
197          ENDIF
198 *
199 *        Call ZTRMM to form the product U' * D (or L * D ).
200 *
201          IF( LSAME( UPLO, 'U' ) ) THEN
202             CALL ZTRMM( 'Left', UPLO, 'Transpose', 'Unit', N-1, N,
203      $                  CONE, AFAC( 1, 2 ), LDAFAC, C( 2, 1 ), LDC )
204          ELSE
205             CALL ZTRMM( 'Left', UPLO, 'No transpose', 'Unit', N-1, N,
206      $                  CONE, AFAC( 2, 1 ), LDAFAC, C( 2, 1 ), LDC )
207          END IF
208 *
209 *        Call ZTRMM again to multiply by U (or L ).
210 *
211          IF( LSAME( UPLO, 'U' ) ) THEN
212             CALL ZTRMM( 'Right', UPLO, 'No transpose', 'Unit', N, N-1,
213      $                  CONE, AFAC( 1, 2 ), LDAFAC, C( 1, 2 ), LDC )
214          ELSE
215             CALL ZTRMM( 'Right', UPLO, 'Transpose', 'Unit', N, N-1,
216      $                  CONE, AFAC( 2, 1 ), LDAFAC, C( 1, 2 ), LDC )
217          END IF
218       ENDIF
219 *
220 *     Apply symmetric pivots
221 *
222       DO J = N, 1, -1
223          I = IPIV( J )
224          IF( I.NE.J )
225      $      CALL ZSWAP( N, C( J, 1 ), LDC, C( I, 1 ), LDC )
226       END DO
227       DO J = N, 1, -1
228          I = IPIV( J )
229          IF( I.NE.J )
230      $      CALL ZSWAP( N, C( 1, J ), 1, C( 1, I ), 1 )
231       END DO
232 *
233 *
234 *     Compute the difference  C - A .
235 *
236       IF( LSAME( UPLO, 'U' ) ) THEN
237          DO J = 1, N
238             DO I = 1, J
239                C( I, J ) = C( I, J ) - A( I, J )
240             END DO
241          END DO
242       ELSE
243          DO J = 1, N
244             DO I = J, N
245                C( I, J ) = C( I, J ) - A( I, J )
246             END DO
247          END DO
248       END IF
249 *
250 *     Compute norm( C - A ) / ( N * norm(A) * EPS )
251 *
252       RESID = ZLANSY( '1', UPLO, N, C, LDC, RWORK )
253 *
254       IF( ANORM.LE.ZERO ) THEN
255          IF( RESID.NE.ZERO )
256      $      RESID = ONE / EPS
257       ELSE
258          RESID = ( ( RESID / DBLE( N ) ) / ANORM ) / EPS
259       END IF
260 *
261       RETURN
262 *
263 *     End of ZSYT01
264 *
265       END