LAPACK  3.5.0
LAPACK: Linear Algebra PACKage
cunmrz.f File Reference

Go to the source code of this file.

Functions/Subroutines

subroutine cunmrz (SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
 CUNMRZ More...
 

Function/Subroutine Documentation

subroutine cunmrz ( character  SIDE,
character  TRANS,
integer  M,
integer  N,
integer  K,
integer  L,
complex, dimension( lda, * )  A,
integer  LDA,
complex, dimension( * )  TAU,
complex, dimension( ldc, * )  C,
integer  LDC,
complex, dimension( * )  WORK,
integer  LWORK,
integer  INFO 
)

CUNMRZ

Download CUNMRZ + dependencies [TGZ] [ZIP] [TXT]

Purpose:
 CUNMRZ overwrites the general complex M-by-N matrix C with

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

 where Q is a complex unitary matrix defined as the product of k
 elementary reflectors

       Q = H(1) H(2) . . . H(k)

 as returned by CTZRZF. Q is of order M if SIDE = 'L' and of order N
 if SIDE = 'R'.
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 C. 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]L
          L is INTEGER
          The number of columns of the matrix A containing
          the meaningful part of the Householder reflectors.
          If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0.
[in]A
          A is COMPLEX array, dimension
                               (LDA,M) if SIDE = 'L',
                               (LDA,N) if SIDE = 'R'
          The i-th row must contain the vector which defines the
          elementary reflector H(i), for i = 1,2,...,k, as returned by
          CTZRZF in the last k rows of its array argument A.
          A is modified by the routine but restored on exit.
[in]LDA
          LDA is INTEGER
          The leading dimension of the array A. LDA >= max(1,K).
[in]TAU
          TAU is COMPLEX array, dimension (K)
          TAU(i) must contain the scalar factor of the elementary
          reflector H(i), as returned by CTZRZF.
[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
          WORK is COMPLEX array, dimension (MAX(1,LWORK))
          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
[in]LWORK
          LWORK is INTEGER
          The dimension of the array WORK.
          If SIDE = 'L', LWORK >= max(1,N);
          if SIDE = 'R', LWORK >= max(1,M).
          For optimum performance LWORK >= N*NB if SIDE = 'L', and
          LWORK >= M*NB if SIDE = 'R', where NB is the optimal
          blocksize.

          If LWORK = -1, then a workspace query is assumed; the routine
          only calculates the optimal size of the WORK array, returns
          this value as the first entry of the WORK array, and no error
          message related to LWORK 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.
Date
November 2011
Contributors:
A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
Further Details:
 

Definition at line 191 of file cunmrz.f.

191 *
192 * -- LAPACK computational routine (version 3.4.0) --
193 * -- LAPACK is a software package provided by Univ. of Tennessee, --
194 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
195 * November 2011
196 *
197 * .. Scalar Arguments ..
198  CHARACTER side, trans
199  INTEGER info, k, l, lda, ldc, lwork, m, n
200 * ..
201 * .. Array Arguments ..
202  COMPLEX a( lda, * ), c( ldc, * ), tau( * ), work( * )
203 * ..
204 *
205 * =====================================================================
206 *
207 * .. Parameters ..
208  INTEGER nbmax, ldt
209  parameter( nbmax = 64, ldt = nbmax+1 )
210 * ..
211 * .. Local Scalars ..
212  LOGICAL left, lquery, notran
213  CHARACTER transt
214  INTEGER i, i1, i2, i3, ib, ic, iinfo, iws, ja, jc,
215  $ ldwork, lwkopt, mi, nb, nbmin, ni, nq, nw
216 * ..
217 * .. Local Arrays ..
218  COMPLEX t( ldt, nbmax )
219 * ..
220 * .. External Functions ..
221  LOGICAL lsame
222  INTEGER ilaenv
223  EXTERNAL lsame, ilaenv
224 * ..
225 * .. External Subroutines ..
226  EXTERNAL clarzb, clarzt, cunmr3, xerbla
227 * ..
228 * .. Intrinsic Functions ..
229  INTRINSIC max, min
230 * ..
231 * .. Executable Statements ..
232 *
233 * Test the input arguments
234 *
235  info = 0
236  left = lsame( side, 'L' )
237  notran = lsame( trans, 'N' )
238  lquery = ( lwork.EQ.-1 )
239 *
240 * NQ is the order of Q and NW is the minimum dimension of WORK
241 *
242  IF( left ) THEN
243  nq = m
244  nw = max( 1, n )
245  ELSE
246  nq = n
247  nw = max( 1, m )
248  END IF
249  IF( .NOT.left .AND. .NOT.lsame( side, 'R' ) ) THEN
250  info = -1
251  ELSE IF( .NOT.notran .AND. .NOT.lsame( trans, 'C' ) ) THEN
252  info = -2
253  ELSE IF( m.LT.0 ) THEN
254  info = -3
255  ELSE IF( n.LT.0 ) THEN
256  info = -4
257  ELSE IF( k.LT.0 .OR. k.GT.nq ) THEN
258  info = -5
259  ELSE IF( l.LT.0 .OR. ( left .AND. ( l.GT.m ) ) .OR.
260  $ ( .NOT.left .AND. ( l.GT.n ) ) ) THEN
261  info = -6
262  ELSE IF( lda.LT.max( 1, k ) ) THEN
263  info = -8
264  ELSE IF( ldc.LT.max( 1, m ) ) THEN
265  info = -11
266  END IF
267 *
268  IF( info.EQ.0 ) THEN
269  IF( m.EQ.0 .OR. n.EQ.0 ) THEN
270  lwkopt = 1
271  ELSE
272 *
273 * Determine the block size. NB may be at most NBMAX, where
274 * NBMAX is used to define the local array T.
275 *
276  nb = min( nbmax, ilaenv( 1, 'CUNMRQ', side // trans, m, n,
277  $ k, -1 ) )
278  lwkopt = nw*nb
279  END IF
280  work( 1 ) = lwkopt
281 *
282  IF( lwork.LT.max( 1, nw ) .AND. .NOT.lquery ) THEN
283  info = -13
284  END IF
285  END IF
286 *
287  IF( info.NE.0 ) THEN
288  CALL xerbla( 'CUNMRZ', -info )
289  RETURN
290  ELSE IF( lquery ) THEN
291  RETURN
292  END IF
293 *
294 * Quick return if possible
295 *
296  IF( m.EQ.0 .OR. n.EQ.0 ) THEN
297  RETURN
298  END IF
299 *
300 * Determine the block size. NB may be at most NBMAX, where NBMAX
301 * is used to define the local array T.
302 *
303  nb = min( nbmax, ilaenv( 1, 'CUNMRQ', side // trans, m, n, k,
304  $ -1 ) )
305  nbmin = 2
306  ldwork = nw
307  IF( nb.GT.1 .AND. nb.LT.k ) THEN
308  iws = nw*nb
309  IF( lwork.LT.iws ) THEN
310  nb = lwork / ldwork
311  nbmin = max( 2, ilaenv( 2, 'CUNMRQ', side // trans, m, n, k,
312  $ -1 ) )
313  END IF
314  ELSE
315  iws = nw
316  END IF
317 *
318  IF( nb.LT.nbmin .OR. nb.GE.k ) THEN
319 *
320 * Use unblocked code
321 *
322  CALL cunmr3( side, trans, m, n, k, l, a, lda, tau, c, ldc,
323  $ work, iinfo )
324  ELSE
325 *
326 * Use blocked code
327 *
328  IF( ( left .AND. .NOT.notran ) .OR.
329  $ ( .NOT.left .AND. notran ) ) THEN
330  i1 = 1
331  i2 = k
332  i3 = nb
333  ELSE
334  i1 = ( ( k-1 ) / nb )*nb + 1
335  i2 = 1
336  i3 = -nb
337  END IF
338 *
339  IF( left ) THEN
340  ni = n
341  jc = 1
342  ja = m - l + 1
343  ELSE
344  mi = m
345  ic = 1
346  ja = n - l + 1
347  END IF
348 *
349  IF( notran ) THEN
350  transt = 'C'
351  ELSE
352  transt = 'N'
353  END IF
354 *
355  DO 10 i = i1, i2, i3
356  ib = min( nb, k-i+1 )
357 *
358 * Form the triangular factor of the block reflector
359 * H = H(i+ib-1) . . . H(i+1) H(i)
360 *
361  CALL clarzt( 'Backward', 'Rowwise', l, ib, a( i, ja ), lda,
362  $ tau( i ), t, ldt )
363 *
364  IF( left ) THEN
365 *
366 * H or H**H is applied to C(i:m,1:n)
367 *
368  mi = m - i + 1
369  ic = i
370  ELSE
371 *
372 * H or H**H is applied to C(1:m,i:n)
373 *
374  ni = n - i + 1
375  jc = i
376  END IF
377 *
378 * Apply H or H**H
379 *
380  CALL clarzb( side, transt, 'Backward', 'Rowwise', mi, ni,
381  $ ib, l, a( i, ja ), lda, t, ldt, c( ic, jc ),
382  $ ldc, work, ldwork )
383  10 CONTINUE
384 *
385  END IF
386 *
387  work( 1 ) = lwkopt
388 *
389  RETURN
390 *
391 * End of CUNMRZ
392 *
subroutine cunmr3(SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC, WORK, INFO)
CUNMR3 multiplies a general matrix by the unitary matrix from a RZ factorization determined by ctzrzf...
Definition: cunmr3.f:180
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:62
logical function lsame(CA, CB)
LSAME
Definition: lsame.f:55
subroutine clarzb(SIDE, TRANS, DIRECT, STOREV, M, N, K, L, V, LDV, T, LDT, C, LDC, WORK, LDWORK)
CLARZB applies a block reflector or its conjugate-transpose to a general matrix.
Definition: clarzb.f:185
integer function ilaenv(ISPEC, NAME, OPTS, N1, N2, N3, N4)
Definition: tstiee.f:83
subroutine clarzt(DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT)
CLARZT forms the triangular factor T of a block reflector H = I - vtvH.
Definition: clarzt.f:187

Here is the call graph for this function:

Here is the caller graph for this function: