LAPACK  3.10.1
LAPACK: Linear Algebra PACKage
cunmhr.f
Go to the documentation of this file.
1 *> \brief \b CUNMHR
2 *
3 * =========== DOCUMENTATION ===========
4 *
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
7 *
8 *> \htmlonly
9 *> Download CUNMHR + dependencies
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/cunmhr.f">
11 *> [TGZ]</a>
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/cunmhr.f">
13 *> [ZIP]</a>
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/cunmhr.f">
15 *> [TXT]</a>
16 *> \endhtmlonly
17 *
18 * Definition:
19 * ===========
20 *
21 * SUBROUTINE CUNMHR( SIDE, TRANS, M, N, ILO, IHI, A, LDA, TAU, C,
22 * LDC, WORK, LWORK, INFO )
23 *
24 * .. Scalar Arguments ..
25 * CHARACTER SIDE, TRANS
26 * INTEGER IHI, ILO, INFO, LDA, LDC, LWORK, M, N
27 * ..
28 * .. Array Arguments ..
29 * COMPLEX A( LDA, * ), C( LDC, * ), TAU( * ),
30 * $ WORK( * )
31 * ..
32 *
33 *
34 *> \par Purpose:
35 * =============
36 *>
37 *> \verbatim
38 *>
39 *> CUNMHR overwrites the general complex M-by-N matrix C with
40 *>
41 *> SIDE = 'L' SIDE = 'R'
42 *> TRANS = 'N': Q * C C * Q
43 *> TRANS = 'C': Q**H * C C * Q**H
44 *>
45 *> where Q is a complex unitary matrix of order nq, with nq = m if
46 *> SIDE = 'L' and nq = n if SIDE = 'R'. Q is defined as the product of
47 *> IHI-ILO elementary reflectors, as returned by CGEHRD:
48 *>
49 *> Q = H(ilo) H(ilo+1) . . . H(ihi-1).
50 *> \endverbatim
51 *
52 * Arguments:
53 * ==========
54 *
55 *> \param[in] SIDE
56 *> \verbatim
57 *> SIDE is CHARACTER*1
58 *> = 'L': apply Q or Q**H from the Left;
59 *> = 'R': apply Q or Q**H from the Right.
60 *> \endverbatim
61 *>
62 *> \param[in] TRANS
63 *> \verbatim
64 *> TRANS is CHARACTER*1
65 *> = 'N': apply Q (No transpose)
66 *> = 'C': apply Q**H (Conjugate transpose)
67 *> \endverbatim
68 *>
69 *> \param[in] M
70 *> \verbatim
71 *> M is INTEGER
72 *> The number of rows of the matrix C. M >= 0.
73 *> \endverbatim
74 *>
75 *> \param[in] N
76 *> \verbatim
77 *> N is INTEGER
78 *> The number of columns of the matrix C. N >= 0.
79 *> \endverbatim
80 *>
81 *> \param[in] ILO
82 *> \verbatim
83 *> ILO is INTEGER
84 *> \endverbatim
85 *>
86 *> \param[in] IHI
87 *> \verbatim
88 *> IHI is INTEGER
89 *>
90 *> ILO and IHI must have the same values as in the previous call
91 *> of CGEHRD. Q is equal to the unit matrix except in the
92 *> submatrix Q(ilo+1:ihi,ilo+1:ihi).
93 *> If SIDE = 'L', then 1 <= ILO <= IHI <= M, if M > 0, and
94 *> ILO = 1 and IHI = 0, if M = 0;
95 *> if SIDE = 'R', then 1 <= ILO <= IHI <= N, if N > 0, and
96 *> ILO = 1 and IHI = 0, if N = 0.
97 *> \endverbatim
98 *>
99 *> \param[in] A
100 *> \verbatim
101 *> A is COMPLEX array, dimension
102 *> (LDA,M) if SIDE = 'L'
103 *> (LDA,N) if SIDE = 'R'
104 *> The vectors which define the elementary reflectors, as
105 *> returned by CGEHRD.
106 *> \endverbatim
107 *>
108 *> \param[in] LDA
109 *> \verbatim
110 *> LDA is INTEGER
111 *> The leading dimension of the array A.
112 *> LDA >= max(1,M) if SIDE = 'L'; LDA >= max(1,N) if SIDE = 'R'.
113 *> \endverbatim
114 *>
115 *> \param[in] TAU
116 *> \verbatim
117 *> TAU is COMPLEX array, dimension
118 *> (M-1) if SIDE = 'L'
119 *> (N-1) if SIDE = 'R'
120 *> TAU(i) must contain the scalar factor of the elementary
121 *> reflector H(i), as returned by CGEHRD.
122 *> \endverbatim
123 *>
124 *> \param[in,out] C
125 *> \verbatim
126 *> C is COMPLEX array, dimension (LDC,N)
127 *> On entry, the M-by-N matrix C.
128 *> On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q.
129 *> \endverbatim
130 *>
131 *> \param[in] LDC
132 *> \verbatim
133 *> LDC is INTEGER
134 *> The leading dimension of the array C. LDC >= max(1,M).
135 *> \endverbatim
136 *>
137 *> \param[out] WORK
138 *> \verbatim
139 *> WORK is COMPLEX array, dimension (MAX(1,LWORK))
140 *> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
141 *> \endverbatim
142 *>
143 *> \param[in] LWORK
144 *> \verbatim
145 *> LWORK is INTEGER
146 *> The dimension of the array WORK.
147 *> If SIDE = 'L', LWORK >= max(1,N);
148 *> if SIDE = 'R', LWORK >= max(1,M).
149 *> For optimum performance LWORK >= N*NB if SIDE = 'L', and
150 *> LWORK >= M*NB if SIDE = 'R', where NB is the optimal
151 *> blocksize.
152 *>
153 *> If LWORK = -1, then a workspace query is assumed; the routine
154 *> only calculates the optimal size of the WORK array, returns
155 *> this value as the first entry of the WORK array, and no error
156 *> message related to LWORK is issued by XERBLA.
157 *> \endverbatim
158 *>
159 *> \param[out] INFO
160 *> \verbatim
161 *> INFO is INTEGER
162 *> = 0: successful exit
163 *> < 0: if INFO = -i, the i-th argument had an illegal value
164 *> \endverbatim
165 *
166 * Authors:
167 * ========
168 *
169 *> \author Univ. of Tennessee
170 *> \author Univ. of California Berkeley
171 *> \author Univ. of Colorado Denver
172 *> \author NAG Ltd.
173 *
174 *> \ingroup complexOTHERcomputational
175 *
176 * =====================================================================
177  SUBROUTINE cunmhr( SIDE, TRANS, M, N, ILO, IHI, A, LDA, TAU, C,
178  $ LDC, WORK, LWORK, INFO )
179 *
180 * -- LAPACK computational routine --
181 * -- LAPACK is a software package provided by Univ. of Tennessee, --
182 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
183 *
184 * .. Scalar Arguments ..
185  CHARACTER SIDE, TRANS
186  INTEGER IHI, ILO, INFO, LDA, LDC, LWORK, M, N
187 * ..
188 * .. Array Arguments ..
189  COMPLEX A( LDA, * ), C( LDC, * ), TAU( * ),
190  $ work( * )
191 * ..
192 *
193 * =====================================================================
194 *
195 * .. Local Scalars ..
196  LOGICAL LEFT, LQUERY
197  INTEGER I1, I2, IINFO, LWKOPT, MI, NB, NH, NI, NQ, NW
198 * ..
199 * .. External Functions ..
200  LOGICAL LSAME
201  INTEGER ILAENV
202  EXTERNAL ilaenv, lsame
203 * ..
204 * .. External Subroutines ..
205  EXTERNAL cunmqr, xerbla
206 * ..
207 * .. Intrinsic Functions ..
208  INTRINSIC max, min
209 * ..
210 * .. Executable Statements ..
211 *
212 * Test the input arguments
213 *
214  info = 0
215  nh = ihi - ilo
216  left = lsame( side, 'L' )
217  lquery = ( lwork.EQ.-1 )
218 *
219 * NQ is the order of Q and NW is the minimum dimension of WORK
220 *
221  IF( left ) THEN
222  nq = m
223  nw = max( 1, n )
224  ELSE
225  nq = n
226  nw = max( 1, m )
227  END IF
228  IF( .NOT.left .AND. .NOT.lsame( side, 'R' ) ) THEN
229  info = -1
230  ELSE IF( .NOT.lsame( trans, 'N' ) .AND. .NOT.lsame( trans, 'C' ) )
231  $ THEN
232  info = -2
233  ELSE IF( m.LT.0 ) THEN
234  info = -3
235  ELSE IF( n.LT.0 ) THEN
236  info = -4
237  ELSE IF( ilo.LT.1 .OR. ilo.GT.max( 1, nq ) ) THEN
238  info = -5
239  ELSE IF( ihi.LT.min( ilo, nq ) .OR. ihi.GT.nq ) THEN
240  info = -6
241  ELSE IF( lda.LT.max( 1, nq ) ) THEN
242  info = -8
243  ELSE IF( ldc.LT.max( 1, m ) ) THEN
244  info = -11
245  ELSE IF( lwork.LT.nw .AND. .NOT.lquery ) THEN
246  info = -13
247  END IF
248 *
249  IF( info.EQ.0 ) THEN
250  IF( left ) THEN
251  nb = ilaenv( 1, 'CUNMQR', side // trans, nh, n, nh, -1 )
252  ELSE
253  nb = ilaenv( 1, 'CUNMQR', side // trans, m, nh, nh, -1 )
254  END IF
255  lwkopt = nw*nb
256  work( 1 ) = lwkopt
257  END IF
258 *
259  IF( info.NE.0 ) THEN
260  CALL xerbla( 'CUNMHR', -info )
261  RETURN
262  ELSE IF( lquery ) THEN
263  RETURN
264  END IF
265 *
266 * Quick return if possible
267 *
268  IF( m.EQ.0 .OR. n.EQ.0 .OR. nh.EQ.0 ) THEN
269  work( 1 ) = 1
270  RETURN
271  END IF
272 *
273  IF( left ) THEN
274  mi = nh
275  ni = n
276  i1 = ilo + 1
277  i2 = 1
278  ELSE
279  mi = m
280  ni = nh
281  i1 = 1
282  i2 = ilo + 1
283  END IF
284 *
285  CALL cunmqr( side, trans, mi, ni, nh, a( ilo+1, ilo ), lda,
286  $ tau( ilo ), c( i1, i2 ), ldc, work, lwork, iinfo )
287 *
288  work( 1 ) = lwkopt
289  RETURN
290 *
291 * End of CUNMHR
292 *
293  END
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:60
subroutine cunmhr(SIDE, TRANS, M, N, ILO, IHI, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
CUNMHR
Definition: cunmhr.f:179
subroutine cunmqr(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
CUNMQR
Definition: cunmqr.f:168