00001 SUBROUTINE ZUNGTR( UPLO, N, A, LDA, TAU, WORK, LWORK, INFO )
00002
00003
00004
00005
00006
00007
00008
00009 CHARACTER UPLO
00010 INTEGER INFO, LDA, LWORK, N
00011
00012
00013 COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * )
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 COMPLEX*16 ZERO, ONE
00072 PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ),
00073 $ ONE = ( 1.0D+0, 0.0D+0 ) )
00074
00075
00076 LOGICAL LQUERY, UPPER
00077 INTEGER I, IINFO, J, LWKOPT, NB
00078
00079
00080 LOGICAL LSAME
00081 INTEGER ILAENV
00082 EXTERNAL LSAME, ILAENV
00083
00084
00085 EXTERNAL XERBLA, ZUNGQL, ZUNGQR
00086
00087
00088 INTRINSIC MAX
00089
00090
00091
00092
00093
00094 INFO = 0
00095 LQUERY = ( LWORK.EQ.-1 )
00096 UPPER = LSAME( UPLO, 'U' )
00097 IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
00098 INFO = -1
00099 ELSE IF( N.LT.0 ) THEN
00100 INFO = -2
00101 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
00102 INFO = -4
00103 ELSE IF( LWORK.LT.MAX( 1, N-1 ) .AND. .NOT.LQUERY ) THEN
00104 INFO = -7
00105 END IF
00106
00107 IF( INFO.EQ.0 ) THEN
00108 IF( UPPER ) THEN
00109 NB = ILAENV( 1, 'ZUNGQL', ' ', N-1, N-1, N-1, -1 )
00110 ELSE
00111 NB = ILAENV( 1, 'ZUNGQR', ' ', N-1, N-1, N-1, -1 )
00112 END IF
00113 LWKOPT = MAX( 1, N-1 )*NB
00114 WORK( 1 ) = LWKOPT
00115 END IF
00116
00117 IF( INFO.NE.0 ) THEN
00118 CALL XERBLA( 'ZUNGTR', -INFO )
00119 RETURN
00120 ELSE IF( LQUERY ) THEN
00121 RETURN
00122 END IF
00123
00124
00125
00126 IF( N.EQ.0 ) THEN
00127 WORK( 1 ) = 1
00128 RETURN
00129 END IF
00130
00131 IF( UPPER ) THEN
00132
00133
00134
00135
00136
00137
00138
00139 DO 20 J = 1, N - 1
00140 DO 10 I = 1, J - 1
00141 A( I, J ) = A( I, J+1 )
00142 10 CONTINUE
00143 A( N, J ) = ZERO
00144 20 CONTINUE
00145 DO 30 I = 1, N - 1
00146 A( I, N ) = ZERO
00147 30 CONTINUE
00148 A( N, N ) = ONE
00149
00150
00151
00152 CALL ZUNGQL( N-1, N-1, N-1, A, LDA, TAU, WORK, LWORK, IINFO )
00153
00154 ELSE
00155
00156
00157
00158
00159
00160
00161
00162 DO 50 J = N, 2, -1
00163 A( 1, J ) = ZERO
00164 DO 40 I = J + 1, N
00165 A( I, J ) = A( I, J-1 )
00166 40 CONTINUE
00167 50 CONTINUE
00168 A( 1, 1 ) = ONE
00169 DO 60 I = 2, N
00170 A( I, 1 ) = ZERO
00171 60 CONTINUE
00172 IF( N.GT.1 ) THEN
00173
00174
00175
00176 CALL ZUNGQR( N-1, N-1, N-1, A( 2, 2 ), LDA, TAU, WORK,
00177 $ LWORK, IINFO )
00178 END IF
00179 END IF
00180 WORK( 1 ) = LWKOPT
00181 RETURN
00182
00183
00184
00185 END