00001 SUBROUTINE DPPCON( UPLO, N, AP, ANORM, RCOND, WORK, IWORK, INFO )
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 CHARACTER UPLO
00012 INTEGER INFO, N
00013 DOUBLE PRECISION ANORM, RCOND
00014
00015
00016 INTEGER IWORK( * )
00017 DOUBLE PRECISION AP( * ), WORK( * )
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 DOUBLE PRECISION ONE, ZERO
00069 PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 )
00070
00071
00072 LOGICAL UPPER
00073 CHARACTER NORMIN
00074 INTEGER IX, KASE
00075 DOUBLE PRECISION AINVNM, SCALE, SCALEL, SCALEU, SMLNUM
00076
00077
00078 INTEGER ISAVE( 3 )
00079
00080
00081 LOGICAL LSAME
00082 INTEGER IDAMAX
00083 DOUBLE PRECISION DLAMCH
00084 EXTERNAL LSAME, IDAMAX, DLAMCH
00085
00086
00087 EXTERNAL DLACN2, DLATPS, DRSCL, XERBLA
00088
00089
00090 INTRINSIC ABS
00091
00092
00093
00094
00095
00096 INFO = 0
00097 UPPER = LSAME( UPLO, 'U' )
00098 IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
00099 INFO = -1
00100 ELSE IF( N.LT.0 ) THEN
00101 INFO = -2
00102 ELSE IF( ANORM.LT.ZERO ) THEN
00103 INFO = -4
00104 END IF
00105 IF( INFO.NE.0 ) THEN
00106 CALL XERBLA( 'DPPCON', -INFO )
00107 RETURN
00108 END IF
00109
00110
00111
00112 RCOND = ZERO
00113 IF( N.EQ.0 ) THEN
00114 RCOND = ONE
00115 RETURN
00116 ELSE IF( ANORM.EQ.ZERO ) THEN
00117 RETURN
00118 END IF
00119
00120 SMLNUM = DLAMCH( 'Safe minimum' )
00121
00122
00123
00124 KASE = 0
00125 NORMIN = 'N'
00126 10 CONTINUE
00127 CALL DLACN2( N, WORK( N+1 ), WORK, IWORK, AINVNM, KASE, ISAVE )
00128 IF( KASE.NE.0 ) THEN
00129 IF( UPPER ) THEN
00130
00131
00132
00133 CALL DLATPS( 'Upper', 'Transpose', 'Non-unit', NORMIN, N,
00134 $ AP, WORK, SCALEL, WORK( 2*N+1 ), INFO )
00135 NORMIN = 'Y'
00136
00137
00138
00139 CALL DLATPS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
00140 $ AP, WORK, SCALEU, WORK( 2*N+1 ), INFO )
00141 ELSE
00142
00143
00144
00145 CALL DLATPS( 'Lower', 'No transpose', 'Non-unit', NORMIN, N,
00146 $ AP, WORK, SCALEL, WORK( 2*N+1 ), INFO )
00147 NORMIN = 'Y'
00148
00149
00150
00151 CALL DLATPS( 'Lower', 'Transpose', 'Non-unit', NORMIN, N,
00152 $ AP, WORK, SCALEU, WORK( 2*N+1 ), INFO )
00153 END IF
00154
00155
00156
00157 SCALE = SCALEL*SCALEU
00158 IF( SCALE.NE.ONE ) THEN
00159 IX = IDAMAX( N, WORK, 1 )
00160 IF( SCALE.LT.ABS( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
00161 $ GO TO 20
00162 CALL DRSCL( N, SCALE, WORK, 1 )
00163 END IF
00164 GO TO 10
00165 END IF
00166
00167
00168
00169 IF( AINVNM.NE.ZERO )
00170 $ RCOND = ( ONE / AINVNM ) / ANORM
00171
00172 20 CONTINUE
00173 RETURN
00174
00175
00176
00177 END