LAPACK  3.10.0
LAPACK: Linear Algebra PACKage

◆ cgemqr()

subroutine cgemqr ( character  SIDE,
character  TRANS,
integer  M,
integer  N,
integer  K,
complex, dimension( lda, * )  A,
integer  LDA,
complex, dimension( * )  T,
integer  TSIZE,
complex, dimension( ldc, * )  C,
integer  LDC,
complex, dimension( * )  WORK,
integer  LWORK,
integer  INFO 
)

CGEMQR

Purpose:
 CGEMQR overwrites the general real M-by-N matrix C with

                      SIDE = 'L'     SIDE = 'R'
      TRANS = 'N':      Q * C          C * Q
      TRANS = 'T':      Q**H * C       C * Q**H

 where Q is a complex unitary matrix defined as the product
 of blocked elementary reflectors computed by tall skinny
 QR factorization (CGEQR)
Parameters
[in]SIDE
          SIDE is CHARACTER*1
          = 'L': apply Q or Q**H from the Left;
          = 'R': apply Q or Q**H from the Right.
[in]TRANS
          TRANS is CHARACTER*1
          = 'N':  No transpose, apply Q;
          = 'C':  Conjugate transpose, apply Q**H.
[in]M
          M is INTEGER
          The number of rows of the matrix A.  M >=0.
[in]N
          N is INTEGER
          The number of columns of the matrix C. N >= 0.
[in]K
          K is INTEGER
          The number of elementary reflectors whose product defines
          the matrix Q.
          If SIDE = 'L', M >= K >= 0;
          if SIDE = 'R', N >= K >= 0.
[in]A
          A is COMPLEX array, dimension (LDA,K)
          Part of the data structure to represent Q as returned by CGEQR.
[in]LDA
          LDA is INTEGER
          The leading dimension of the array A.
          If SIDE = 'L', LDA >= max(1,M);
          if SIDE = 'R', LDA >= max(1,N).
[in]T
          T is COMPLEX array, dimension (MAX(5,TSIZE)).
          Part of the data structure to represent Q as returned by CGEQR.
[in]TSIZE
          TSIZE is INTEGER
          The dimension of the array T. TSIZE >= 5.
[in,out]C
          C is COMPLEX array, dimension (LDC,N)
          On entry, the M-by-N matrix C.
          On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q.
[in]LDC
          LDC is INTEGER
          The leading dimension of the array C. LDC >= max(1,M).
[out]WORK
         (workspace) COMPLEX array, dimension (MAX(1,LWORK))
[in]LWORK
          LWORK is INTEGER
          The dimension of the array WORK.
          If LWORK = -1, then a workspace query is assumed. The routine
          only calculates the size of the WORK array, returns this
          value as WORK(1), and no error message related to WORK 
          is issued by XERBLA.
[out]INFO
          INFO is INTEGER
          = 0:  successful exit
          < 0:  if INFO = -i, the i-th argument had an illegal value
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Further Details
 These details are particular for this LAPACK implementation. Users should not 
 take them for granted. These details may change in the future, and are not likely
 true for another LAPACK implementation. These details are relevant if one wants
 to try to understand the code. They are not part of the interface.

 In this version,

          T(2): row block size (MB)
          T(3): column block size (NB)
          T(6:TSIZE): data structure needed for Q, computed by
                           CLATSQR or CGEQRT

  Depending on the matrix dimensions M and N, and row and column
  block sizes MB and NB returned by ILAENV, CGEQR will use either
  CLATSQR (if the matrix is tall-and-skinny) or CGEQRT to compute
  the QR factorization.
  This version of CGEMQR will use either CLAMTSQR or CGEMQRT to
  multiply matrix Q by another matrix.
  Further Details in CLAMTSQR or CGEMQRT.

Definition at line 170 of file cgemqr.f.

