comparison libcruft/lapack/zunmbr.f @ 7034:68db500cb558

[project @ 2007-10-16 18:54:19 by jwe]
author jwe
date Tue, 16 Oct 2007 18:54:23 +0000
parents 15cddaacbc2d
children
comparison
equal deleted inserted replaced
7033:f0142f2afdc6 7034:68db500cb558
1 SUBROUTINE ZUNMBR( VECT, SIDE, TRANS, M, N, K, A, LDA, TAU, C, 1 SUBROUTINE ZUNMBR( VECT, SIDE, TRANS, M, N, K, A, LDA, TAU, C,
2 $ LDC, WORK, LWORK, INFO ) 2 $ LDC, WORK, LWORK, INFO )
3 * 3 *
4 * -- LAPACK routine (version 3.0) -- 4 * -- LAPACK routine (version 3.1) --
5 * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., 5 * Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
6 * Courant Institute, Argonne National Lab, and Rice University 6 * November 2006
7 * June 30, 1999
8 * 7 *
9 * .. Scalar Arguments .. 8 * .. Scalar Arguments ..
10 CHARACTER SIDE, TRANS, VECT 9 CHARACTER SIDE, TRANS, VECT
11 INTEGER INFO, K, LDA, LDC, LWORK, M, N 10 INTEGER INFO, K, LDA, LDC, LWORK, M, N
12 * .. 11 * ..
96 * or P*C or P**H*C or C*P or C*P**H. 95 * or P*C or P**H*C or C*P or C*P**H.
97 * 96 *
98 * LDC (input) INTEGER 97 * LDC (input) INTEGER
99 * The leading dimension of the array C. LDC >= max(1,M). 98 * The leading dimension of the array C. LDC >= max(1,M).
100 * 99 *
101 * WORK (workspace/output) COMPLEX*16 array, dimension (LWORK) 100 * WORK (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
102 * On exit, if INFO = 0, WORK(1) returns the optimal LWORK. 101 * On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
103 * 102 *
104 * LWORK (input) INTEGER 103 * LWORK (input) INTEGER
105 * The dimension of the array WORK. 104 * The dimension of the array WORK.
106 * If SIDE = 'L', LWORK >= max(1,N); 105 * If SIDE = 'L', LWORK >= max(1,N);
107 * if SIDE = 'R', LWORK >= max(1,M). 106 * if SIDE = 'R', LWORK >= max(1,M);
108 * For optimum performance LWORK >= N*NB if SIDE = 'L', and 107 * if N = 0 or M = 0, LWORK >= 1.
109 * LWORK >= M*NB if SIDE = 'R', where NB is the optimal 108 * For optimum performance LWORK >= max(1,N*NB) if SIDE = 'L',
110 * blocksize. 109 * and LWORK >= max(1,M*NB) if SIDE = 'R', where NB is the
110 * optimal blocksize. (NB = 0 if M = 0 or N = 0.)
111 * 111 *
112 * If LWORK = -1, then a workspace query is assumed; the routine 112 * If LWORK = -1, then a workspace query is assumed; the routine
113 * only calculates the optimal size of the WORK array, returns 113 * only calculates the optimal size of the WORK array, returns
114 * this value as the first entry of the WORK array, and no error 114 * this value as the first entry of the WORK array, and no error
115 * message related to LWORK is issued by XERBLA. 115 * message related to LWORK is issued by XERBLA.
152 NQ = M 152 NQ = M
153 NW = N 153 NW = N
154 ELSE 154 ELSE
155 NQ = N 155 NQ = N
156 NW = M 156 NW = M
157 END IF
158 IF( M.EQ.0 .OR. N.EQ.0 ) THEN
159 NW = 0
157 END IF 160 END IF
158 IF( .NOT.APPLYQ .AND. .NOT.LSAME( VECT, 'P' ) ) THEN 161 IF( .NOT.APPLYQ .AND. .NOT.LSAME( VECT, 'P' ) ) THEN
159 INFO = -1 162 INFO = -1
160 ELSE IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN 163 ELSE IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
161 INFO = -2 164 INFO = -2
176 ELSE IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN 179 ELSE IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN
177 INFO = -13 180 INFO = -13
178 END IF 181 END IF
179 * 182 *
180 IF( INFO.EQ.0 ) THEN 183 IF( INFO.EQ.0 ) THEN
181 IF( APPLYQ ) THEN 184 IF( NW.GT.0 ) THEN
182 IF( LEFT ) THEN 185 IF( APPLYQ ) THEN
183 NB = ILAENV( 1, 'ZUNMQR', SIDE // TRANS, M-1, N, M-1, 186 IF( LEFT ) THEN
184 $ -1 ) 187 NB = ILAENV( 1, 'ZUNMQR', SIDE // TRANS, M-1, N, M-1,
188 $ -1 )
189 ELSE
190 NB = ILAENV( 1, 'ZUNMQR', SIDE // TRANS, M, N-1, N-1,
191 $ -1 )
192 END IF
185 ELSE 193 ELSE
186 NB = ILAENV( 1, 'ZUNMQR', SIDE // TRANS, M, N-1, N-1, 194 IF( LEFT ) THEN
187 $ -1 ) 195 NB = ILAENV( 1, 'ZUNMLQ', SIDE // TRANS, M-1, N, M-1,
196 $ -1 )
197 ELSE
198 NB = ILAENV( 1, 'ZUNMLQ', SIDE // TRANS, M, N-1, N-1,
199 $ -1 )
200 END IF
188 END IF 201 END IF
202 LWKOPT = MAX( 1, NW*NB )
189 ELSE 203 ELSE
190 IF( LEFT ) THEN 204 LWKOPT = 1
191 NB = ILAENV( 1, 'ZUNMLQ', SIDE // TRANS, M-1, N, M-1, 205 END IF
192 $ -1 )
193 ELSE
194 NB = ILAENV( 1, 'ZUNMLQ', SIDE // TRANS, M, N-1, N-1,
195 $ -1 )
196 END IF
197 END IF
198 LWKOPT = MAX( 1, NW )*NB
199 WORK( 1 ) = LWKOPT 206 WORK( 1 ) = LWKOPT
200 END IF 207 END IF
201 * 208 *
202 IF( INFO.NE.0 ) THEN 209 IF( INFO.NE.0 ) THEN
203 CALL XERBLA( 'ZUNMBR', -INFO ) 210 CALL XERBLA( 'ZUNMBR', -INFO )
204 RETURN 211 RETURN
205 ELSE IF( LQUERY ) THEN 212 ELSE IF( LQUERY ) THEN
213 RETURN
206 END IF 214 END IF
207 * 215 *
208 * Quick return if possible 216 * Quick return if possible
209 * 217 *
210 WORK( 1 ) = 1
211 IF( M.EQ.0 .OR. N.EQ.0 ) 218 IF( M.EQ.0 .OR. N.EQ.0 )
212 $ RETURN 219 $ RETURN
213 * 220 *
214 IF( APPLYQ ) THEN 221 IF( APPLYQ ) THEN
215 * 222 *