LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
zhetri_3.f
Go to the documentation of this file.
1*> \brief \b ZHETRI_3
2*
3* =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6* http://www.netlib.org/lapack/explore-html/
7*
8*> Download ZHETRI_3 + dependencies
9*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zhetri_3.f">
10*> [TGZ]</a>
11*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zhetri_3.f">
12*> [ZIP]</a>
13*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zhetri_3.f">
14*> [TXT]</a>
15*
16* Definition:
17* ===========
18*
19* SUBROUTINE ZHETRI_3( UPLO, N, A, LDA, E, IPIV, WORK, LWORK,
20* INFO )
21*
22* .. Scalar Arguments ..
23* CHARACTER UPLO
24* INTEGER INFO, LDA, LWORK, N
25* ..
26* .. Array Arguments ..
27* INTEGER IPIV( * )
28* COMPLEX*16 A( LDA, * ), E( * ), WORK( * )
29* ..
30*
31*
32*> \par Purpose:
33* =============
34*>
35*> \verbatim
36*> ZHETRI_3 computes the inverse of a complex Hermitian indefinite
37*> matrix A using the factorization computed by ZHETRF_RK or ZHETRF_BK:
38*>
39*> A = P*U*D*(U**H)*(P**T) or A = P*L*D*(L**H)*(P**T),
40*>
41*> where U (or L) is unit upper (or lower) triangular matrix,
42*> U**H (or L**H) is the conjugate of U (or L), P is a permutation
43*> matrix, P**T is the transpose of P, and D is Hermitian and block
44*> diagonal with 1-by-1 and 2-by-2 diagonal blocks.
45*>
46*> ZHETRI_3 sets the leading dimension of the workspace before calling
47*> ZHETRI_3X that actually computes the inverse. This is the blocked
48*> version of the algorithm, calling Level 3 BLAS.
49*> \endverbatim
50*
51* Arguments:
52* ==========
53*
54*> \param[in] UPLO
55*> \verbatim
56*> UPLO is CHARACTER*1
57*> Specifies whether the details of the factorization are
58*> stored as an upper or lower triangular matrix.
59*> = 'U': Upper triangle of A is stored;
60*> = 'L': Lower triangle of A is stored.
61*> \endverbatim
62*>
63*> \param[in] N
64*> \verbatim
65*> N is INTEGER
66*> The order of the matrix A. N >= 0.
67*> \endverbatim
68*>
69*> \param[in,out] A
70*> \verbatim
71*> A is COMPLEX*16 array, dimension (LDA,N)
72*> On entry, diagonal of the block diagonal matrix D and
73*> factors U or L as computed by ZHETRF_RK and ZHETRF_BK:
74*> a) ONLY diagonal elements of the Hermitian block diagonal
75*> matrix D on the diagonal of A, i.e. D(k,k) = A(k,k);
76*> (superdiagonal (or subdiagonal) elements of D
77*> should be provided on entry in array E), and
78*> b) If UPLO = 'U': factor U in the superdiagonal part of A.
79*> If UPLO = 'L': factor L in the subdiagonal part of A.
80*>
81*> On exit, if INFO = 0, the Hermitian inverse of the original
82*> matrix.
83*> If UPLO = 'U': the upper triangular part of the inverse
84*> is formed and the part of A below the diagonal is not
85*> referenced;
86*> If UPLO = 'L': the lower triangular part of the inverse
87*> is formed and the part of A above the diagonal is not
88*> referenced.
89*> \endverbatim
90*>
91*> \param[in] LDA
92*> \verbatim
93*> LDA is INTEGER
94*> The leading dimension of the array A. LDA >= max(1,N).
95*> \endverbatim
96*>
97*> \param[in] E
98*> \verbatim
99*> E is COMPLEX*16 array, dimension (N)
100*> On entry, contains the superdiagonal (or subdiagonal)
101*> elements of the Hermitian block diagonal matrix D
102*> with 1-by-1 or 2-by-2 diagonal blocks, where
103*> If UPLO = 'U': E(i) = D(i-1,i),i=2:N, E(1) not referenced;
104*> If UPLO = 'L': E(i) = D(i+1,i),i=1:N-1, E(N) not referenced.
105*>
106*> NOTE: For 1-by-1 diagonal block D(k), where
107*> 1 <= k <= N, the element E(k) is not referenced in both
108*> UPLO = 'U' or UPLO = 'L' cases.
109*> \endverbatim
110*>
111*> \param[in] IPIV
112*> \verbatim
113*> IPIV is INTEGER array, dimension (N)
114*> Details of the interchanges and the block structure of D
115*> as determined by ZHETRF_RK or ZHETRF_BK.
116*> \endverbatim
117*>
118*> \param[out] WORK
119*> \verbatim
120*> WORK is COMPLEX*16 array, dimension (N+NB+1)*(NB+3).
121*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
122*> \endverbatim
123*>
124*> \param[in] LWORK
125*> \verbatim
126*> LWORK is INTEGER
127*> The length of WORK. LWORK >= (N+NB+1)*(NB+3).
128*>
129*> If LDWORK = -1, then a workspace query is assumed;
130*> the routine only calculates the optimal size of the optimal
131*> size of the WORK array, returns this value as the first
132*> entry of the WORK array, and no error message related to
133*> LWORK is issued by XERBLA.
134*> \endverbatim
135*>
136*> \param[out] INFO
137*> \verbatim
138*> INFO is INTEGER
139*> = 0: successful exit
140*> < 0: if INFO = -i, the i-th argument had an illegal value
141*> > 0: if INFO = i, D(i,i) = 0; the matrix is singular and its
142*> inverse could not be computed.
143*> \endverbatim
144*
145* Authors:
146* ========
147*
148*> \author Univ. of Tennessee
149*> \author Univ. of California Berkeley
150*> \author Univ. of Colorado Denver
151*> \author NAG Ltd.
152*
153*> \ingroup hetri_3
154*
155*> \par Contributors:
156* ==================
157*> \verbatim
158*>
159*> November 2017, Igor Kozachenko,
160*> Computer Science Division,
161*> University of California, Berkeley
162*>
163*> \endverbatim
164*
165* =====================================================================
166 SUBROUTINE zhetri_3( UPLO, N, A, LDA, E, IPIV, WORK, LWORK,
167 $ INFO )
168*
169* -- LAPACK computational routine --
170* -- LAPACK is a software package provided by Univ. of Tennessee, --
171* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
172*
173* .. Scalar Arguments ..
174 CHARACTER UPLO
175 INTEGER INFO, LDA, LWORK, N
176* ..
177* .. Array Arguments ..
178 INTEGER IPIV( * )
179 COMPLEX*16 A( LDA, * ), E( * ), WORK( * )
180* ..
181*
182* =====================================================================
183*
184* .. Local Scalars ..
185 LOGICAL UPPER, LQUERY
186 INTEGER LWKOPT, NB
187* ..
188* .. External Functions ..
189 LOGICAL LSAME
190 INTEGER ILAENV
191 EXTERNAL lsame, ilaenv
192* ..
193* .. External Subroutines ..
194 EXTERNAL zhetri_3x, xerbla
195* ..
196* .. Intrinsic Functions ..
197 INTRINSIC max
198* ..
199* .. Executable Statements ..
200*
201* Test the input parameters.
202*
203 info = 0
204 upper = lsame( uplo, 'U' )
205 lquery = ( lwork.EQ.-1 )
206*
207* Determine the block size
208*
209 nb = max( 1, ilaenv( 1, 'ZHETRI_3', uplo, n, -1, -1, -1 ) )
210 lwkopt = ( n+nb+1 ) * ( nb+3 )
211*
212 IF( .NOT.upper .AND. .NOT.lsame( uplo, 'L' ) ) THEN
213 info = -1
214 ELSE IF( n.LT.0 ) THEN
215 info = -2
216 ELSE IF( lda.LT.max( 1, n ) ) THEN
217 info = -4
218 ELSE IF ( lwork .LT. lwkopt .AND. .NOT.lquery ) THEN
219 info = -8
220 END IF
221*
222 IF( info.NE.0 ) THEN
223 CALL xerbla( 'ZHETRI_3', -info )
224 RETURN
225 ELSE IF( lquery ) THEN
226 work( 1 ) = lwkopt
227 RETURN
228 END IF
229*
230* Quick return if possible
231*
232 IF( n.EQ.0 )
233 $ RETURN
234*
235 CALL zhetri_3x( uplo, n, a, lda, e, ipiv, work, nb, info )
236*
237 work( 1 ) = lwkopt
238*
239 RETURN
240*
241* End of ZHETRI_3
242*
243 END
subroutine xerbla(srname, info)
Definition cblat2.f:3285
subroutine zhetri_3(uplo, n, a, lda, e, ipiv, work, lwork, info)
ZHETRI_3
Definition zhetri_3.f:168
subroutine zhetri_3x(uplo, n, a, lda, e, ipiv, work, nb, info)
ZHETRI_3X
Definition zhetri_3x.f:158