00001 SUBROUTINE SORGRQ( M, N, K, A, LDA, TAU, WORK, LWORK, INFO )
00002
00003
00004
00005
00006
00007
00008
00009 INTEGER INFO, K, LDA, LWORK, M, N
00010
00011
00012 REAL 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
00070
00071
00072
00073 REAL ZERO
00074 PARAMETER ( ZERO = 0.0E+0 )
00075
00076
00077 LOGICAL LQUERY
00078 INTEGER I, IB, II, IINFO, IWS, J, KK, L, LDWORK,
00079 $ LWKOPT, NB, NBMIN, NX
00080
00081
00082 EXTERNAL SLARFB, SLARFT, SORGR2, XERBLA
00083
00084
00085 INTRINSIC MAX, MIN
00086
00087
00088 INTEGER ILAENV
00089 EXTERNAL ILAENV
00090
00091
00092
00093
00094
00095 INFO = 0
00096 LQUERY = ( LWORK.EQ.-1 )
00097 IF( M.LT.0 ) THEN
00098 INFO = -1
00099 ELSE IF( N.LT.M ) THEN
00100 INFO = -2
00101 ELSE IF( K.LT.0 .OR. K.GT.M ) THEN
00102 INFO = -3
00103 ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
00104 INFO = -5
00105 END IF
00106
00107 IF( INFO.EQ.0 ) THEN
00108 IF( M.LE.0 ) THEN
00109 LWKOPT = 1
00110 ELSE
00111 NB = ILAENV( 1, 'SORGRQ', ' ', M, N, K, -1 )
00112 LWKOPT = M*NB
00113 END IF
00114 WORK( 1 ) = LWKOPT
00115
00116 IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
00117 INFO = -8
00118 END IF
00119 END IF
00120
00121 IF( INFO.NE.0 ) THEN
00122 CALL XERBLA( 'SORGRQ', -INFO )
00123 RETURN
00124 ELSE IF( LQUERY ) THEN
00125 RETURN
00126 END IF
00127
00128
00129
00130 IF( M.LE.0 ) THEN
00131 RETURN
00132 END IF
00133
00134 NBMIN = 2
00135 NX = 0
00136 IWS = M
00137 IF( NB.GT.1 .AND. NB.LT.K ) THEN
00138
00139
00140
00141 NX = MAX( 0, ILAENV( 3, 'SORGRQ', ' ', M, N, K, -1 ) )
00142 IF( NX.LT.K ) THEN
00143
00144
00145
00146 LDWORK = M
00147 IWS = LDWORK*NB
00148 IF( LWORK.LT.IWS ) THEN
00149
00150
00151
00152
00153 NB = LWORK / LDWORK
00154 NBMIN = MAX( 2, ILAENV( 2, 'SORGRQ', ' ', M, N, K, -1 ) )
00155 END IF
00156 END IF
00157 END IF
00158
00159 IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
00160
00161
00162
00163
00164 KK = MIN( K, ( ( K-NX+NB-1 ) / NB )*NB )
00165
00166
00167
00168 DO 20 J = N - KK + 1, N
00169 DO 10 I = 1, M - KK
00170 A( I, J ) = ZERO
00171 10 CONTINUE
00172 20 CONTINUE
00173 ELSE
00174 KK = 0
00175 END IF
00176
00177
00178
00179 CALL SORGR2( M-KK, N-KK, K-KK, A, LDA, TAU, WORK, IINFO )
00180
00181 IF( KK.GT.0 ) THEN
00182
00183
00184
00185 DO 50 I = K - KK + 1, K, NB
00186 IB = MIN( NB, K-I+1 )
00187 II = M - K + I
00188 IF( II.GT.1 ) THEN
00189
00190
00191
00192
00193 CALL SLARFT( 'Backward', 'Rowwise', N-K+I+IB-1, IB,
00194 $ A( II, 1 ), LDA, TAU( I ), WORK, LDWORK )
00195
00196
00197
00198 CALL SLARFB( 'Right', 'Transpose', 'Backward', 'Rowwise',
00199 $ II-1, N-K+I+IB-1, IB, A( II, 1 ), LDA, WORK,
00200 $ LDWORK, A, LDA, WORK( IB+1 ), LDWORK )
00201 END IF
00202
00203
00204
00205 CALL SORGR2( IB, N-K+I+IB-1, IB, A( II, 1 ), LDA, TAU( I ),
00206 $ WORK, IINFO )
00207
00208
00209
00210 DO 40 L = N - K + I + IB, N
00211 DO 30 J = II, II + IB - 1
00212 A( J, L ) = ZERO
00213 30 CONTINUE
00214 40 CONTINUE
00215 50 CONTINUE
00216 END IF
00217
00218 WORK( 1 ) = IWS
00219 RETURN
00220
00221
00222
00223 END