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