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

Go to the source code of this file.

Functions/Subroutines

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

Function/Subroutine Documentation

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

SORMRZ

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

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

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

 where Q is a real orthogonal matrix defined as the product of k
 elementary reflectors

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

 as returned by STZRZF. 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**T from the Left;
          = 'R': apply Q or Q**T from the Right.
[in]TRANS
          TRANS is CHARACTER*1
          = 'N':  No transpose, apply Q;
          = 'T':  Transpose, apply Q**T.
[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 REAL 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
          STZRZF 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 REAL array, dimension (K)
          TAU(i) must contain the scalar factor of the elementary
          reflector H(i), as returned by STZRZF.
[in,out]C
          C is REAL 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 REAL 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 sormrz.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  REAL 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  REAL t( ldt, nbmax )
219 * ..
220 * .. External Functions ..
221  LOGICAL lsame
222  INTEGER ilaenv
223  EXTERNAL lsame, ilaenv
224 * ..
225 * .. External Subroutines ..
226  EXTERNAL slarzb, slarzt, sormr3, 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, 'T' ) ) 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, 'SORMRQ', 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( 'SORMRZ', -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  nbmin = 2
301  ldwork = nw
302  IF( nb.GT.1 .AND. nb.LT.k ) THEN
303  iws = nw*nb
304  IF( lwork.LT.iws ) THEN
305  nb = lwork / ldwork
306  nbmin = max( 2, ilaenv( 2, 'SORMRQ', side // trans, m, n, k,
307  $ -1 ) )
308  END IF
309  ELSE
310  iws = nw
311  END IF
312 *
313  IF( nb.LT.nbmin .OR. nb.GE.k ) THEN
314 *
315 * Use unblocked code
316 *
317  CALL sormr3( side, trans, m, n, k, l, a, lda, tau, c, ldc,
318  $ work, iinfo )
319  ELSE
320 *
321 * Use blocked code
322 *
323  IF( ( left .AND. .NOT.notran ) .OR.
324  $ ( .NOT.left .AND. notran ) ) THEN
325  i1 = 1
326  i2 = k
327  i3 = nb
328  ELSE
329  i1 = ( ( k-1 ) / nb )*nb + 1
330  i2 = 1
331  i3 = -nb
332  END IF
333 *
334  IF( left ) THEN
335  ni = n
336  jc = 1
337  ja = m - l + 1
338  ELSE
339  mi = m
340  ic = 1
341  ja = n - l + 1
342  END IF
343 *
344  IF( notran ) THEN
345  transt = 'T'
346  ELSE
347  transt = 'N'
348  END IF
349 *
350  DO 10 i = i1, i2, i3
351  ib = min( nb, k-i+1 )
352 *
353 * Form the triangular factor of the block reflector
354 * H = H(i+ib-1) . . . H(i+1) H(i)
355 *
356  CALL slarzt( 'Backward', 'Rowwise', l, ib, a( i, ja ), lda,
357  $ tau( i ), t, ldt )
358 *
359  IF( left ) THEN
360 *
361 * H or H**T is applied to C(i:m,1:n)
362 *
363  mi = m - i + 1
364  ic = i
365  ELSE
366 *
367 * H or H**T is applied to C(1:m,i:n)
368 *
369  ni = n - i + 1
370  jc = i
371  END IF
372 *
373 * Apply H or H**T
374 *
375  CALL slarzb( side, transt, 'Backward', 'Rowwise', mi, ni,
376  $ ib, l, a( i, ja ), lda, t, ldt, c( ic, jc ),
377  $ ldc, work, ldwork )
378  10 CONTINUE
379 *
380  END IF
381 *
382  work( 1 ) = lwkopt
383 *
384  RETURN
385 *
386 * End of SORMRZ
387 *
subroutine slarzt(DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT)
SLARZT forms the triangular factor T of a block reflector H = I - vtvH.
Definition: slarzt.f:187
subroutine slarzb(SIDE, TRANS, DIRECT, STOREV, M, N, K, L, V, LDV, T, LDT, C, LDC, WORK, LDWORK)
SLARZB applies a block reflector or its transpose to a general matrix.
Definition: slarzb.f:185
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:62
logical function lsame(CA, CB)
LSAME
Definition: lsame.f:55
subroutine sormr3(SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC, WORK, INFO)
SORMR3 multiplies a general matrix by the orthogonal matrix from a RZ factorization determined by stz...
Definition: sormr3.f:180
integer function ilaenv(ISPEC, NAME, OPTS, N1, N2, N3, N4)
Definition: tstiee.f:83

Here is the call graph for this function:

Here is the caller graph for this function: