This is related to #135
[platform/upstream/lapack.git] / SRC / zsytrs_aa.f
1 *> \brief \b ZSYTRS_AA
2 *
3 *  =========== DOCUMENTATION ===========
4 *
5 * Online html documentation available at
6 *            http://www.netlib.org/lapack/explore-html/
7 *
8 *> \htmlonly
9 *> Download ZSYTRS_AA + dependencies
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zsytrs_aa.f">
11 *> [TGZ]</a>
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zsytrs_aa.f">
13 *> [ZIP]</a>
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zsytrs_aa.f">
15 *> [TXT]</a>
16 *> \endhtmlonly
17 *
18 *  Definition:
19 *  ===========
20 *
21 *       SUBROUTINE ZSYTRS_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB,
22 *                             WORK, LWORK, INFO )
23 *
24 *       .. Scalar Arguments ..
25 *       CHARACTER          UPLO
26 *       INTEGER            N, NRHS, LDA, LDB, LWORK, INFO
27 *       ..
28 *       .. Array Arguments ..
29 *       INTEGER            IPIV( * )
30 *       COMPLEX*16         A( LDA, * ), B( LDB, * ), WORK( * )
31 *       ..
32 *
33 *
34 *> \par Purpose:
35 *  =============
36 *>
37 *> \verbatim
38 *>
39 *> ZSYTRS_AA solves a system of linear equations A*X = B with a complex
40 *> symmetric matrix A using the factorization A = U*T*U**T or
41 *> A = L*T*L**T computed by ZSYTRF_AA.
42 *> \endverbatim
43 *
44 *  Arguments:
45 *  ==========
46 *
47 *> \param[in] UPLO
48 *> \verbatim
49 *>          UPLO is CHARACTER*1
50 *>          Specifies whether the details of the factorization are stored
51 *>          as an upper or lower triangular matrix.
52 *>          = 'U':  Upper triangular, form is A = U*T*U**T;
53 *>          = 'L':  Lower triangular, form is A = L*T*L**T.
54 *> \endverbatim
55 *>
56 *> \param[in] N
57 *> \verbatim
58 *>          N is INTEGER
59 *>          The order of the matrix A.  N >= 0.
60 *> \endverbatim
61 *>
62 *> \param[in] NRHS
63 *> \verbatim
64 *>          NRHS is INTEGER
65 *>          The number of right hand sides, i.e., the number of columns
66 *>          of the matrix B.  NRHS >= 0.
67 *> \endverbatim
68 *>
69 *> \param[in,out] A
70 *> \verbatim
71 *>          A is COMPLEX*16 array, dimension (LDA,N)
72 *>          Details of factors computed by ZSYTRF_AA.
73 *> \endverbatim
74 *>
75 *> \param[in] LDA
76 *> \verbatim
77 *>          LDA is INTEGER
78 *>          The leading dimension of the array A.  LDA >= max(1,N).
79 *> \endverbatim
80 *>
81 *> \param[in] IPIV
82 *> \verbatim
83 *>          IPIV is INTEGER array, dimension (N)
84 *>          Details of the interchanges as computed by ZSYTRF_AA.
85 *> \endverbatim
86 *>
87 *> \param[in,out] B
88 *> \verbatim
89 *>          B is COMPLEX*16 array, dimension (LDB,NRHS)
90 *>          On entry, the right hand side matrix B.
91 *>          On exit, the solution matrix X.
92 *> \endverbatim
93 *>
94 *> \param[in] LDB
95 *> \verbatim
96 *>          LDB is INTEGER
97 *>          The leading dimension of the array B.  LDB >= max(1,N).
98 *> \endverbatim
99 *>
100 *> \param[in] WORK
101 *> \verbatim
102 *>          WORK is DOUBLE array, dimension (MAX(1,LWORK))
103 *> \endverbatim
104 *>
105 *> \param[in] LWORK
106 *> \verbatim
107 *>          LWORK is INTEGER, LWORK >= MAX(1,3*N-2).
108 *>
109 *> \param[out] INFO
110 *> \verbatim
111 *>          INFO is INTEGER
112 *>          = 0:  successful exit
113 *>          < 0:  if INFO = -i, the i-th argument had an illegal value
114 *> \endverbatim
115 *
116 *  Authors:
117 *  ========
118 *
119 *> \author Univ. of Tennessee
120 *> \author Univ. of California Berkeley
121 *> \author Univ. of Colorado Denver
122 *> \author NAG Ltd.
123 *
124 *> \date December 2016
125 *
126 *> \ingroup complex16SYcomputational
127 *
128 *  =====================================================================
129       SUBROUTINE ZSYTRS_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB,
130      $                      WORK, LWORK, INFO )
131 *
132 *  -- LAPACK computational routine (version 3.7.0) --
133 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
134 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
135 *     December 2016
136 *
137       IMPLICIT NONE
138 *
139 *     .. Scalar Arguments ..
140       CHARACTER          UPLO
141       INTEGER            N, NRHS, LDA, LDB, LWORK, INFO
142 *     ..
143 *     .. Array Arguments ..
144       INTEGER            IPIV( * )
145       COMPLEX*16         A( LDA, * ), B( LDB, * ), WORK( * )
146 *     ..
147 *
148 *  =====================================================================
149 *
150       COMPLEX*16         ONE
151       PARAMETER          ( ONE = 1.0D+0 )
152 *     ..
153 *     .. Local Scalars ..
154       LOGICAL            LQUERY, UPPER
155       INTEGER            K, KP, LWKOPT
156 *     ..
157 *     .. External Functions ..
158       LOGICAL            LSAME
159       EXTERNAL           LSAME
160 *     ..
161 *     .. External Subroutines ..
162       EXTERNAL           ZGTSV, ZSWAP, ZTRSM, XERBLA
163 *     ..
164 *     .. Intrinsic Functions ..
165       INTRINSIC          MAX
166 *     ..
167 *     .. Executable Statements ..
168 *
169       INFO = 0
170       UPPER = LSAME( UPLO, 'U' )
171       LQUERY = ( LWORK.EQ.-1 )
172       IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
173          INFO = -1
174       ELSE IF( N.LT.0 ) THEN
175          INFO = -2
176       ELSE IF( NRHS.LT.0 ) THEN
177          INFO = -3
178       ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
179          INFO = -5
180       ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
181          INFO = -8
182       ELSE IF( LWORK.LT.MAX( 1, 3*N-2 ) .AND. .NOT.LQUERY ) THEN
183          INFO = -10
184       END IF
185       IF( INFO.NE.0 ) THEN
186          CALL XERBLA( 'ZSYTRS_AA', -INFO )
187          RETURN
188       ELSE IF( LQUERY ) THEN
189          LWKOPT = (3*N-2)
190          WORK( 1 ) = LWKOPT
191          RETURN
192       END IF
193 *
194 *     Quick return if possible
195 *
196       IF( N.EQ.0 .OR. NRHS.EQ.0 )
197      $   RETURN
198 *
199       IF( UPPER ) THEN
200 *
201 *        Solve A*X = B, where A = U*T*U**T.
202 *
203 *        Pivot, P**T * B
204 *
205          DO K = 1, N
206             KP = IPIV( K )
207             IF( KP.NE.K )
208      $          CALL ZSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
209          END DO
210 *
211 *        Compute (U \P**T * B) -> B    [ (U \P**T * B) ]
212 *
213          CALL ZTRSM('L', 'U', 'T', 'U', N-1, NRHS, ONE, A( 1, 2 ), LDA,
214      $               B( 2, 1 ), LDB)
215 *
216 *        Compute T \ B -> B   [ T \ (U \P**T * B) ]
217 *
218          CALL ZLACPY( 'F', 1, N, A( 1, 1 ), LDA+1, WORK( N ), 1)
219          IF( N.GT.1 ) THEN
220             CALL ZLACPY( 'F', 1, N-1, A( 1, 2 ), LDA+1, WORK( 1 ), 1 )
221             CALL ZLACPY( 'F', 1, N-1, A( 1, 2 ), LDA+1, WORK( 2*N ), 1 )
222          END IF
223          CALL ZGTSV( N, NRHS, WORK( 1 ), WORK( N ), WORK( 2*N ), B, LDB,
224      $               INFO )
225 *
226 *        Compute (U**T \ B) -> B   [ U**T \ (T \ (U \P**T * B) ) ]
227 *
228          CALL ZTRSM( 'L', 'U', 'N', 'U', N-1, NRHS, ONE, A( 1, 2 ), LDA,
229      $               B( 2, 1 ), LDB)
230 *
231 *        Pivot, P * B  [ P * (U**T \ (T \ (U \P**T * B) )) ]
232 *
233          DO K = N, 1, -1
234             KP = IPIV( K )
235             IF( KP.NE.K )
236      $         CALL ZSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
237          END DO
238 *
239       ELSE
240 *
241 *        Solve A*X = B, where A = L*T*L**T.
242 *
243 *        Pivot, P**T * B
244 *
245          DO K = 1, N
246             KP = IPIV( K )
247             IF( KP.NE.K )
248      $         CALL ZSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
249          END DO
250 *
251 *        Compute (L \P**T * B) -> B    [ (L \P**T * B) ]
252 *
253          CALL ZTRSM( 'L', 'L', 'N', 'U', N-1, NRHS, ONE, A( 2, 1 ), LDA,
254      $               B( 2, 1 ), LDB)
255 *
256 *        Compute T \ B -> B   [ T \ (L \P**T * B) ]
257 *
258          CALL ZLACPY( 'F', 1, N, A(1, 1), LDA+1, WORK(N), 1)
259          IF( N.GT.1 ) THEN
260             CALL ZLACPY( 'F', 1, N-1, A( 2, 1 ), LDA+1, WORK( 1 ), 1 )
261             CALL ZLACPY( 'F', 1, N-1, A( 2, 1 ), LDA+1, WORK( 2*N ), 1 )
262          END IF
263          CALL ZGTSV( N, NRHS, WORK( 1 ), WORK(N), WORK( 2*N ), B, LDB,
264      $               INFO)
265 *
266 *        Compute (L**T \ B) -> B   [ L**T \ (T \ (L \P**T * B) ) ]
267 *
268          CALL ZTRSM( 'L', 'L', 'T', 'U', N-1, NRHS, ONE, A( 2, 1 ), LDA,
269      $              B( 2, 1 ), LDB)
270 *
271 *        Pivot, P * B  [ P * (L**T \ (T \ (L \P**T * B) )) ]
272 *
273          DO K = N, 1, -1
274             KP = IPIV( K )
275             IF( KP.NE.K )
276      $         CALL ZSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
277          END DO
278 *
279       END IF
280 *
281       RETURN
282 *
283 *     End of ZSYTRS_AA
284 *
285       END