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