LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
csytri_3.f
Go to the documentation of this file.
1*> \brief \b CSYTRI_3
2*
3* =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6* http://www.netlib.org/lapack/explore-html/
7*
8*> Download CSYTRI_3 + dependencies
9*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/csytri_3.f">
10*> [TGZ]</a>
11*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/csytri_3.f">
12*> [ZIP]</a>
13*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/csytri_3.f">
14*> [TXT]</a>
15*
16* Definition:
17* ===========
18*
19* SUBROUTINE CSYTRI_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 A( LDA, * ), E( * ), WORK( * )
29* ..
30*
31*
32*> \par Purpose:
33* =============
34*>
35*> \verbatim
36*> CSYTRI_3 computes the inverse of a complex symmetric indefinite
37*> matrix A using the factorization computed by CSYTRF_RK or CSYTRF_BK:
38*>
39*> A = P*U*D*(U**T)*(P**T) or A = P*L*D*(L**T)*(P**T),
40*>
41*> where U (or L) is unit upper (or lower) triangular matrix,
42*> U**T (or L**T) is the transpose of U (or L), P is a permutation
43*> matrix, P**T is the transpose of P, and D is symmetric and block
44*> diagonal with 1-by-1 and 2-by-2 diagonal blocks.
45*>
46*> CSYTRI_3 sets the leading dimension of the workspace before calling
47*> CSYTRI_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 array, dimension (LDA,N)
72*> On entry, diagonal of the block diagonal matrix D and
73*> factors U or L as computed by CSYTRF_RK and CSYTRF_BK:
74*> a) ONLY diagonal elements of the symmetric 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 symmetric 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 array, dimension (N)
100*> On entry, contains the superdiagonal (or subdiagonal)
101*> elements of the symmetric 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 CSYTRF_RK or CSYTRF_BK.
116*> \endverbatim
117*>
118*> \param[out] WORK
119*> \verbatim
120*> WORK is COMPLEX 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 csytri_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 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 REAL SROUNDUP_LWORK
192 EXTERNAL lsame, ilaenv, sroundup_lwork
193* ..
194* .. External Subroutines ..
195 EXTERNAL csytri_3x, xerbla
196* ..
197* .. Intrinsic Functions ..
198 INTRINSIC max
199* ..
200* .. Executable Statements ..
201*
202* Test the input parameters.
203*
204 info = 0
205 upper = lsame( uplo, 'U' )
206 lquery = ( lwork.EQ.-1 )
207*
208* Determine the block size
209*
210 nb = max( 1, ilaenv( 1, 'CSYTRI_3', uplo, n, -1, -1, -1 ) )
211 lwkopt = ( n+nb+1 ) * ( nb+3 )
212*
213 IF( .NOT.upper .AND. .NOT.lsame( uplo, 'L' ) ) THEN
214 info = -1
215 ELSE IF( n.LT.0 ) THEN
216 info = -2
217 ELSE IF( lda.LT.max( 1, n ) ) THEN
218 info = -4
219 ELSE IF ( lwork .LT. lwkopt .AND. .NOT.lquery ) THEN
220 info = -8
221 END IF
222*
223 IF( info.NE.0 ) THEN
224 CALL xerbla( 'CSYTRI_3', -info )
225 RETURN
226 ELSE IF( lquery ) THEN
227 work( 1 ) = sroundup_lwork(lwkopt)
228 RETURN
229 END IF
230*
231* Quick return if possible
232*
233 IF( n.EQ.0 )
234 $ RETURN
235*
236 CALL csytri_3x( uplo, n, a, lda, e, ipiv, work, nb, info )
237*
238 work( 1 ) = sroundup_lwork(lwkopt)
239*
240 RETURN
241*
242* End of CSYTRI_3
243*
244 END
subroutine xerbla(srname, info)
Definition cblat2.f:3285
subroutine csytri_3(uplo, n, a, lda, e, ipiv, work, lwork, info)
CSYTRI_3
Definition csytri_3.f:168
subroutine csytri_3x(uplo, n, a, lda, e, ipiv, work, nb, info)
CSYTRI_3X
Definition csytri_3x.f:158