172 *
173 * -- LAPACK computational routine --
174 * -- LAPACK is a software package provided by Univ. of Tennessee, --
175 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
176 *
177 * .. Scalar Arguments ..
178  CHARACTER SIDE, TRANS
179  INTEGER INFO, LDA, M, N, K, TSIZE, LWORK, LDC
180 * ..
181 * .. Array Arguments ..
182  COMPLEX A( LDA, * ), T( * ), C( LDC, * ), WORK( * )
183 * ..
184 *
185 * =====================================================================
186 *
187 * ..
188 * .. Local Scalars ..
189  LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
190  INTEGER MB, NB, LW, NBLCKS, MN
191 * ..
192 * .. External Functions ..
193  LOGICAL LSAME
194  EXTERNAL lsame
195 * ..
196 * .. External Subroutines ..
197  EXTERNAL cgemqrt, clamtsqr, xerbla
198 * ..
199 * .. Intrinsic Functions ..
200  INTRINSIC int, max, min, mod
201 * ..
202 * .. Executable Statements ..
203 *
204 * Test the input arguments
205 *
206  lquery = lwork.EQ.-1
207  notran = lsame( trans, 'N' )
208  tran = lsame( trans, 'C' )
209  left = lsame( side, 'L' )
210  right = lsame( side, 'R' )
211 *
212  mb = int( t( 2 ) )
213  nb = int( t( 3 ) )
214  IF( left ) THEN
215  lw = n * nb
216  mn = m
217  ELSE
218  lw = mb * nb
219  mn = n
220  END IF
221 *
222  IF( ( mb.GT.k ) .AND. ( mn.GT.k ) ) THEN
223  IF( mod( mn - k, mb - k ).EQ.0 ) THEN
224  nblcks = ( mn - k ) / ( mb - k )
225  ELSE
226  nblcks = ( mn - k ) / ( mb - k ) + 1
227  END IF
228  ELSE
229  nblcks = 1
230  END IF
231 *
232  info = 0
233  IF( .NOT.left .AND. .NOT.right ) THEN
234  info = -1
235  ELSE IF( .NOT.tran .AND. .NOT.notran ) THEN
236  info = -2
237  ELSE IF( m.LT.0 ) THEN
238  info = -3
239  ELSE IF( n.LT.0 ) THEN
240  info = -4
241  ELSE IF( k.LT.0 .OR. k.GT.mn ) THEN
242  info = -5
243  ELSE IF( lda.LT.max( 1, mn ) ) THEN
244  info = -7
245  ELSE IF( tsize.LT.5 ) THEN
246  info = -9
247  ELSE IF( ldc.LT.max( 1, m ) ) THEN
248  info = -11
249  ELSE IF( ( lwork.LT.max( 1, lw ) ) .AND. ( .NOT.lquery ) ) THEN
250  info = -13
251  END IF
252 *
253  IF( info.EQ.0 ) THEN
254  work( 1 ) = lw
255  END IF
256 *
257  IF( info.NE.0 ) THEN
258  CALL xerbla( 'CGEMQR', -info )
259  RETURN
260  ELSE IF( lquery ) THEN
261  RETURN
262  END IF
263 *
264 * Quick return if possible
265 *
266  IF( min( m, n, k ).EQ.0 ) THEN
267  RETURN
268  END IF
269 *
270  IF( ( left .AND. m.LE.k ) .OR. ( right .AND. n.LE.k )
271  $ .OR. ( mb.LE.k ) .OR. ( mb.GE.max( m, n, k ) ) ) THEN
272  CALL cgemqrt( side, trans, m, n, k, nb, a, lda, t( 6 ),
273  $ nb, c, ldc, work, info )
274  ELSE
275  CALL clamtsqr( side, trans, m, n, k, mb, nb, a, lda, t( 6 ),
276  $ nb, c, ldc, work, lwork, info )
277  END IF
278 *
279  work( 1 ) = lw
280 *
281  RETURN
282 *
283 * End of CGEMQR
284 *
subroutine clamtsqr(SIDE, TRANS, M, N, K, MB, NB, A, LDA, T, LDT, C, LDC, WORK, LWORK, INFO)
CLAMTSQR
Definition: clamtsqr.f:198
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:60
logical function lsame(CA, CB)
LSAME
Definition: lsame.f:53
subroutine cgemqrt(SIDE, TRANS, M, N, K, NB, V, LDV, T, LDT, C, LDC, WORK, INFO)
CGEMQRT
Definition: cgemqrt.f:168
Here is the call graph for this function:
Here is the caller graph for this function: