1: *> \brief \b ZGEQR
2: *
3: * Definition:
4: * ===========
5: *
6: * SUBROUTINE ZGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
7: * INFO )
8: *
9: * .. Scalar Arguments ..
10: * INTEGER INFO, LDA, M, N, TSIZE, LWORK
11: * ..
12: * .. Array Arguments ..
13: * COMPLEX*16 A( LDA, * ), T( * ), WORK( * )
14: * ..
15: *
16: *
17: *> \par Purpose:
18: * =============
19: *>
20: *> \verbatim
21: *>
22: *> ZGEQR computes a QR factorization of a complex M-by-N matrix A:
23: *>
24: *> A = Q * ( R ),
25: *> ( 0 )
26: *>
27: *> where:
28: *>
29: *> Q is a M-by-M orthogonal matrix;
30: *> R is an upper-triangular N-by-N matrix;
31: *> 0 is a (M-N)-by-N zero matrix, if M > N.
32: *>
33: *> \endverbatim
34: *
35: * Arguments:
36: * ==========
37: *
38: *> \param[in] M
39: *> \verbatim
40: *> M is INTEGER
41: *> The number of rows of the matrix A. M >= 0.
42: *> \endverbatim
43: *>
44: *> \param[in] N
45: *> \verbatim
46: *> N is INTEGER
47: *> The number of columns of the matrix A. N >= 0.
48: *> \endverbatim
49: *>
50: *> \param[in,out] A
51: *> \verbatim
52: *> A is COMPLEX*16 array, dimension (LDA,N)
53: *> On entry, the M-by-N matrix A.
54: *> On exit, the elements on and above the diagonal of the array
55: *> contain the min(M,N)-by-N upper trapezoidal matrix R
56: *> (R is upper triangular if M >= N);
57: *> the elements below the diagonal are used to store part of the
58: *> data structure to represent Q.
59: *> \endverbatim
60: *>
61: *> \param[in] LDA
62: *> \verbatim
63: *> LDA is INTEGER
64: *> The leading dimension of the array A. LDA >= max(1,M).
65: *> \endverbatim
66: *>
67: *> \param[out] T
68: *> \verbatim
69: *> T is COMPLEX*16 array, dimension (MAX(5,TSIZE))
70: *> On exit, if INFO = 0, T(1) returns optimal (or either minimal
71: *> or optimal, if query is assumed) TSIZE. See TSIZE for details.
72: *> Remaining T contains part of the data structure used to represent Q.
73: *> If one wants to apply or construct Q, then one needs to keep T
74: *> (in addition to A) and pass it to further subroutines.
75: *> \endverbatim
76: *>
77: *> \param[in] TSIZE
78: *> \verbatim
79: *> TSIZE is INTEGER
80: *> If TSIZE >= 5, the dimension of the array T.
81: *> If TSIZE = -1 or -2, then a workspace query is assumed. The routine
82: *> only calculates the sizes of the T and WORK arrays, returns these
83: *> values as the first entries of the T and WORK arrays, and no error
84: *> message related to T or WORK is issued by XERBLA.
85: *> If TSIZE = -1, the routine calculates optimal size of T for the
86: *> optimum performance and returns this value in T(1).
87: *> If TSIZE = -2, the routine calculates minimal size of T and
88: *> returns this value in T(1).
89: *> \endverbatim
90: *>
91: *> \param[out] WORK
92: *> \verbatim
93: *> (workspace) COMPLEX*16 array, dimension (MAX(1,LWORK))
94: *> On exit, if INFO = 0, WORK(1) contains optimal (or either minimal
95: *> or optimal, if query was assumed) LWORK.
96: *> See LWORK for details.
97: *> \endverbatim
98: *>
99: *> \param[in] LWORK
100: *> \verbatim
101: *> LWORK is INTEGER
102: *> The dimension of the array WORK.
103: *> If LWORK = -1 or -2, then a workspace query is assumed. The routine
104: *> only calculates the sizes of the T and WORK arrays, returns these
105: *> values as the first entries of the T and WORK arrays, and no error
106: *> message related to T or WORK is issued by XERBLA.
107: *> If LWORK = -1, the routine calculates optimal size of WORK for the
108: *> optimal performance and returns this value in WORK(1).
109: *> If LWORK = -2, the routine calculates minimal size of WORK and
110: *> returns this value in WORK(1).
111: *> \endverbatim
112: *>
113: *> \param[out] INFO
114: *> \verbatim
115: *> INFO is INTEGER
116: *> = 0: successful exit
117: *> < 0: if INFO = -i, the i-th argument had an illegal value
118: *> \endverbatim
119: *
120: * Authors:
121: * ========
122: *
123: *> \author Univ. of Tennessee
124: *> \author Univ. of California Berkeley
125: *> \author Univ. of Colorado Denver
126: *> \author NAG Ltd.
127: *
128: *> \par Further Details
129: * ====================
130: *>
131: *> \verbatim
132: *>
133: *> The goal of the interface is to give maximum freedom to the developers for
134: *> creating any QR factorization algorithm they wish. The triangular
135: *> (trapezoidal) R has to be stored in the upper part of A. The lower part of A
136: *> and the array T can be used to store any relevant information for applying or
137: *> constructing the Q factor. The WORK array can safely be discarded after exit.
138: *>
139: *> Caution: One should not expect the sizes of T and WORK to be the same from one
140: *> LAPACK implementation to the other, or even from one execution to the other.
141: *> A workspace query (for T and WORK) is needed at each execution. However,
142: *> for a given execution, the size of T and WORK are fixed and will not change
143: *> from one query to the next.
144: *>
145: *> \endverbatim
146: *>
147: *> \par Further Details particular to this LAPACK implementation:
148: * ==============================================================
149: *>
150: *> \verbatim
151: *>
152: *> These details are particular for this LAPACK implementation. Users should not
153: *> take them for granted. These details may change in the future, and are not likely
154: *> true for another LAPACK implementation. These details are relevant if one wants
155: *> to try to understand the code. They are not part of the interface.
156: *>
157: *> In this version,
158: *>
159: *> T(2): row block size (MB)
160: *> T(3): column block size (NB)
161: *> T(6:TSIZE): data structure needed for Q, computed by
162: *> ZLATSQR or ZGEQRT
163: *>
164: *> Depending on the matrix dimensions M and N, and row and column
165: *> block sizes MB and NB returned by ILAENV, ZGEQR will use either
166: *> ZLATSQR (if the matrix is tall-and-skinny) or ZGEQRT to compute
167: *> the QR factorization.
168: *>
169: *> \endverbatim
170: *>
171: * =====================================================================
172: SUBROUTINE ZGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK,
173: $ INFO )
174: *
175: * -- LAPACK computational routine --
176: * -- LAPACK is a software package provided by Univ. of Tennessee, --
177: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd. --
178: *
179: * .. Scalar Arguments ..
180: INTEGER INFO, LDA, M, N, TSIZE, LWORK
181: * ..
182: * .. Array Arguments ..
183: COMPLEX*16 A( LDA, * ), T( * ), WORK( * )
184: * ..
185: *
186: * =====================================================================
187: *
188: * ..
189: * .. Local Scalars ..
190: LOGICAL LQUERY, LMINWS, MINT, MINW
191: INTEGER MB, NB, MINTSZ, NBLCKS
192: * ..
193: * .. External Functions ..
194: LOGICAL LSAME
195: EXTERNAL LSAME
196: * ..
197: * .. External Subroutines ..
198: EXTERNAL ZLATSQR, ZGEQRT, XERBLA
199: * ..
200: * .. Intrinsic Functions ..
201: INTRINSIC MAX, MIN, MOD
202: * ..
203: * .. External Functions ..
204: INTEGER ILAENV
205: EXTERNAL ILAENV
206: * ..
207: * .. Executable Statements ..
208: *
209: * Test the input arguments
210: *
211: INFO = 0
212: *
213: LQUERY = ( TSIZE.EQ.-1 .OR. TSIZE.EQ.-2 .OR.
214: $ LWORK.EQ.-1 .OR. LWORK.EQ.-2 )
215: *
216: MINT = .FALSE.
217: MINW = .FALSE.
218: IF( TSIZE.EQ.-2 .OR. LWORK.EQ.-2 ) THEN
219: IF( TSIZE.NE.-1 ) MINT = .TRUE.
220: IF( LWORK.NE.-1 ) MINW = .TRUE.
221: END IF
222: *
223: * Determine the block size
224: *
225: IF( MIN ( M, N ).GT.0 ) THEN
226: MB = ILAENV( 1, 'ZGEQR ', ' ', M, N, 1, -1 )
227: NB = ILAENV( 1, 'ZGEQR ', ' ', M, N, 2, -1 )
228: ELSE
229: MB = M
230: NB = 1
231: END IF
232: IF( MB.GT.M .OR. MB.LE.N ) MB = M
233: IF( NB.GT.MIN( M, N ) .OR. NB.LT.1 ) NB = 1
234: MINTSZ = N + 5
235: IF( MB.GT.N .AND. M.GT.N ) THEN
236: IF( MOD( M - N, MB - N ).EQ.0 ) THEN
237: NBLCKS = ( M - N ) / ( MB - N )
238: ELSE
239: NBLCKS = ( M - N ) / ( MB - N ) + 1
240: END IF
241: ELSE
242: NBLCKS = 1
243: END IF
244: *
245: * Determine if the workspace size satisfies minimal size
246: *
247: LMINWS = .FALSE.
248: IF( ( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 ) .OR. LWORK.LT.NB*N )
249: $ .AND. ( LWORK.GE.N ) .AND. ( TSIZE.GE.MINTSZ )
250: $ .AND. ( .NOT.LQUERY ) ) THEN
251: IF( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 ) ) THEN
252: LMINWS = .TRUE.
253: NB = 1
254: MB = M
255: END IF
256: IF( LWORK.LT.NB*N ) THEN
257: LMINWS = .TRUE.
258: NB = 1
259: END IF
260: END IF
261: *
262: IF( M.LT.0 ) THEN
263: INFO = -1
264: ELSE IF( N.LT.0 ) THEN
265: INFO = -2
266: ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
267: INFO = -4
268: ELSE IF( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 )
269: $ .AND. ( .NOT.LQUERY ) .AND. ( .NOT.LMINWS ) ) THEN
270: INFO = -6
271: ELSE IF( ( LWORK.LT.MAX( 1, N*NB ) ) .AND. ( .NOT.LQUERY )
272: $ .AND. ( .NOT.LMINWS ) ) THEN
273: INFO = -8
274: END IF
275: *
276: IF( INFO.EQ.0 ) THEN
277: IF( MINT ) THEN
278: T( 1 ) = MINTSZ
279: ELSE
280: T( 1 ) = NB*N*NBLCKS + 5
281: END IF
282: T( 2 ) = MB
283: T( 3 ) = NB
284: IF( MINW ) THEN
285: WORK( 1 ) = MAX( 1, N )
286: ELSE
287: WORK( 1 ) = MAX( 1, NB*N )
288: END IF
289: END IF
290: IF( INFO.NE.0 ) THEN
291: CALL XERBLA( 'ZGEQR', -INFO )
292: RETURN
293: ELSE IF( LQUERY ) THEN
294: RETURN
295: END IF
296: *
297: * Quick return if possible
298: *
299: IF( MIN( M, N ).EQ.0 ) THEN
300: RETURN
301: END IF
302: *
303: * The QR Decomposition
304: *
305: IF( ( M.LE.N ) .OR. ( MB.LE.N ) .OR. ( MB.GE.M ) ) THEN
306: CALL ZGEQRT( M, N, NB, A, LDA, T( 6 ), NB, WORK, INFO )
307: ELSE
308: CALL ZLATSQR( M, N, MB, NB, A, LDA, T( 6 ), NB, WORK,
309: $ LWORK, INFO )
310: END IF
311: *
312: WORK( 1 ) = MAX( 1, NB*N )
313: *
314: RETURN
315: *
316: * End of ZGEQR
317: *
318: END
CVSweb interface <joel.bertrand@systella.fr>