1: *> \brief <b> ZSYSV_AA_2STAGE computes the solution to system of linear equations A * X = B for SY matrices</b>
2: *
3: * =========== DOCUMENTATION ===========
4: *
5: * Online html documentation available at
6: * http://www.netlib.org/lapack/explore-html/
7: *
8: *> \htmlonly
9: *> Download ZSYSV_AA_2STAGE + dependencies
10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zsysv_aasen_2stage.f">
11: *> [TGZ]</a>
12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zsysv_aasen_2stage.f">
13: *> [ZIP]</a>
14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zsysv_aasen_2stage.f">
15: *> [TXT]</a>
16: *> \endhtmlonly
17: *
18: * Definition:
19: * ===========
20: *
21: * SUBROUTINE ZSYSV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
22: * IPIV, IPIV2, B, LDB, WORK, LWORK,
23: * INFO )
24: *
25: * .. Scalar Arguments ..
26: * CHARACTER UPLO
27: * INTEGER N, NRHS, LDA, LTB, LDB, LWORK, INFO
28: * ..
29: * .. Array Arguments ..
30: * INTEGER IPIV( * ), IPIV2( * )
31: * COMPLEX*16 A( LDA, * ), TB( * ), B( LDB, *), WORK( * )
32: * ..
33: *
34: *> \par Purpose:
35: * =============
36: *>
37: *> \verbatim
38: *>
39: *> ZSYSV_AA_2STAGE computes the solution to a complex system of
40: *> linear equations
41: *> A * X = B,
42: *> where A is an N-by-N symmetric matrix and X and B are N-by-NRHS
43: *> matrices.
44: *>
45: *> Aasen's 2-stage algorithm is used to factor A as
46: *> A = U * T * U**H, if UPLO = 'U', or
47: *> A = L * T * L**H, if UPLO = 'L',
48: *> where U (or L) is a product of permutation and unit upper (lower)
49: *> triangular matrices, and T is symmetric and band. The matrix T is
50: *> then LU-factored with partial pivoting. The factored form of A
51: *> is then used to solve the system of equations A * X = B.
52: *>
53: *> This is the blocked version of the algorithm, calling Level 3 BLAS.
54: *> \endverbatim
55: *
56: * Arguments:
57: * ==========
58: *
59: *> \param[in] UPLO
60: *> \verbatim
61: *> UPLO is CHARACTER*1
62: *> = 'U': Upper triangle of A is stored;
63: *> = 'L': Lower triangle of A is stored.
64: *> \endverbatim
65: *>
66: *> \param[in] N
67: *> \verbatim
68: *> N is INTEGER
69: *> The order of the matrix A. N >= 0.
70: *> \endverbatim
71: *>
72: *> \param[in] NRHS
73: *> \verbatim
74: *> NRHS is INTEGER
75: *> The number of right hand sides, i.e., the number of columns
76: *> of the matrix B. NRHS >= 0.
77: *> \endverbatim
78: *>
79: *> \param[in,out] A
80: *> \verbatim
81: *> A is COMPLEX*16 array, dimension (LDA,N)
82: *> On entry, the symmetric matrix A. If UPLO = 'U', the leading
83: *> N-by-N upper triangular part of A contains the upper
84: *> triangular part of the matrix A, and the strictly lower
85: *> triangular part of A is not referenced. If UPLO = 'L', the
86: *> leading N-by-N lower triangular part of A contains the lower
87: *> triangular part of the matrix A, and the strictly upper
88: *> triangular part of A is not referenced.
89: *>
90: *> On exit, L is stored below (or above) the subdiaonal blocks,
91: *> when UPLO is 'L' (or 'U').
92: *> \endverbatim
93: *>
94: *> \param[in] LDA
95: *> \verbatim
96: *> LDA is INTEGER
97: *> The leading dimension of the array A. LDA >= max(1,N).
98: *> \endverbatim
99: *>
100: *> \param[out] TB
101: *> \verbatim
102: *> TB is COMPLEX*16 array, dimension (LTB)
103: *> On exit, details of the LU factorization of the band matrix.
104: *> \endverbatim
105: *>
106: *> \param[in] LTB
107: *> \verbatim
108: *> The size of the array TB. LTB >= 4*N, internally
109: *> used to select NB such that LTB >= (3*NB+1)*N.
110: *>
111: *> If LTB = -1, then a workspace query is assumed; the
112: *> routine only calculates the optimal size of LTB,
113: *> returns this value as the first entry of TB, and
114: *> no error message related to LTB is issued by XERBLA.
115: *> \endverbatim
116: *>
117: *> \param[out] IPIV
118: *> \verbatim
119: *> IPIV is INTEGER array, dimension (N)
120: *> On exit, it contains the details of the interchanges, i.e.,
121: *> the row and column k of A were interchanged with the
122: *> row and column IPIV(k).
123: *> \endverbatim
124: *>
125: *> \param[out] IPIV2
126: *> \verbatim
127: *> IPIV is INTEGER array, dimension (N)
128: *> On exit, it contains the details of the interchanges, i.e.,
129: *> the row and column k of T were interchanged with the
130: *> row and column IPIV(k).
131: *> \endverbatim
132: *>
133: *> \param[in,out] B
134: *> \verbatim
135: *> B is COMPLEX*16 array, dimension (LDB,NRHS)
136: *> On entry, the right hand side matrix B.
137: *> On exit, the solution matrix X.
138: *> \endverbatim
139: *>
140: *> \param[in] LDB
141: *> \verbatim
142: *> LDB is INTEGER
143: *> The leading dimension of the array B. LDB >= max(1,N).
144: *> \endverbatim
145: *>
146: *> \param[out] WORK
147: *> \verbatim
148: *> WORK is COMPLEX*16 workspace of size LWORK
149: *> \endverbatim
150: *>
151: *> \param[in] LWORK
152: *> \verbatim
153: *> The size of WORK. LWORK >= N, internally used to select NB
154: *> such that LWORK >= N*NB.
155: *>
156: *> If LWORK = -1, then a workspace query is assumed; the
157: *> routine only calculates the optimal size of the WORK array,
158: *> returns this value as the first entry of the WORK array, and
159: *> no error message related to LWORK is issued by XERBLA.
160: *> \endverbatim
161: *>
162: *> \param[out] INFO
163: *> \verbatim
164: *> INFO is INTEGER
165: *> = 0: successful exit
166: *> < 0: if INFO = -i, the i-th argument had an illegal value.
167: *> > 0: if INFO = i, band LU factorization failed on i-th column
168: *> \endverbatim
169: *
170: * Authors:
171: * ========
172: *
173: *> \author Univ. of Tennessee
174: *> \author Univ. of California Berkeley
175: *> \author Univ. of Colorado Denver
176: *> \author NAG Ltd.
177: *
178: *> \date November 2017
179: *
180: *> \ingroup complex16SYcomputational
181: *
182: * =====================================================================
183: SUBROUTINE ZSYSV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
184: $ IPIV, IPIV2, B, LDB, WORK, LWORK,
185: $ INFO )
186: *
187: * -- LAPACK computational routine (version 3.8.0) --
188: * -- LAPACK is a software package provided by Univ. of Tennessee, --
189: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
190: * November 2017
191: *
192: IMPLICIT NONE
193: *
194: * .. Scalar Arguments ..
195: CHARACTER UPLO
196: INTEGER N, NRHS, LDA, LDB, LTB, LWORK, INFO
197: * ..
198: * .. Array Arguments ..
199: INTEGER IPIV( * ), IPIV2( * )
200: COMPLEX*16 A( LDA, * ), B( LDB, * ), TB( * ), WORK( * )
201: * ..
202: *
203: * =====================================================================
204: *
205: * .. Local Scalars ..
206: LOGICAL UPPER, TQUERY, WQUERY
207: INTEGER LWKOPT
208: * ..
209: * .. External Functions ..
210: LOGICAL LSAME
211: EXTERNAL LSAME
212: * ..
213: * .. External Subroutines ..
214: EXTERNAL XERBLA, ZSYTRF_AA_2STAGE,
215: $ ZSYTRS_AA_2STAGE
216: * ..
217: * .. Intrinsic Functions ..
218: INTRINSIC MAX
219: * ..
220: * .. Executable Statements ..
221: *
222: * Test the input parameters.
223: *
224: INFO = 0
225: UPPER = LSAME( UPLO, 'U' )
226: WQUERY = ( LWORK.EQ.-1 )
227: TQUERY = ( LTB.EQ.-1 )
228: IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
229: INFO = -1
230: ELSE IF( N.LT.0 ) THEN
231: INFO = -2
232: ELSE IF( NRHS.LT.0 ) THEN
233: INFO = -3
234: ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
235: INFO = -5
236: ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
237: INFO = -11
238: END IF
239: *
240: IF( INFO.EQ.0 ) THEN
241: CALL ZSYTRF_AA_2STAGE( UPLO, N, A, LDA, TB, -1, IPIV,
242: $ IPIV2, WORK, -1, INFO )
243: LWKOPT = INT( WORK(1) )
244: IF( LTB.LT.INT( TB(1) ) .AND. .NOT.TQUERY ) THEN
245: INFO = -7
246: ELSE IF( LWORK.LT.LWKOPT .AND. .NOT.WQUERY ) THEN
247: INFO = -13
248: END IF
249: END IF
250: *
251: IF( INFO.NE.0 ) THEN
252: CALL XERBLA( 'ZSYSV_AA_2STAGE', -INFO )
253: RETURN
254: ELSE IF( WQUERY .OR. TQUERY ) THEN
255: RETURN
256: END IF
257: *
258: *
259: * Compute the factorization A = U*T*U**H or A = L*T*L**H.
260: *
261: CALL ZSYTRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV, IPIV2,
262: $ WORK, LWORK, INFO )
263: IF( INFO.EQ.0 ) THEN
264: *
265: * Solve the system A*X = B, overwriting B with X.
266: *
267: CALL ZSYTRS_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB, IPIV,
268: $ IPIV2, B, LDB, INFO )
269: *
270: END IF
271: *
272: WORK( 1 ) = LWKOPT
273: *
274: * End of ZSYSV_AA_2STAGE
275: *
276: END
CVSweb interface <joel.bertrand@systella.fr>