1*> \brief \b ZLA_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 ZLA_PORPVGRW + dependencies 10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zla_porpvgrw.f"> 11*> [TGZ]</a> 12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zla_porpvgrw.f"> 13*> [ZIP]</a> 14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zla_porpvgrw.f"> 15*> [TXT]</a> 16*> \endhtmlonly 17* 18* Definition: 19* =========== 20* 21* DOUBLE PRECISION FUNCTION ZLA_PORPVGRW( UPLO, NCOLS, A, LDA, AF, 22* LDAF, WORK ) 23* 24* .. Scalar Arguments .. 25* CHARACTER*1 UPLO 26* INTEGER NCOLS, LDA, LDAF 27* .. 28* .. Array Arguments .. 29* COMPLEX*16 A( LDA, * ), AF( LDAF, * ) 30* DOUBLE PRECISION WORK( * ) 31* .. 32* 33* 34*> \par Purpose: 35* ============= 36*> 37*> \verbatim 38*> 39*> 40*> ZLA_PORPVGRW computes the reciprocal pivot growth factor 41*> norm(A)/norm(U). The "max absolute element" norm is used. If this is 42*> much less than 1, the stability of the LU factorization of the 43*> (equilibrated) matrix A could be poor. This also means that the 44*> solution X, estimated condition numbers, and error bounds could be 45*> unreliable. 46*> \endverbatim 47* 48* Arguments: 49* ========== 50* 51*> \param[in] UPLO 52*> \verbatim 53*> UPLO is CHARACTER*1 54*> = 'U': Upper triangle of A is stored; 55*> = 'L': Lower triangle of A is stored. 56*> \endverbatim 57*> 58*> \param[in] NCOLS 59*> \verbatim 60*> NCOLS is INTEGER 61*> The number of columns of the matrix A. NCOLS >= 0. 62*> \endverbatim 63*> 64*> \param[in] A 65*> \verbatim 66*> A is COMPLEX*16 array, dimension (LDA,N) 67*> On entry, the N-by-N matrix A. 68*> \endverbatim 69*> 70*> \param[in] LDA 71*> \verbatim 72*> LDA is INTEGER 73*> The leading dimension of the array A. LDA >= max(1,N). 74*> \endverbatim 75*> 76*> \param[in] AF 77*> \verbatim 78*> AF is COMPLEX*16 array, dimension (LDAF,N) 79*> The triangular factor U or L from the Cholesky factorization 80*> A = U**T*U or A = L*L**T, as computed by ZPOTRF. 81*> \endverbatim 82*> 83*> \param[in] LDAF 84*> \verbatim 85*> LDAF is INTEGER 86*> The leading dimension of the array AF. LDAF >= max(1,N). 87*> \endverbatim 88*> 89*> \param[out] WORK 90*> \verbatim 91*> WORK is DOUBLE PRECISION array, dimension (2*N) 92*> \endverbatim 93* 94* Authors: 95* ======== 96* 97*> \author Univ. of Tennessee 98*> \author Univ. of California Berkeley 99*> \author Univ. of Colorado Denver 100*> \author NAG Ltd. 101* 102*> \ingroup complex16POcomputational 103* 104* ===================================================================== 105 DOUBLE PRECISION FUNCTION ZLA_PORPVGRW( UPLO, NCOLS, A, LDA, AF, 106 $ LDAF, WORK ) 107* 108* -- LAPACK computational routine -- 109* -- LAPACK is a software package provided by Univ. of Tennessee, -- 110* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 111* 112* .. Scalar Arguments .. 113 CHARACTER*1 UPLO 114 INTEGER NCOLS, LDA, LDAF 115* .. 116* .. Array Arguments .. 117 COMPLEX*16 A( LDA, * ), AF( LDAF, * ) 118 DOUBLE PRECISION WORK( * ) 119* .. 120* 121* ===================================================================== 122* 123* .. Local Scalars .. 124 INTEGER I, J 125 DOUBLE PRECISION AMAX, UMAX, RPVGRW 126 LOGICAL UPPER 127 COMPLEX*16 ZDUM 128* .. 129* .. External Functions .. 130 EXTERNAL LSAME 131 LOGICAL LSAME 132* .. 133* .. Intrinsic Functions .. 134 INTRINSIC ABS, MAX, MIN, REAL, DIMAG 135* .. 136* .. Statement Functions .. 137 DOUBLE PRECISION CABS1 138* .. 139* .. Statement Function Definitions .. 140 CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) ) 141* .. 142* .. Executable Statements .. 143 UPPER = LSAME( 'Upper', UPLO ) 144* 145* DPOTRF will have factored only the NCOLSxNCOLS leading minor, so 146* we restrict the growth search to that minor and use only the first 147* 2*NCOLS workspace entries. 148* 149 RPVGRW = 1.0D+0 150 DO I = 1, 2*NCOLS 151 WORK( I ) = 0.0D+0 152 END DO 153* 154* Find the max magnitude entry of each column. 155* 156 IF ( UPPER ) THEN 157 DO J = 1, NCOLS 158 DO I = 1, J 159 WORK( NCOLS+J ) = 160 $ MAX( CABS1( A( I, J ) ), WORK( NCOLS+J ) ) 161 END DO 162 END DO 163 ELSE 164 DO J = 1, NCOLS 165 DO I = J, NCOLS 166 WORK( NCOLS+J ) = 167 $ MAX( CABS1( A( I, J ) ), WORK( NCOLS+J ) ) 168 END DO 169 END DO 170 END IF 171* 172* Now find the max magnitude entry of each column of the factor in 173* AF. No pivoting, so no permutations. 174* 175 IF ( LSAME( 'Upper', UPLO ) ) THEN 176 DO J = 1, NCOLS 177 DO I = 1, J 178 WORK( J ) = MAX( CABS1( AF( I, J ) ), WORK( J ) ) 179 END DO 180 END DO 181 ELSE 182 DO J = 1, NCOLS 183 DO I = J, NCOLS 184 WORK( J ) = MAX( CABS1( AF( I, J ) ), WORK( J ) ) 185 END DO 186 END DO 187 END IF 188* 189* Compute the *inverse* of the max element growth factor. Dividing 190* by zero would imply the largest entry of the factor's column is 191* zero. Than can happen when either the column of A is zero or 192* massive pivots made the factor underflow to zero. Neither counts 193* as growth in itself, so simply ignore terms with zero 194* denominators. 195* 196 IF ( LSAME( 'Upper', UPLO ) ) THEN 197 DO I = 1, NCOLS 198 UMAX = WORK( I ) 199 AMAX = WORK( NCOLS+I ) 200 IF ( UMAX /= 0.0D+0 ) THEN 201 RPVGRW = MIN( AMAX / UMAX, RPVGRW ) 202 END IF 203 END DO 204 ELSE 205 DO I = 1, NCOLS 206 UMAX = WORK( I ) 207 AMAX = WORK( NCOLS+I ) 208 IF ( UMAX /= 0.0D+0 ) THEN 209 RPVGRW = MIN( AMAX / UMAX, RPVGRW ) 210 END IF 211 END DO 212 END IF 213 214 ZLA_PORPVGRW = RPVGRW 215* 216* End of ZLA_PORPVGRW 217* 218 END 219