Annotation of rpl/lapack/lapack/zla_hercond_c.f, revision 1.6
1.6 ! bertrand 1: *> \brief \b ZLA_HERCOND_C
! 2: *
! 3: * =========== DOCUMENTATION ===========
! 4: *
! 5: * Online html documentation available at
! 6: * http://www.netlib.org/lapack/explore-html/
! 7: *
! 8: *> \htmlonly
! 9: *> Download ZLA_HERCOND_C + dependencies
! 10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zla_hercond_c.f">
! 11: *> [TGZ]</a>
! 12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zla_hercond_c.f">
! 13: *> [ZIP]</a>
! 14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zla_hercond_c.f">
! 15: *> [TXT]</a>
! 16: *> \endhtmlonly
! 17: *
! 18: * Definition:
! 19: * ===========
! 20: *
! 21: * DOUBLE PRECISION FUNCTION ZLA_HERCOND_C( UPLO, N, A, LDA, AF,
! 22: * LDAF, IPIV, C, CAPPLY,
! 23: * INFO, WORK, RWORK )
! 24: *
! 25: * .. Scalar Arguments ..
! 26: * CHARACTER UPLO
! 27: * LOGICAL CAPPLY
! 28: * INTEGER N, LDA, LDAF, INFO
! 29: * ..
! 30: * .. Array Arguments ..
! 31: * INTEGER IPIV( * )
! 32: * COMPLEX*16 A( LDA, * ), AF( LDAF, * ), WORK( * )
! 33: * DOUBLE PRECISION C ( * ), RWORK( * )
! 34: * ..
! 35: *
! 36: *
! 37: *> \par Purpose:
! 38: * =============
! 39: *>
! 40: *> \verbatim
! 41: *>
! 42: *> ZLA_HERCOND_C computes the infinity norm condition number of
! 43: *> op(A) * inv(diag(C)) where C is a DOUBLE PRECISION vector.
! 44: *> \endverbatim
! 45: *
! 46: * Arguments:
! 47: * ==========
! 48: *
! 49: *> \param[in] UPLO
! 50: *> \verbatim
! 51: *> UPLO is CHARACTER*1
! 52: *> = 'U': Upper triangle of A is stored;
! 53: *> = 'L': Lower triangle of A is stored.
! 54: *> \endverbatim
! 55: *>
! 56: *> \param[in] N
! 57: *> \verbatim
! 58: *> N is INTEGER
! 59: *> The number of linear equations, i.e., the order of the
! 60: *> matrix A. N >= 0.
! 61: *> \endverbatim
! 62: *>
! 63: *> \param[in] A
! 64: *> \verbatim
! 65: *> A is COMPLEX*16 array, dimension (LDA,N)
! 66: *> On entry, the N-by-N matrix A
! 67: *> \endverbatim
! 68: *>
! 69: *> \param[in] LDA
! 70: *> \verbatim
! 71: *> LDA is INTEGER
! 72: *> The leading dimension of the array A. LDA >= max(1,N).
! 73: *> \endverbatim
! 74: *>
! 75: *> \param[in] AF
! 76: *> \verbatim
! 77: *> AF is COMPLEX*16 array, dimension (LDAF,N)
! 78: *> The block diagonal matrix D and the multipliers used to
! 79: *> obtain the factor U or L as computed by ZHETRF.
! 80: *> \endverbatim
! 81: *>
! 82: *> \param[in] LDAF
! 83: *> \verbatim
! 84: *> LDAF is INTEGER
! 85: *> The leading dimension of the array AF. LDAF >= max(1,N).
! 86: *> \endverbatim
! 87: *>
! 88: *> \param[in] IPIV
! 89: *> \verbatim
! 90: *> IPIV is INTEGER array, dimension (N)
! 91: *> Details of the interchanges and the block structure of D
! 92: *> as determined by CHETRF.
! 93: *> \endverbatim
! 94: *>
! 95: *> \param[in] C
! 96: *> \verbatim
! 97: *> C is DOUBLE PRECISION array, dimension (N)
! 98: *> The vector C in the formula op(A) * inv(diag(C)).
! 99: *> \endverbatim
! 100: *>
! 101: *> \param[in] CAPPLY
! 102: *> \verbatim
! 103: *> CAPPLY is LOGICAL
! 104: *> If .TRUE. then access the vector C in the formula above.
! 105: *> \endverbatim
! 106: *>
! 107: *> \param[out] INFO
! 108: *> \verbatim
! 109: *> INFO is INTEGER
! 110: *> = 0: Successful exit.
! 111: *> i > 0: The ith argument is invalid.
! 112: *> \endverbatim
! 113: *>
! 114: *> \param[in] WORK
! 115: *> \verbatim
! 116: *> WORK is COMPLEX*16 array, dimension (2*N).
! 117: *> Workspace.
! 118: *> \endverbatim
! 119: *>
! 120: *> \param[in] RWORK
! 121: *> \verbatim
! 122: *> RWORK is DOUBLE PRECISION array, dimension (N).
! 123: *> Workspace.
! 124: *> \endverbatim
! 125: *
! 126: * Authors:
! 127: * ========
! 128: *
! 129: *> \author Univ. of Tennessee
! 130: *> \author Univ. of California Berkeley
! 131: *> \author Univ. of Colorado Denver
! 132: *> \author NAG Ltd.
! 133: *
! 134: *> \date November 2011
! 135: *
! 136: *> \ingroup complex16HEcomputational
! 137: *
! 138: * =====================================================================
1.1 bertrand 139: DOUBLE PRECISION FUNCTION ZLA_HERCOND_C( UPLO, N, A, LDA, AF,
140: $ LDAF, IPIV, C, CAPPLY,
141: $ INFO, WORK, RWORK )
142: *
1.6 ! bertrand 143: * -- LAPACK computational routine (version 3.4.0) --
! 144: * -- LAPACK is a software package provided by Univ. of Tennessee, --
! 145: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
! 146: * November 2011
1.1 bertrand 147: *
148: * .. Scalar Arguments ..
149: CHARACTER UPLO
150: LOGICAL CAPPLY
151: INTEGER N, LDA, LDAF, INFO
152: * ..
153: * .. Array Arguments ..
154: INTEGER IPIV( * )
155: COMPLEX*16 A( LDA, * ), AF( LDAF, * ), WORK( * )
156: DOUBLE PRECISION C ( * ), RWORK( * )
157: * ..
158: *
159: * =====================================================================
160: *
161: * .. Local Scalars ..
162: INTEGER KASE, I, J
163: DOUBLE PRECISION AINVNM, ANORM, TMP
164: LOGICAL UP
165: COMPLEX*16 ZDUM
166: * ..
167: * .. Local Arrays ..
168: INTEGER ISAVE( 3 )
169: * ..
170: * .. External Functions ..
171: LOGICAL LSAME
172: EXTERNAL LSAME
173: * ..
174: * .. External Subroutines ..
175: EXTERNAL ZLACN2, ZHETRS, XERBLA
176: * ..
177: * .. Intrinsic Functions ..
178: INTRINSIC ABS, MAX
179: * ..
180: * .. Statement Functions ..
181: DOUBLE PRECISION CABS1
182: * ..
183: * .. Statement Function Definitions ..
184: CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
185: * ..
186: * .. Executable Statements ..
187: *
188: ZLA_HERCOND_C = 0.0D+0
189: *
190: INFO = 0
191: IF( N.LT.0 ) THEN
192: INFO = -2
193: END IF
194: IF( INFO.NE.0 ) THEN
195: CALL XERBLA( 'ZLA_HERCOND_C', -INFO )
196: RETURN
197: END IF
198: UP = .FALSE.
199: IF ( LSAME( UPLO, 'U' ) ) UP = .TRUE.
200: *
201: * Compute norm of op(A)*op2(C).
202: *
203: ANORM = 0.0D+0
204: IF ( UP ) THEN
205: DO I = 1, N
206: TMP = 0.0D+0
207: IF ( CAPPLY ) THEN
208: DO J = 1, I
209: TMP = TMP + CABS1( A( J, I ) ) / C( J )
210: END DO
211: DO J = I+1, N
212: TMP = TMP + CABS1( A( I, J ) ) / C( J )
213: END DO
214: ELSE
215: DO J = 1, I
216: TMP = TMP + CABS1( A( J, I ) )
217: END DO
218: DO J = I+1, N
219: TMP = TMP + CABS1( A( I, J ) )
220: END DO
221: END IF
222: RWORK( I ) = TMP
223: ANORM = MAX( ANORM, TMP )
224: END DO
225: ELSE
226: DO I = 1, N
227: TMP = 0.0D+0
228: IF ( CAPPLY ) THEN
229: DO J = 1, I
230: TMP = TMP + CABS1( A( I, J ) ) / C( J )
231: END DO
232: DO J = I+1, N
233: TMP = TMP + CABS1( A( J, I ) ) / C( J )
234: END DO
235: ELSE
236: DO J = 1, I
237: TMP = TMP + CABS1( A( I, J ) )
238: END DO
239: DO J = I+1, N
240: TMP = TMP + CABS1( A( J, I ) )
241: END DO
242: END IF
243: RWORK( I ) = TMP
244: ANORM = MAX( ANORM, TMP )
245: END DO
246: END IF
247: *
248: * Quick return if possible.
249: *
250: IF( N.EQ.0 ) THEN
251: ZLA_HERCOND_C = 1.0D+0
252: RETURN
253: ELSE IF( ANORM .EQ. 0.0D+0 ) THEN
254: RETURN
255: END IF
256: *
257: * Estimate the norm of inv(op(A)).
258: *
259: AINVNM = 0.0D+0
260: *
261: KASE = 0
262: 10 CONTINUE
263: CALL ZLACN2( N, WORK( N+1 ), WORK, AINVNM, KASE, ISAVE )
264: IF( KASE.NE.0 ) THEN
265: IF( KASE.EQ.2 ) THEN
266: *
267: * Multiply by R.
268: *
269: DO I = 1, N
270: WORK( I ) = WORK( I ) * RWORK( I )
271: END DO
272: *
273: IF ( UP ) THEN
274: CALL ZHETRS( 'U', N, 1, AF, LDAF, IPIV,
275: $ WORK, N, INFO )
276: ELSE
277: CALL ZHETRS( 'L', N, 1, AF, LDAF, IPIV,
278: $ WORK, N, INFO )
279: ENDIF
280: *
281: * Multiply by inv(C).
282: *
283: IF ( CAPPLY ) THEN
284: DO I = 1, N
285: WORK( I ) = WORK( I ) * C( I )
286: END DO
287: END IF
288: ELSE
289: *
1.5 bertrand 290: * Multiply by inv(C**H).
1.1 bertrand 291: *
292: IF ( CAPPLY ) THEN
293: DO I = 1, N
294: WORK( I ) = WORK( I ) * C( I )
295: END DO
296: END IF
297: *
298: IF ( UP ) THEN
299: CALL ZHETRS( 'U', N, 1, AF, LDAF, IPIV,
300: $ WORK, N, INFO )
301: ELSE
302: CALL ZHETRS( 'L', N, 1, AF, LDAF, IPIV,
303: $ WORK, N, INFO )
304: END IF
305: *
306: * Multiply by R.
307: *
308: DO I = 1, N
309: WORK( I ) = WORK( I ) * RWORK( I )
310: END DO
311: END IF
312: GO TO 10
313: END IF
314: *
315: * Compute the estimate of the reciprocal condition number.
316: *
317: IF( AINVNM .NE. 0.0D+0 )
318: $ ZLA_HERCOND_C = 1.0D+0 / AINVNM
319: *
320: RETURN
321: *
322: END
CVSweb interface <joel.bertrand@systella.fr>