00001 SUBROUTINE DLARGE( N, A, LDA, ISEED, WORK, INFO )
00002
00003
00004
00005
00006
00007
00008 INTEGER INFO, LDA, N
00009
00010
00011 INTEGER ISEED( 4 )
00012 DOUBLE PRECISION A( LDA, * ), 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 DOUBLE PRECISION ZERO, ONE
00051 PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 )
00052
00053
00054 INTEGER I
00055 DOUBLE PRECISION TAU, WA, WB, WN
00056
00057
00058 EXTERNAL DGEMV, DGER, DLARNV, DSCAL, XERBLA
00059
00060
00061 INTRINSIC MAX, SIGN
00062
00063
00064 DOUBLE PRECISION DNRM2
00065 EXTERNAL DNRM2
00066
00067
00068
00069
00070
00071 INFO = 0
00072 IF( N.LT.0 ) THEN
00073 INFO = -1
00074 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
00075 INFO = -3
00076 END IF
00077 IF( INFO.LT.0 ) THEN
00078 CALL XERBLA( 'DLARGE', -INFO )
00079 RETURN
00080 END IF
00081
00082
00083
00084 DO 10 I = N, 1, -1
00085
00086
00087
00088 CALL DLARNV( 3, ISEED, N-I+1, WORK )
00089 WN = DNRM2( N-I+1, WORK, 1 )
00090 WA = SIGN( WN, WORK( 1 ) )
00091 IF( WN.EQ.ZERO ) THEN
00092 TAU = ZERO
00093 ELSE
00094 WB = WORK( 1 ) + WA
00095 CALL DSCAL( N-I, ONE / WB, WORK( 2 ), 1 )
00096 WORK( 1 ) = ONE
00097 TAU = WB / WA
00098 END IF
00099
00100
00101
00102 CALL DGEMV( 'Transpose', N-I+1, N, ONE, A( I, 1 ), LDA, WORK,
00103 $ 1, ZERO, WORK( N+1 ), 1 )
00104 CALL DGER( N-I+1, N, -TAU, WORK, 1, WORK( N+1 ), 1, A( I, 1 ),
00105 $ LDA )
00106
00107
00108
00109 CALL DGEMV( 'No transpose', N, N-I+1, ONE, A( 1, I ), LDA,
00110 $ WORK, 1, ZERO, WORK( N+1 ), 1 )
00111 CALL DGER( N, N-I+1, -TAU, WORK( N+1 ), 1, WORK, 1, A( 1, I ),
00112 $ LDA )
00113 10 CONTINUE
00114 RETURN
00115
00116
00117
00118 END