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