LAPACK 3.12.0
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*> \htmlonly
9*> Download ZHESV_AA_2STAGE + dependencies
10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zhesv_aa_2stage.f">
11*> [TGZ]</a>
12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zhesv_aa_2stage.f">
13*> [ZIP]</a>
14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zhesv_aa_2stage.f">
15*> [TXT]</a>
16*> \endhtmlonly
17*
18* Definition:
19* ===========
20*
21* SUBROUTINE ZHESV_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*
35*> \par Purpose:
36* =============
37*>
38*> \verbatim
39*>
40*> ZHESV_AA_2STAGE computes the solution to a complex system of
41*> linear equations
42*> A * X = B,
43*> where A is an N-by-N Hermitian matrix and X and B are N-by-NRHS
44*> matrices.
45*>
46*> Aasen's 2-stage algorithm is used to factor A as
47*> A = U**H * T * U, if UPLO = 'U', or
48*> A = L * T * L**H, if UPLO = 'L',
49*> where U (or L) is a product of permutation and unit upper (lower)
50*> triangular matrices, and T is Hermitian and band. The matrix T is
51*> then LU-factored with partial pivoting. The factored form of A
52*> is then used to solve the system of equations A * X = B.
53*>
54*> This is the blocked version of the algorithm, calling Level 3 BLAS.
55*> \endverbatim
56*
57* Arguments:
58* ==========
59*
60*> \param[in] UPLO
61*> \verbatim
62*> UPLO is CHARACTER*1
63*> = 'U': Upper triangle of A is stored;
64*> = 'L': Lower triangle of A is stored.
65*> \endverbatim
66*>
67*> \param[in] N
68*> \verbatim
69*> N is INTEGER
70*> The order of the matrix A. N >= 0.
71*> \endverbatim
72*>
73*> \param[in] NRHS
74*> \verbatim
75*> NRHS is INTEGER
76*> The number of right hand sides, i.e., the number of columns
77*> of the matrix B. NRHS >= 0.
78*> \endverbatim
79*>
80*> \param[in,out] A
81*> \verbatim
82*> A is COMPLEX*16 array, dimension (LDA,N)
83*> On entry, the hermitian matrix A. If UPLO = 'U', the leading
84*> N-by-N upper triangular part of A contains the upper
85*> triangular part of the matrix A, and the strictly lower
86*> triangular part of A is not referenced. If UPLO = 'L', the
87*> leading N-by-N lower triangular part of A contains the lower
88*> triangular part of the matrix A, and the strictly upper
89*> triangular part of A is not referenced.
90*>
91*> On exit, L is stored below (or above) the subdiagonal blocks,
92*> when UPLO is 'L' (or 'U').
93*> \endverbatim
94*>
95*> \param[in] LDA
96*> \verbatim
97*> LDA is INTEGER
98*> The leading dimension of the array A. LDA >= max(1,N).
99*> \endverbatim
100*>
101*> \param[out] TB
102*> \verbatim
103*> TB is COMPLEX*16 array, dimension (LTB)
104*> On exit, details of the LU factorization of the band matrix.
105*> \endverbatim
106*>
107*> \param[in] LTB
108*> \verbatim
109*> LTB is INTEGER
110*> The size of the array TB. LTB >= 4*N, internally
111*> used to select NB such that LTB >= (3*NB+1)*N.
112*>
113*> If LTB = -1, then a workspace query is assumed; the
114*> routine only calculates the optimal size of LTB,
115*> returns this value as the first entry of TB, and
116*> no error message related to LTB is issued by XERBLA.
117*> \endverbatim
118*>
119*> \param[out] IPIV
120*> \verbatim
121*> IPIV is INTEGER array, dimension (N)
122*> On exit, it contains the details of the interchanges, i.e.,
123*> the row and column k of A were interchanged with the
124*> row and column IPIV(k).
125*> \endverbatim
126*>
127*> \param[out] IPIV2
128*> \verbatim
129*> IPIV2 is INTEGER array, dimension (N)
130*> On exit, it contains the details of the interchanges, i.e.,
131*> the row and column k of T were interchanged with the
132*> row and column IPIV(k).
133*> \endverbatim
134*>
135*> \param[in,out] B
136*> \verbatim
137*> B is COMPLEX*16 array, dimension (LDB,NRHS)
138*> On entry, the right hand side matrix B.
139*> On exit, the solution matrix X.
140*> \endverbatim
141*>
142*> \param[in] LDB
143*> \verbatim
144*> LDB is INTEGER
145*> The leading dimension of the array B. LDB >= max(1,N).
146*> \endverbatim
147*>
148*> \param[out] WORK
149*> \verbatim
150*> WORK is COMPLEX*16 workspace of size LWORK
151*> \endverbatim
152*>
153*> \param[in] LWORK
154*> \verbatim
155*> LWORK is INTEGER
156*> The size of WORK. LWORK >= N, internally used to select NB
157*> such that LWORK >= N*NB.
158*>
159*> If LWORK = -1, then a workspace query is assumed; the
160*> routine only calculates the optimal size of the WORK array,
161*> returns this value as the first entry of the WORK array, and
162*> no error message related to LWORK is issued by XERBLA.
163*> \endverbatim
164*>
165*> \param[out] INFO
166*> \verbatim
167*> INFO is INTEGER
168*> = 0: successful exit
169*> < 0: if INFO = -i, the i-th argument had an illegal value.
170*> > 0: if INFO = i, band LU factorization failed on i-th column
171*> \endverbatim
172*
173* Authors:
174* ========
175*
176*> \author Univ. of Tennessee
177*> \author Univ. of California Berkeley
178*> \author Univ. of Colorado Denver
179*> \author NAG Ltd.
180*
181*> \ingroup hesv_aa_2stage
182*
183* =====================================================================
184 SUBROUTINE zhesv_aa_2stage( UPLO, N, NRHS, A, LDA, TB, LTB,
185 $ IPIV, IPIV2, B, LDB, WORK, LWORK,
186 $ INFO )
187*
188* -- LAPACK driver routine --
189* -- LAPACK is a software package provided by Univ. of Tennessee, --
190* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
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* .. Parameters ..
205 COMPLEX*16 ZERO, ONE
206 PARAMETER ( ZERO = ( 0.0d+0, 0.0d+0 ),
207 $ one = ( 1.0d+0, 0.0d+0 ) )
208*
209* .. Local Scalars ..
210 LOGICAL UPPER, TQUERY, WQUERY
211 INTEGER LWKOPT
212* ..
213* .. External Functions ..
214 LOGICAL LSAME
215 INTEGER ILAENV
216 EXTERNAL lsame, ilaenv
217* ..
218* .. External Subroutines ..
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 IF( .NOT.upper .AND. .NOT.lsame( uplo, 'L' ) ) THEN
233 info = -1
234 ELSE IF( n.LT.0 ) THEN
235 info = -2
236 ELSE IF( nrhs.LT.0 ) THEN
237 info = -3
238 ELSE IF( lda.LT.max( 1, n ) ) THEN
239 info = -5
240 ELSE IF( ltb.LT.( 4*n ) .AND. .NOT.tquery ) THEN
241 info = -7
242 ELSE IF( ldb.LT.max( 1, n ) ) THEN
243 info = -11
244 ELSE IF( lwork.LT.n .AND. .NOT.wquery ) THEN
245 info = -13
246 END IF
247*
248 IF( info.EQ.0 ) THEN
249 CALL zhetrf_aa_2stage( uplo, n, a, lda, tb, -1, ipiv,
250 $ ipiv2, work, -1, info )
251 lwkopt = int( work(1) )
252 END IF
253*
254 IF( info.NE.0 ) THEN
255 CALL xerbla( 'ZHESV_AA_2STAGE', -info )
256 RETURN
257 ELSE IF( wquery .OR. tquery ) THEN
258 RETURN
259 END IF
260*
261* Compute the factorization A = U**H*T*U or A = L*T*L**H.
262*
263 CALL zhetrf_aa_2stage( uplo, n, a, lda, tb, ltb, ipiv, ipiv2,
264 $ work, lwork, info )
265 IF( info.EQ.0 ) THEN
266*
267* Solve the system A*X = B, overwriting B with X.
268*
269 CALL zhetrs_aa_2stage( uplo, n, nrhs, a, lda, tb, ltb, ipiv,
270 $ ipiv2, b, ldb, info )
271*
272 END IF
273*
274 work( 1 ) = lwkopt
275*
276 RETURN
277*
278* End of ZHESV_AA_2STAGE
279*
280 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