1*> \brief \b DTBT06 2* 3* =========== DOCUMENTATION =========== 4* 5* Online html documentation available at 6* http://www.netlib.org/lapack/explore-html/ 7* 8* Definition: 9* =========== 10* 11* SUBROUTINE DTBT06( RCOND, RCONDC, UPLO, DIAG, N, KD, AB, LDAB, 12* WORK, RAT ) 13* 14* .. Scalar Arguments .. 15* CHARACTER DIAG, UPLO 16* INTEGER KD, LDAB, N 17* DOUBLE PRECISION RAT, RCOND, RCONDC 18* .. 19* .. Array Arguments .. 20* DOUBLE PRECISION AB( LDAB, * ), WORK( * ) 21* .. 22* 23* 24*> \par Purpose: 25* ============= 26*> 27*> \verbatim 28*> 29*> DTBT06 computes a test ratio comparing RCOND (the reciprocal 30*> condition number of a triangular matrix A) and RCONDC, the estimate 31*> computed by DTBCON. Information about the triangular matrix A is 32*> used if one estimate is zero and the other is non-zero to decide if 33*> underflow in the estimate is justified. 34*> \endverbatim 35* 36* Arguments: 37* ========== 38* 39*> \param[in] RCOND 40*> \verbatim 41*> RCOND is DOUBLE PRECISION 42*> The estimate of the reciprocal condition number obtained by 43*> forming the explicit inverse of the matrix A and computing 44*> RCOND = 1/( norm(A) * norm(inv(A)) ). 45*> \endverbatim 46*> 47*> \param[in] RCONDC 48*> \verbatim 49*> RCONDC is DOUBLE PRECISION 50*> The estimate of the reciprocal condition number computed by 51*> DTBCON. 52*> \endverbatim 53*> 54*> \param[in] UPLO 55*> \verbatim 56*> UPLO is CHARACTER 57*> Specifies whether the matrix A is upper or lower triangular. 58*> = 'U': Upper triangular 59*> = 'L': Lower triangular 60*> \endverbatim 61*> 62*> \param[in] DIAG 63*> \verbatim 64*> DIAG is CHARACTER 65*> Specifies whether or not the matrix A is unit triangular. 66*> = 'N': Non-unit triangular 67*> = 'U': Unit triangular 68*> \endverbatim 69*> 70*> \param[in] N 71*> \verbatim 72*> N is INTEGER 73*> The order of the matrix A. N >= 0. 74*> \endverbatim 75*> 76*> \param[in] KD 77*> \verbatim 78*> KD is INTEGER 79*> The number of superdiagonals or subdiagonals of the 80*> triangular band matrix A. KD >= 0. 81*> \endverbatim 82*> 83*> \param[in] AB 84*> \verbatim 85*> AB is DOUBLE PRECISION array, dimension (LDAB,N) 86*> The upper or lower triangular band matrix A, stored in the 87*> first kd+1 rows of the array. The j-th column of A is stored 88*> in the j-th column of the array AB as follows: 89*> if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; 90*> if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). 91*> \endverbatim 92*> 93*> \param[in] LDAB 94*> \verbatim 95*> LDAB is INTEGER 96*> The leading dimension of the array AB. LDAB >= KD+1. 97*> \endverbatim 98*> 99*> \param[out] WORK 100*> \verbatim 101*> WORK is DOUBLE PRECISION array, dimension (N) 102*> \endverbatim 103*> 104*> \param[out] RAT 105*> \verbatim 106*> RAT is DOUBLE PRECISION 107*> The test ratio. If both RCOND and RCONDC are nonzero, 108*> RAT = MAX( RCOND, RCONDC )/MIN( RCOND, RCONDC ) - 1. 109*> If RAT = 0, the two estimates are exactly the same. 110*> \endverbatim 111* 112* Authors: 113* ======== 114* 115*> \author Univ. of Tennessee 116*> \author Univ. of California Berkeley 117*> \author Univ. of Colorado Denver 118*> \author NAG Ltd. 119* 120*> \date December 2016 121* 122*> \ingroup double_lin 123* 124* ===================================================================== 125 SUBROUTINE DTBT06( RCOND, RCONDC, UPLO, DIAG, N, KD, AB, LDAB, 126 $ WORK, RAT ) 127* 128* -- LAPACK test routine (version 3.7.0) -- 129* -- LAPACK is a software package provided by Univ. of Tennessee, -- 130* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 131* December 2016 132* 133* .. Scalar Arguments .. 134 CHARACTER DIAG, UPLO 135 INTEGER KD, LDAB, N 136 DOUBLE PRECISION RAT, RCOND, RCONDC 137* .. 138* .. Array Arguments .. 139 DOUBLE PRECISION AB( LDAB, * ), WORK( * ) 140* .. 141* 142* ===================================================================== 143* 144* .. Parameters .. 145 DOUBLE PRECISION ZERO, ONE 146 PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 ) 147* .. 148* .. Local Scalars .. 149 DOUBLE PRECISION ANORM, BIGNUM, EPS, RMAX, RMIN, SMLNUM 150* .. 151* .. External Functions .. 152 DOUBLE PRECISION DLAMCH, DLANTB 153 EXTERNAL DLAMCH, DLANTB 154* .. 155* .. Intrinsic Functions .. 156 INTRINSIC MAX, MIN 157* .. 158* .. External Subroutines .. 159 EXTERNAL DLABAD 160* .. 161* .. Executable Statements .. 162* 163 EPS = DLAMCH( 'Epsilon' ) 164 RMAX = MAX( RCOND, RCONDC ) 165 RMIN = MIN( RCOND, RCONDC ) 166* 167* Do the easy cases first. 168* 169 IF( RMIN.LT.ZERO ) THEN 170* 171* Invalid value for RCOND or RCONDC, return 1/EPS. 172* 173 RAT = ONE / EPS 174* 175 ELSE IF( RMIN.GT.ZERO ) THEN 176* 177* Both estimates are positive, return RMAX/RMIN - 1. 178* 179 RAT = RMAX / RMIN - ONE 180* 181 ELSE IF( RMAX.EQ.ZERO ) THEN 182* 183* Both estimates zero. 184* 185 RAT = ZERO 186* 187 ELSE 188* 189* One estimate is zero, the other is non-zero. If the matrix is 190* ill-conditioned, return the nonzero estimate multiplied by 191* 1/EPS; if the matrix is badly scaled, return the nonzero 192* estimate multiplied by BIGNUM/TMAX, where TMAX is the maximum 193* element in absolute value in A. 194* 195 SMLNUM = DLAMCH( 'Safe minimum' ) 196 BIGNUM = ONE / SMLNUM 197 CALL DLABAD( SMLNUM, BIGNUM ) 198 ANORM = DLANTB( 'M', UPLO, DIAG, N, KD, AB, LDAB, WORK ) 199* 200 RAT = RMAX*( MIN( BIGNUM / MAX( ONE, ANORM ), ONE / EPS ) ) 201 END IF 202* 203 RETURN 204* 205* End of DTBT06 206* 207 END 208