LAPACK 3.12.0
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
cla_porpvgrw.f
Go to the documentation of this file.
1*> \brief \b CLA_PORPVGRW computes the reciprocal pivot growth factor norm(A)/norm(U) for a symmetric or Hermitian positive-definite matrix.
2*
3* =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6* http://www.netlib.org/lapack/explore-html/
7*
8*> \htmlonly
9*> Download CLA_PORPVGRW + dependencies
10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/cla_porpvgrw.f">
11*> [TGZ]</a>
12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/cla_porpvgrw.f">
13*> [ZIP]</a>
14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/cla_porpvgrw.f">
15*> [TXT]</a>
16*> \endhtmlonly
17*
18* Definition:
19* ===========
20*
21* REAL FUNCTION CLA_PORPVGRW( UPLO, NCOLS, A, LDA, AF, LDAF, WORK )
22*
23* .. Scalar Arguments ..
24* CHARACTER*1 UPLO
25* INTEGER NCOLS, LDA, LDAF
26* ..
27* .. Array Arguments ..
28* COMPLEX A( LDA, * ), AF( LDAF, * )
29* REAL WORK( * )
30* ..
31*
32*
33*> \par Purpose:
34* =============
35*>
36*> \verbatim
37*>
38*>
39*> CLA_PORPVGRW computes the reciprocal pivot growth factor
40*> norm(A)/norm(U). The "max absolute element" norm is used. If this is
41*> much less than 1, the stability of the LU factorization of the
42*> (equilibrated) matrix A could be poor. This also means that the
43*> solution X, estimated condition numbers, and error bounds could be
44*> unreliable.
45*> \endverbatim
46*
47* Arguments:
48* ==========
49*
50*> \param[in] UPLO
51*> \verbatim
52*> UPLO is CHARACTER*1
53*> = 'U': Upper triangle of A is stored;
54*> = 'L': Lower triangle of A is stored.
55*> \endverbatim
56*>
57*> \param[in] NCOLS
58*> \verbatim
59*> NCOLS is INTEGER
60*> The number of columns of the matrix A. NCOLS >= 0.
61*> \endverbatim
62*>
63*> \param[in] A
64*> \verbatim
65*> A is COMPLEX 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 array, dimension (LDAF,N)
78*> The triangular factor U or L from the Cholesky factorization
79*> A = U**T*U or A = L*L**T, as computed by CPOTRF.
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[out] WORK
89*> \verbatim
90*> WORK is REAL array, dimension (2*N)
91*> \endverbatim
92*
93* Authors:
94* ========
95*
96*> \author Univ. of Tennessee
97*> \author Univ. of California Berkeley
98*> \author Univ. of Colorado Denver
99*> \author NAG Ltd.
100*
101*> \ingroup la_porpvgrw
102*
103* =====================================================================
104 REAL function cla_porpvgrw( uplo, ncols, a, lda, af, ldaf, work )
105*
106* -- LAPACK computational routine --
107* -- LAPACK is a software package provided by Univ. of Tennessee, --
108* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
109*
110* .. Scalar Arguments ..
111 CHARACTER*1 uplo
112 INTEGER ncols, lda, ldaf
113* ..
114* .. Array Arguments ..
115 COMPLEX a( lda, * ), af( ldaf, * )
116 REAL work( * )
117* ..
118*
119* =====================================================================
120*
121* .. Local Scalars ..
122 INTEGER i, j
123 REAL amax, umax, rpvgrw
124 LOGICAL upper
125 COMPLEX zdum
126* ..
127* .. External Functions ..
128 EXTERNAL lsame
129 LOGICAL lsame
130* ..
131* .. Intrinsic Functions ..
132 INTRINSIC abs, max, min, real, aimag
133* ..
134* .. Statement Functions ..
135 REAL cabs1
136* ..
137* .. Statement Function Definitions ..
138 cabs1( zdum ) = abs( real( zdum ) ) + abs( aimag( zdum ) )
139* ..
140* .. Executable Statements ..
141 upper = lsame( 'Upper', uplo )
142*
143* SPOTRF will have factored only the NCOLSxNCOLS leading submatrix,
144* so we restrict the growth search to that submatrix and use only
145* the first 2*NCOLS workspace entries.
146*
147 rpvgrw = 1.0
148 DO i = 1, 2*ncols
149 work( i ) = 0.0
150 END DO
151*
152* Find the max magnitude entry of each column.
153*
154 IF ( upper ) THEN
155 DO j = 1, ncols
156 DO i = 1, j
157 work( ncols+j ) =
158 $ max( cabs1( a( i, j ) ), work( ncols+j ) )
159 END DO
160 END DO
161 ELSE
162 DO j = 1, ncols
163 DO i = j, ncols
164 work( ncols+j ) =
165 $ max( cabs1( a( i, j ) ), work( ncols+j ) )
166 END DO
167 END DO
168 END IF
169*
170* Now find the max magnitude entry of each column of the factor in
171* AF. No pivoting, so no permutations.
172*
173 IF ( lsame( 'Upper', uplo ) ) THEN
174 DO j = 1, ncols
175 DO i = 1, j
176 work( j ) = max( cabs1( af( i, j ) ), work( j ) )
177 END DO
178 END DO
179 ELSE
180 DO j = 1, ncols
181 DO i = j, ncols
182 work( j ) = max( cabs1( af( i, j ) ), work( j ) )
183 END DO
184 END DO
185 END IF
186*
187* Compute the *inverse* of the max element growth factor. Dividing
188* by zero would imply the largest entry of the factor's column is
189* zero. Than can happen when either the column of A is zero or
190* massive pivots made the factor underflow to zero. Neither counts
191* as growth in itself, so simply ignore terms with zero
192* denominators.
193*
194 IF ( lsame( 'Upper', uplo ) ) THEN
195 DO i = 1, ncols
196 umax = work( i )
197 amax = work( ncols+i )
198 IF ( umax /= 0.0 ) THEN
199 rpvgrw = min( amax / umax, rpvgrw )
200 END IF
201 END DO
202 ELSE
203 DO i = 1, ncols
204 umax = work( i )
205 amax = work( ncols+i )
206 IF ( umax /= 0.0 ) THEN
207 rpvgrw = min( amax / umax, rpvgrw )
208 END IF
209 END DO
210 END IF
211
212 cla_porpvgrw = rpvgrw
213*
214* End of CLA_PORPVGRW
215*
216 END
real function cla_porpvgrw(uplo, ncols, a, lda, af, ldaf, work)
CLA_PORPVGRW computes the reciprocal pivot growth factor norm(A)/norm(U) for a symmetric or Hermitian...
logical function lsame(ca, cb)
LSAME
Definition lsame.f:48