1: *> \brief \b ZSYTRI2
2: *
3: * =========== DOCUMENTATION ===========
4: *
5: * Online html documentation available at
6: * http://www.netlib.org/lapack/explore-html/
7: *
8: *> \htmlonly
9: *> Download ZSYTRI2 + dependencies
10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zsytri2.f">
11: *> [TGZ]</a>
12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zsytri2.f">
13: *> [ZIP]</a>
14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zsytri2.f">
15: *> [TXT]</a>
16: *> \endhtmlonly
17: *
18: * Definition:
19: * ===========
20: *
21: * SUBROUTINE ZSYTRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
22: *
23: * .. Scalar Arguments ..
24: * CHARACTER UPLO
25: * INTEGER INFO, LDA, LWORK, N
26: * ..
27: * .. Array Arguments ..
28: * INTEGER IPIV( * )
29: * COMPLEX*16 A( LDA, * ), WORK( * )
30: * ..
31: *
32: *
33: *> \par Purpose:
34: * =============
35: *>
36: *> \verbatim
37: *>
38: *> ZSYTRI2 computes the inverse of a COMPLEX*16 symmetric indefinite matrix
39: *> A using the factorization A = U*D*U**T or A = L*D*L**T computed by
40: *> ZSYTRF. ZSYTRI2 sets the LEADING DIMENSION of the workspace
41: *> before calling ZSYTRI2X that actually computes the inverse.
42: *> \endverbatim
43: *
44: * Arguments:
45: * ==========
46: *
47: *> \param[in] UPLO
48: *> \verbatim
49: *> UPLO is CHARACTER*1
50: *> Specifies whether the details of the factorization are stored
51: *> as an upper or lower triangular matrix.
52: *> = 'U': Upper triangular, form is A = U*D*U**T;
53: *> = 'L': Lower triangular, form is A = L*D*L**T.
54: *> \endverbatim
55: *>
56: *> \param[in] N
57: *> \verbatim
58: *> N is INTEGER
59: *> The order of the matrix A. N >= 0.
60: *> \endverbatim
61: *>
62: *> \param[in,out] A
63: *> \verbatim
64: *> A is COMPLEX*16 array, dimension (LDA,N)
65: *> On entry, the block diagonal matrix D and the multipliers
66: *> used to obtain the factor U or L as computed by ZSYTRF.
67: *>
68: *> On exit, if INFO = 0, the (symmetric) inverse of the original
69: *> matrix. If UPLO = 'U', the upper triangular part of the
70: *> inverse is formed and the part of A below the diagonal is not
71: *> referenced; if UPLO = 'L' the lower triangular part of the
72: *> inverse is formed and the part of A above the diagonal is
73: *> not referenced.
74: *> \endverbatim
75: *>
76: *> \param[in] LDA
77: *> \verbatim
78: *> LDA is INTEGER
79: *> The leading dimension of the array A. LDA >= max(1,N).
80: *> \endverbatim
81: *>
82: *> \param[in] IPIV
83: *> \verbatim
84: *> IPIV is INTEGER array, dimension (N)
85: *> Details of the interchanges and the block structure of D
86: *> as determined by ZSYTRF.
87: *> \endverbatim
88: *>
89: *> \param[out] WORK
90: *> \verbatim
91: *> WORK is COMPLEX*16 array, dimension (N+NB+1)*(NB+3)
92: *> \endverbatim
93: *>
94: *> \param[in] LWORK
95: *> \verbatim
96: *> LWORK is INTEGER
97: *> The dimension of the array WORK.
98: *> WORK is size >= (N+NB+1)*(NB+3)
99: *> If LDWORK = -1, then a workspace query is assumed; the routine
100: *> calculates:
101: *> - the optimal size of the WORK array, returns
102: *> this value as the first entry of the WORK array,
103: *> - and no error message related to LDWORK is issued by XERBLA.
104: *> \endverbatim
105: *>
106: *> \param[out] INFO
107: *> \verbatim
108: *> INFO is INTEGER
109: *> = 0: successful exit
110: *> < 0: if INFO = -i, the i-th argument had an illegal value
111: *> > 0: if INFO = i, D(i,i) = 0; the matrix is singular and its
112: *> inverse could not be computed.
113: *> \endverbatim
114: *
115: * Authors:
116: * ========
117: *
118: *> \author Univ. of Tennessee
119: *> \author Univ. of California Berkeley
120: *> \author Univ. of Colorado Denver
121: *> \author NAG Ltd.
122: *
123: *> \ingroup complex16SYcomputational
124: *
125: * =====================================================================
126: SUBROUTINE ZSYTRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO )
127: *
128: * -- LAPACK computational routine --
129: * -- LAPACK is a software package provided by Univ. of Tennessee, --
130: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
131: *
132: * .. Scalar Arguments ..
133: CHARACTER UPLO
134: INTEGER INFO, LDA, LWORK, N
135: * ..
136: * .. Array Arguments ..
137: INTEGER IPIV( * )
138: COMPLEX*16 A( LDA, * ), WORK( * )
139: * ..
140: *
141: * =====================================================================
142: *
143: * .. Local Scalars ..
144: LOGICAL UPPER, LQUERY
145: INTEGER MINSIZE, NBMAX
146: * ..
147: * .. External Functions ..
148: LOGICAL LSAME
149: INTEGER ILAENV
150: EXTERNAL LSAME, ILAENV
151: * ..
152: * .. External Subroutines ..
153: EXTERNAL ZSYTRI, ZSYTRI2X, XERBLA
154: * ..
155: * .. Executable Statements ..
156: *
157: * Test the input parameters.
158: *
159: INFO = 0
160: UPPER = LSAME( UPLO, 'U' )
161: LQUERY = ( LWORK.EQ.-1 )
162: * Get blocksize
163: NBMAX = ILAENV( 1, 'ZSYTRI2', UPLO, N, -1, -1, -1 )
164: IF ( NBMAX .GE. N ) THEN
165: MINSIZE = N
166: ELSE
167: MINSIZE = (N+NBMAX+1)*(NBMAX+3)
168: END IF
169: *
170: IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
171: INFO = -1
172: ELSE IF( N.LT.0 ) THEN
173: INFO = -2
174: ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
175: INFO = -4
176: ELSE IF (LWORK .LT. MINSIZE .AND. .NOT.LQUERY ) THEN
177: INFO = -7
178: END IF
179: *
180: * Quick return if possible
181: *
182: *
183: IF( INFO.NE.0 ) THEN
184: CALL XERBLA( 'ZSYTRI2', -INFO )
185: RETURN
186: ELSE IF( LQUERY ) THEN
187: WORK(1)=MINSIZE
188: RETURN
189: END IF
190: IF( N.EQ.0 )
191: $ RETURN
192:
193: IF( NBMAX .GE. N ) THEN
194: CALL ZSYTRI( UPLO, N, A, LDA, IPIV, WORK, INFO )
195: ELSE
196: CALL ZSYTRI2X( UPLO, N, A, LDA, IPIV, WORK, NBMAX, INFO )
197: END IF
198: RETURN
199: *
200: * End of ZSYTRI2
201: *
202: END
CVSweb interface <joel.bertrand@systella.fr>