00001 SUBROUTINE ZUNGHR( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
00002
00003
00004
00005
00006
00007
00008
00009 INTEGER IHI, ILO, INFO, LDA, LWORK, N
00010
00011
00012 COMPLEX*16 A( LDA, * ), TAU( * ), 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
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 COMPLEX*16 ZERO, ONE
00070 PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ),
00071 $ ONE = ( 1.0D+0, 0.0D+0 ) )
00072
00073
00074 LOGICAL LQUERY
00075 INTEGER I, IINFO, J, LWKOPT, NB, NH
00076
00077
00078 EXTERNAL XERBLA, ZUNGQR
00079
00080
00081 INTEGER ILAENV
00082 EXTERNAL ILAENV
00083
00084
00085 INTRINSIC MAX, MIN
00086
00087
00088
00089
00090
00091 INFO = 0
00092 NH = IHI - ILO
00093 LQUERY = ( LWORK.EQ.-1 )
00094 IF( N.LT.0 ) THEN
00095 INFO = -1
00096 ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
00097 INFO = -2
00098 ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
00099 INFO = -3
00100 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
00101 INFO = -5
00102 ELSE IF( LWORK.LT.MAX( 1, NH ) .AND. .NOT.LQUERY ) THEN
00103 INFO = -8
00104 END IF
00105
00106 IF( INFO.EQ.0 ) THEN
00107 NB = ILAENV( 1, 'ZUNGQR', ' ', NH, NH, NH, -1 )
00108 LWKOPT = MAX( 1, NH )*NB
00109 WORK( 1 ) = LWKOPT
00110 END IF
00111
00112 IF( INFO.NE.0 ) THEN
00113 CALL XERBLA( 'ZUNGHR', -INFO )
00114 RETURN
00115 ELSE IF( LQUERY ) THEN
00116 RETURN
00117 END IF
00118
00119
00120
00121 IF( N.EQ.0 ) THEN
00122 WORK( 1 ) = 1
00123 RETURN
00124 END IF
00125
00126
00127
00128
00129
00130 DO 40 J = IHI, ILO + 1, -1
00131 DO 10 I = 1, J - 1
00132 A( I, J ) = ZERO
00133 10 CONTINUE
00134 DO 20 I = J + 1, IHI
00135 A( I, J ) = A( I, J-1 )
00136 20 CONTINUE
00137 DO 30 I = IHI + 1, N
00138 A( I, J ) = ZERO
00139 30 CONTINUE
00140 40 CONTINUE
00141 DO 60 J = 1, ILO
00142 DO 50 I = 1, N
00143 A( I, J ) = ZERO
00144 50 CONTINUE
00145 A( J, J ) = ONE
00146 60 CONTINUE
00147 DO 80 J = IHI + 1, N
00148 DO 70 I = 1, N
00149 A( I, J ) = ZERO
00150 70 CONTINUE
00151 A( J, J ) = ONE
00152 80 CONTINUE
00153
00154 IF( NH.GT.0 ) THEN
00155
00156
00157
00158 CALL ZUNGQR( NH, NH, NH, A( ILO+1, ILO+1 ), LDA, TAU( ILO ),
00159 $ WORK, LWORK, IINFO )
00160 END IF
00161 WORK( 1 ) = LWKOPT
00162 RETURN
00163
00164
00165
00166 END