00001 SUBROUTINE DSPGST( ITYPE, UPLO, N, AP, BP, INFO )
00002
00003
00004
00005
00006
00007
00008
00009 CHARACTER UPLO
00010 INTEGER INFO, ITYPE, N
00011
00012
00013 DOUBLE PRECISION AP( * ), BP( * )
00014
00015
00016
00017
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 DOUBLE PRECISION ONE, HALF
00068 PARAMETER ( ONE = 1.0D0, HALF = 0.5D0 )
00069
00070
00071 LOGICAL UPPER
00072 INTEGER J, J1, J1J1, JJ, K, K1, K1K1, KK
00073 DOUBLE PRECISION AJJ, AKK, BJJ, BKK, CT
00074
00075
00076 EXTERNAL DAXPY, DSCAL, DSPMV, DSPR2, DTPMV, DTPSV,
00077 $ XERBLA
00078
00079
00080 LOGICAL LSAME
00081 DOUBLE PRECISION DDOT
00082 EXTERNAL LSAME, DDOT
00083
00084
00085
00086
00087
00088 INFO = 0
00089 UPPER = LSAME( UPLO, 'U' )
00090 IF( ITYPE.LT.1 .OR. ITYPE.GT.3 ) THEN
00091 INFO = -1
00092 ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
00093 INFO = -2
00094 ELSE IF( N.LT.0 ) THEN
00095 INFO = -3
00096 END IF
00097 IF( INFO.NE.0 ) THEN
00098 CALL XERBLA( 'DSPGST', -INFO )
00099 RETURN
00100 END IF
00101
00102 IF( ITYPE.EQ.1 ) THEN
00103 IF( UPPER ) THEN
00104
00105
00106
00107
00108
00109 JJ = 0
00110 DO 10 J = 1, N
00111 J1 = JJ + 1
00112 JJ = JJ + J
00113
00114
00115
00116 BJJ = BP( JJ )
00117 CALL DTPSV( UPLO, 'Transpose', 'Nonunit', J, BP,
00118 $ AP( J1 ), 1 )
00119 CALL DSPMV( UPLO, J-1, -ONE, AP, BP( J1 ), 1, ONE,
00120 $ AP( J1 ), 1 )
00121 CALL DSCAL( J-1, ONE / BJJ, AP( J1 ), 1 )
00122 AP( JJ ) = ( AP( JJ )-DDOT( J-1, AP( J1 ), 1, BP( J1 ),
00123 $ 1 ) ) / BJJ
00124 10 CONTINUE
00125 ELSE
00126
00127
00128
00129
00130
00131 KK = 1
00132 DO 20 K = 1, N
00133 K1K1 = KK + N - K + 1
00134
00135
00136
00137 AKK = AP( KK )
00138 BKK = BP( KK )
00139 AKK = AKK / BKK**2
00140 AP( KK ) = AKK
00141 IF( K.LT.N ) THEN
00142 CALL DSCAL( N-K, ONE / BKK, AP( KK+1 ), 1 )
00143 CT = -HALF*AKK
00144 CALL DAXPY( N-K, CT, BP( KK+1 ), 1, AP( KK+1 ), 1 )
00145 CALL DSPR2( UPLO, N-K, -ONE, AP( KK+1 ), 1,
00146 $ BP( KK+1 ), 1, AP( K1K1 ) )
00147 CALL DAXPY( N-K, CT, BP( KK+1 ), 1, AP( KK+1 ), 1 )
00148 CALL DTPSV( UPLO, 'No transpose', 'Non-unit', N-K,
00149 $ BP( K1K1 ), AP( KK+1 ), 1 )
00150 END IF
00151 KK = K1K1
00152 20 CONTINUE
00153 END IF
00154 ELSE
00155 IF( UPPER ) THEN
00156
00157
00158
00159
00160
00161 KK = 0
00162 DO 30 K = 1, N
00163 K1 = KK + 1
00164 KK = KK + K
00165
00166
00167
00168 AKK = AP( KK )
00169 BKK = BP( KK )
00170 CALL DTPMV( UPLO, 'No transpose', 'Non-unit', K-1, BP,
00171 $ AP( K1 ), 1 )
00172 CT = HALF*AKK
00173 CALL DAXPY( K-1, CT, BP( K1 ), 1, AP( K1 ), 1 )
00174 CALL DSPR2( UPLO, K-1, ONE, AP( K1 ), 1, BP( K1 ), 1,
00175 $ AP )
00176 CALL DAXPY( K-1, CT, BP( K1 ), 1, AP( K1 ), 1 )
00177 CALL DSCAL( K-1, BKK, AP( K1 ), 1 )
00178 AP( KK ) = AKK*BKK**2
00179 30 CONTINUE
00180 ELSE
00181
00182
00183
00184
00185
00186 JJ = 1
00187 DO 40 J = 1, N
00188 J1J1 = JJ + N - J + 1
00189
00190
00191
00192 AJJ = AP( JJ )
00193 BJJ = BP( JJ )
00194 AP( JJ ) = AJJ*BJJ + DDOT( N-J, AP( JJ+1 ), 1,
00195 $ BP( JJ+1 ), 1 )
00196 CALL DSCAL( N-J, BJJ, AP( JJ+1 ), 1 )
00197 CALL DSPMV( UPLO, N-J, ONE, AP( J1J1 ), BP( JJ+1 ), 1,
00198 $ ONE, AP( JJ+1 ), 1 )
00199 CALL DTPMV( UPLO, 'Transpose', 'Non-unit', N-J+1,
00200 $ BP( JJ ), AP( JJ ), 1 )
00201 JJ = J1J1
00202 40 CONTINUE
00203 END IF
00204 END IF
00205 RETURN
00206
00207
00208
00209 END