LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
zhesv_aa_2stage.f
Go to the documentation of this file.
1*> \brief <b> ZHESV_AA_2STAGE computes the solution to system of linear equations A * X = B for HE matrices</b>
2*
3* =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6* http://www.netlib.org/lapack/explore-html/
7*
8*> Download ZHESV_AA_2STAGE + dependencies
9*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zhesv_aa_2stage.f">
10*> [TGZ]</a>
11*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zhesv_aa_2stage.f">
12*> [ZIP]</a>
13*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zhesv_aa_2stage.f">
14*> [TXT]</a>
15*
16* Definition:
17* ===========
18*
19* SUBROUTINE ZHESV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
20* IPIV, IPIV2, B, LDB, WORK, LWORK,
21* INFO )
22*
23* .. Scalar Arguments ..
24* CHARACTER UPLO
25* INTEGER N, NRHS, LDA, LTB, LDB, LWORK, INFO
26* ..
27* .. Array Arguments ..
28* INTEGER IPIV( * ), IPIV2( * )
29* COMPLEX*16 A( LDA, * ), TB( * ), B( LDB, *), WORK( * )
30* ..
31*
32*
33*> \par Purpose:
34* =============
35*>
36*> \verbatim
37*>
38*> ZHESV_AA_2STAGE computes the solution to a complex system of
39*> linear equations
40*> A * X = B,
41*> where A is an N-by-N Hermitian matrix and X and B are N-by-NRHS
42*> matrices.
43*>
44*> Aasen's 2-stage algorithm is used to factor A as
45*> A = U**H * T * U, if UPLO = 'U', or
46*> A = L * T * L**H, if UPLO = 'L',
47*> where U (or L) is a product of permutation and unit upper (lower)
48*> triangular matrices, and T is Hermitian and band. The matrix T is
49*> then LU-factored with partial pivoting. The factored form of A
50*> is then used to solve the system of equations A * X = B.
51*>
52*> This is the blocked version of the algorithm, calling Level 3 BLAS.
53*> \endverbatim
54*
55* Arguments:
56* ==========
57*
58*> \param[in] UPLO
59*> \verbatim
60*> UPLO is CHARACTER*1
61*> = 'U': Upper triangle of A is stored;
62*> = 'L': Lower triangle of A is stored.
63*> \endverbatim
64*>
65*> \param[in] N
66*> \verbatim
67*> N is INTEGER
68*> The order of the matrix A. N >= 0.
69*> \endverbatim
70*>
71*> \param[in] NRHS
72*> \verbatim
73*> NRHS is INTEGER
74*> The number of right hand sides, i.e., the number of columns
75*> of the matrix B. NRHS >= 0.
76*> \endverbatim
77*>
78*> \param[in,out] A
79*> \verbatim
80*> A is COMPLEX*16 array, dimension (LDA,N)
81*> On entry, the hermitian matrix A. If UPLO = 'U', the leading
82*> N-by-N upper triangular part of A contains the upper
83*> triangular part of the matrix A, and the strictly lower
84*> triangular part of A is not referenced. If UPLO = 'L', the
85*> leading N-by-N lower triangular part of A contains the lower
86*> triangular part of the matrix A, and the strictly upper
87*> triangular part of A is not referenced.
88*>
89*> On exit, L is stored below (or above) the subdiagonal blocks,
90*> when UPLO is 'L' (or 'U').
91*> \endverbatim
92*>
93*> \param[in] LDA
94*> \verbatim
95*> LDA is INTEGER
96*> The leading dimension of the array A. LDA >= max(1,N).
97*> \endverbatim
98*>
99*> \param[out] TB
100*> \verbatim
101*> TB is COMPLEX*16 array, dimension (MAX(1,LTB)).
102*> On exit, details of the LU factorization of the band matrix.
103*> \endverbatim
104*>
105*> \param[in] LTB
106*> \verbatim
107*> LTB is INTEGER
108*> The size of the array TB. LTB >= MAX(1,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*> IPIV2 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 (MAX(1,LWORK)).
149*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
150*> \endverbatim
151*>
152*> \param[in] LWORK
153*> \verbatim
154*> LWORK is INTEGER
155*> The size of WORK. LWORK >= MAX(1,N), internally used to
156*> select NB such that LWORK >= N*NB.
157*>
158*> If LWORK = -1, then a workspace query is assumed; the
159*> routine only calculates the optimal size of the WORK array,
160*> returns this value as the first entry of the WORK array, and
161*> no error message related to LWORK is issued by XERBLA.
162*> \endverbatim
163*>
164*> \param[out] INFO
165*> \verbatim
166*> INFO is INTEGER
167*> = 0: successful exit
168*> < 0: if INFO = -i, the i-th argument had an illegal value.
169*> > 0: if INFO = i, band LU factorization failed on i-th column
170*> \endverbatim
171*
172* Authors:
173* ========
174*
175*> \author Univ. of Tennessee
176*> \author Univ. of California Berkeley
177*> \author Univ. of Colorado Denver
178*> \author NAG Ltd.
179*
180*> \ingroup hesv_aa_2stage
181*
182* =====================================================================
183 SUBROUTINE zhesv_aa_2stage( UPLO, N, NRHS, A, LDA, TB, LTB,
184 $ IPIV, IPIV2, B, LDB, WORK, LWORK,
185 $ INFO )
186*
187* -- LAPACK driver routine --
188* -- LAPACK is a software package provided by Univ. of Tennessee, --
189* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
190*
191 IMPLICIT NONE
192*
193* .. Scalar Arguments ..
194 CHARACTER UPLO
195 INTEGER N, NRHS, LDA, LDB, LTB, LWORK, INFO
196* ..
197* .. Array Arguments ..
198 INTEGER IPIV( * ), IPIV2( * )
199 COMPLEX*16 A( LDA, * ), B( LDB, * ), TB( * ), WORK( * )
200* ..
201*
202* =====================================================================
203* .. Parameters ..
204 COMPLEX*16 ZERO, ONE
205 PARAMETER ( ZERO = ( 0.0d+0, 0.0d+0 ),
206 $ one = ( 1.0d+0, 0.0d+0 ) )
207*
208* .. Local Scalars ..
209 LOGICAL UPPER, TQUERY, WQUERY
210 INTEGER LWKOPT, LWKMIN
211* ..
212* .. External Functions ..
213 LOGICAL LSAME
214 INTEGER ILAENV
215 EXTERNAL lsame, ilaenv
216* ..
217* .. External Subroutines ..
218 EXTERNAL xerbla, zhetrf_aa_2stage,
220* ..
221* .. Intrinsic Functions ..
222 INTRINSIC max
223* ..
224* .. Executable Statements ..
225*
226* Test the input parameters.
227*
228 info = 0
229 upper = lsame( uplo, 'U' )
230 wquery = ( lwork.EQ.-1 )
231 tquery = ( ltb.EQ.-1 )
232 lwkmin = max( 1, n )
233 IF( .NOT.upper .AND. .NOT.lsame( uplo, 'L' ) ) THEN
234 info = -1
235 ELSE IF( n.LT.0 ) THEN
236 info = -2
237 ELSE IF( nrhs.LT.0 ) THEN
238 info = -3
239 ELSE IF( lda.LT.max( 1, n ) ) THEN
240 info = -5
241 ELSE IF( ltb.LT.max( 1, 4*n ) .AND. .NOT.tquery ) THEN
242 info = -7
243 ELSE IF( ldb.LT.max( 1, n ) ) THEN
244 info = -11
245 ELSE IF( lwork.LT.lwkmin .AND. .NOT.wquery ) THEN
246 info = -13
247 END IF
248*
249 IF( info.EQ.0 ) THEN
250 CALL zhetrf_aa_2stage( uplo, n, a, lda, tb, -1, ipiv,
251 $ ipiv2, work, -1, info )
252 lwkopt = max( lwkmin, int( work( 1 ) ) )
253 work( 1 ) = lwkopt
254 END IF
255*
256 IF( info.NE.0 ) THEN
257 CALL xerbla( 'ZHESV_AA_2STAGE', -info )
258 RETURN
259 ELSE IF( wquery .OR. tquery ) THEN
260 RETURN
261 END IF
262*
263* Compute the factorization A = U**H*T*U or A = L*T*L**H.
264*
265 CALL zhetrf_aa_2stage( uplo, n, a, lda, tb, ltb, ipiv, ipiv2,
266 $ work, lwork, info )
267 IF( info.EQ.0 ) THEN
268*
269* Solve the system A*X = B, overwriting B with X.
270*
271 CALL zhetrs_aa_2stage( uplo, n, nrhs, a, lda, tb, ltb, ipiv,
272 $ ipiv2, b, ldb, info )
273*
274 END IF
275*
276 work( 1 ) = lwkopt
277*
278 RETURN
279*
280* End of ZHESV_AA_2STAGE
281*
282 END
subroutine xerbla(srname, info)
Definition cblat2.f:3285
subroutine zhesv_aa_2stage(uplo, n, nrhs, a, lda, tb, ltb, ipiv, ipiv2, b, ldb, work, lwork, info)
ZHESV_AA_2STAGE computes the solution to system of linear equations A * X = B for HE matrices
subroutine zhetrf_aa_2stage(uplo, n, a, lda, tb, ltb, ipiv, ipiv2, work, lwork, info)
ZHETRF_AA_2STAGE
subroutine zhetrs_aa_2stage(uplo, n, nrhs, a, lda, tb, ltb, ipiv, ipiv2, b, ldb, info)
ZHETRS_AA_2STAGE