00001 SUBROUTINE DLAGSY( N, K, D, A, LDA, ISEED, WORK, INFO )
00002
00003
00004
00005
00006
00007
00008 INTEGER INFO, K, LDA, N
00009
00010
00011 INTEGER ISEED( 4 )
00012 DOUBLE PRECISION A( LDA, * ), D( * ), WORK( * )
00013
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 DOUBLE PRECISION ZERO, ONE, HALF
00059 PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0, HALF = 0.5D+0 )
00060
00061
00062 INTEGER I, J
00063 DOUBLE PRECISION ALPHA, TAU, WA, WB, WN
00064
00065
00066 EXTERNAL DAXPY, DGEMV, DGER, DLARNV, DSCAL, DSYMV,
00067 $ DSYR2, XERBLA
00068
00069
00070 DOUBLE PRECISION DDOT, DNRM2
00071 EXTERNAL DDOT, DNRM2
00072
00073
00074 INTRINSIC MAX, SIGN
00075
00076
00077
00078
00079
00080 INFO = 0
00081 IF( N.LT.0 ) THEN
00082 INFO = -1
00083 ELSE IF( K.LT.0 .OR. K.GT.N-1 ) THEN
00084 INFO = -2
00085 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
00086 INFO = -5
00087 END IF
00088 IF( INFO.LT.0 ) THEN
00089 CALL XERBLA( 'DLAGSY', -INFO )
00090 RETURN
00091 END IF
00092
00093
00094
00095 DO 20 J = 1, N
00096 DO 10 I = J + 1, N
00097 A( I, J ) = ZERO
00098 10 CONTINUE
00099 20 CONTINUE
00100 DO 30 I = 1, N
00101 A( I, I ) = D( I )
00102 30 CONTINUE
00103
00104
00105
00106 DO 40 I = N - 1, 1, -1
00107
00108
00109
00110 CALL DLARNV( 3, ISEED, N-I+1, WORK )
00111 WN = DNRM2( N-I+1, WORK, 1 )
00112 WA = SIGN( WN, WORK( 1 ) )
00113 IF( WN.EQ.ZERO ) THEN
00114 TAU = ZERO
00115 ELSE
00116 WB = WORK( 1 ) + WA
00117 CALL DSCAL( N-I, ONE / WB, WORK( 2 ), 1 )
00118 WORK( 1 ) = ONE
00119 TAU = WB / WA
00120 END IF
00121
00122
00123
00124
00125
00126
00127 CALL DSYMV( 'Lower', N-I+1, TAU, A( I, I ), LDA, WORK, 1, ZERO,
00128 $ WORK( N+1 ), 1 )
00129
00130
00131
00132 ALPHA = -HALF*TAU*DDOT( N-I+1, WORK( N+1 ), 1, WORK, 1 )
00133 CALL DAXPY( N-I+1, ALPHA, WORK, 1, WORK( N+1 ), 1 )
00134
00135
00136
00137 CALL DSYR2( 'Lower', N-I+1, -ONE, WORK, 1, WORK( N+1 ), 1,
00138 $ A( I, I ), LDA )
00139 40 CONTINUE
00140
00141
00142
00143 DO 60 I = 1, N - 1 - K
00144
00145
00146
00147 WN = DNRM2( N-K-I+1, A( K+I, I ), 1 )
00148 WA = SIGN( WN, A( K+I, I ) )
00149 IF( WN.EQ.ZERO ) THEN
00150 TAU = ZERO
00151 ELSE
00152 WB = A( K+I, I ) + WA
00153 CALL DSCAL( N-K-I, ONE / WB, A( K+I+1, I ), 1 )
00154 A( K+I, I ) = ONE
00155 TAU = WB / WA
00156 END IF
00157
00158
00159
00160 CALL DGEMV( 'Transpose', N-K-I+1, K-1, ONE, A( K+I, I+1 ), LDA,
00161 $ A( K+I, I ), 1, ZERO, WORK, 1 )
00162 CALL DGER( N-K-I+1, K-1, -TAU, A( K+I, I ), 1, WORK, 1,
00163 $ A( K+I, I+1 ), LDA )
00164
00165
00166
00167
00168
00169 CALL DSYMV( 'Lower', N-K-I+1, TAU, A( K+I, K+I ), LDA,
00170 $ A( K+I, I ), 1, ZERO, WORK, 1 )
00171
00172
00173
00174 ALPHA = -HALF*TAU*DDOT( N-K-I+1, WORK, 1, A( K+I, I ), 1 )
00175 CALL DAXPY( N-K-I+1, ALPHA, A( K+I, I ), 1, WORK, 1 )
00176
00177
00178
00179 CALL DSYR2( 'Lower', N-K-I+1, -ONE, A( K+I, I ), 1, WORK, 1,
00180 $ A( K+I, K+I ), LDA )
00181
00182 A( K+I, I ) = -WA
00183 DO 50 J = K + I + 1, N
00184 A( J, I ) = ZERO
00185 50 CONTINUE
00186 60 CONTINUE
00187
00188
00189
00190 DO 80 J = 1, N
00191 DO 70 I = J + 1, N
00192 A( J, I ) = A( I, J )
00193 70 CONTINUE
00194 80 CONTINUE
00195 RETURN
00196
00197
00198
00199 END