1 /* ../netlib/ctpmqrt.f -- translated by f2c (version 20100827). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib;
2 on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */
3 #include "FLA_f2c.h" /* > \brief \b CTPMQRT */
4 /* =========== DOCUMENTATION =========== */
5 /* Online html documentation available at */
6 /* http://www.netlib.org/lapack/explore-html/ */
7 /* > \htmlonly */
8 /* > Download CTPMQRT + dependencies */
9 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ctpmqrt .f"> */
10 /* > [TGZ]</a> */
11 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ctpmqrt .f"> */
12 /* > [ZIP]</a> */
13 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ctpmqrt .f"> */
14 /* > [TXT]</a> */
15 /* > \endhtmlonly */
16 /* Definition: */
17 /* =========== */
18 /* SUBROUTINE CTPMQRT( SIDE, TRANS, M, N, K, L, NB, V, LDV, T, LDT, */
19 /* A, LDA, B, LDB, WORK, INFO ) */
20 /* .. Scalar Arguments .. */
21 /* CHARACTER SIDE, TRANS */
22 /* INTEGER INFO, K, LDV, LDA, LDB, M, N, L, NB, LDT */
23 /* .. */
24 /* .. Array Arguments .. */
25 /* COMPLEX V( LDV, * ), A( LDA, * ), B( LDB, * ), T( LDT, * ), */
26 /* $ WORK( * ) */
27 /* .. */
28 /* > \par Purpose: */
29 /* ============= */
30 /* > */
31 /* > \verbatim */
32 /* > */
33 /* > CTPMQRT applies a complex orthogonal matrix Q obtained from a */
34 /* > "triangular-pentagonal" complex block reflector H to a general */
35 /* > complex matrix C, which consists of two blocks A and B. */
36 /* > \endverbatim */
37 /* Arguments: */
38 /* ========== */
39 /* > \param[in] SIDE */
40 /* > \verbatim */
41 /* > SIDE is CHARACTER*1 */
42 /* > = 'L': apply Q or Q**H from the Left;
43 */
44 /* > = 'R': apply Q or Q**H from the Right. */
45 /* > \endverbatim */
46 /* > */
47 /* > \param[in] TRANS */
48 /* > \verbatim */
49 /* > TRANS is CHARACTER*1 */
50 /* > = 'N': No transpose, apply Q;
51 */
52 /* > = 'C': Transpose, apply Q**H. */
53 /* > \endverbatim */
54 /* > */
55 /* > \param[in] M */
56 /* > \verbatim */
57 /* > M is INTEGER */
58 /* > The number of rows of the matrix B. M >= 0. */
59 /* > \endverbatim */
60 /* > */
61 /* > \param[in] N */
62 /* > \verbatim */
63 /* > N is INTEGER */
64 /* > The number of columns of the matrix B. N >= 0. */
65 /* > \endverbatim */
66 /* > */
67 /* > \param[in] K */
68 /* > \verbatim */
69 /* > K is INTEGER */
70 /* > The number of elementary reflectors whose product defines */
71 /* > the matrix Q. */
72 /* > \endverbatim */
73 /* > */
74 /* > \param[in] L */
75 /* > \verbatim */
76 /* > L is INTEGER */
77 /* > The order of the trapezoidal part of V. */
78 /* > K >= L >= 0. See Further Details. */
79 /* > \endverbatim */
80 /* > */
81 /* > \param[in] NB */
82 /* > \verbatim */
83 /* > NB is INTEGER */
84 /* > The block size used for the storage of T. K >= NB >= 1. */
85 /* > This must be the same value of NB used to generate T */
86 /* > in CTPQRT. */
87 /* > \endverbatim */
88 /* > */
89 /* > \param[in] V */
90 /* > \verbatim */
91 /* > V is COMPLEX array, dimension (LDA,K) */
92 /* > The i-th column must contain the vector which defines the */
93 /* > elementary reflector H(i), for i = 1,2,...,k, as returned by */
94 /* > CTPQRT in B. See Further Details. */
95 /* > \endverbatim */
96 /* > */
97 /* > \param[in] LDV */
98 /* > \verbatim */
99 /* > LDV is INTEGER */
100 /* > The leading dimension of the array V. */
101 /* > If SIDE = 'L', LDV >= max(1,M);
102 */
103 /* > if SIDE = 'R', LDV >= max(1,N). */
104 /* > \endverbatim */
105 /* > */
106 /* > \param[in] T */
107 /* > \verbatim */
108 /* > T is COMPLEX array, dimension (LDT,K) */
109 /* > The upper triangular factors of the block reflectors */
110 /* > as returned by CTPQRT, stored as a NB-by-K matrix. */
111 /* > \endverbatim */
112 /* > */
113 /* > \param[in] LDT */
114 /* > \verbatim */
115 /* > LDT is INTEGER */
116 /* > The leading dimension of the array T. LDT >= NB. */
117 /* > \endverbatim */
118 /* > */
119 /* > \param[in,out] A */
120 /* > \verbatim */
121 /* > A is COMPLEX array, dimension */
122 /* > (LDA,N) if SIDE = 'L' or */
123 /* > (LDA,K) if SIDE = 'R' */
124 /* > On entry, the K-by-N or M-by-K matrix A. */
125 /* > On exit, A is overwritten by the corresponding block of */
126 /* > Q*C or Q**H*C or C*Q or C*Q**H. See Further Details. */
127 /* > \endverbatim */
128 /* > */
129 /* > \param[in] LDA */
130 /* > \verbatim */
131 /* > LDA is INTEGER */
132 /* > The leading dimension of the array A. */
133 /* > If SIDE = 'L', LDC >= max(1,K);
134 */
135 /* > If SIDE = 'R', LDC >= max(1,M). */
136 /* > \endverbatim */
137 /* > */
138 /* > \param[in,out] B */
139 /* > \verbatim */
140 /* > B is COMPLEX array, dimension (LDB,N) */
141 /* > On entry, the M-by-N matrix B. */
142 /* > On exit, B is overwritten by the corresponding block of */
143 /* > Q*C or Q**H*C or C*Q or C*Q**H. See Further Details. */
144 /* > \endverbatim */
145 /* > */
146 /* > \param[in] LDB */
147 /* > \verbatim */
148 /* > LDB is INTEGER */
149 /* > The leading dimension of the array B. */
150 /* > LDB >= max(1,M). */
151 /* > \endverbatim */
152 /* > */
153 /* > \param[out] WORK */
154 /* > \verbatim */
155 /* > WORK is COMPLEX array. The dimension of WORK is */
156 /* > N*NB if SIDE = 'L', or M*NB if SIDE = 'R'. */
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 /* Authors: */
166 /* ======== */
167 /* > \author Univ. of Tennessee */
168 /* > \author Univ. of California Berkeley */
169 /* > \author Univ. of Colorado Denver */
170 /* > \author NAG Ltd. */
171 /* > \date November 2013 */
172 /* > \ingroup complexOTHERcomputational */
173 /* > \par Further Details: */
174 /* ===================== */
175 /* > */
176 /* > \verbatim */
177 /* > */
178 /* > The columns of the pentagonal matrix V contain the elementary reflectors */
179 /* > H(1), H(2), ..., H(K);
180 V is composed of a rectangular block V1 and a */
181 /* > trapezoidal block V2: */
182 /* > */
183 /* > V = [V1] */
184 /* > [V2]. */
185 /* > */
186 /* > The size of the trapezoidal block V2 is determined by the parameter L, */
187 /* > where 0 <= L <= K;
188 V2 is upper trapezoidal, consisting of the first L */
189 /* > rows of a K-by-K upper triangular matrix. If L=K, V2 is upper triangular;
190 */
191 /* > if L=0, there is no trapezoidal block, hence V = V1 is rectangular. */
192 /* > */
193 /* > If SIDE = 'L': C = [A] where A is K-by-N, B is M-by-N and V is M-by-K. */
194 /* > [B] */
195 /* > */
196 /* > If SIDE = 'R': C = [A B] where A is M-by-K, B is M-by-N and V is N-by-K. */
197 /* > */
198 /* > The complex orthogonal matrix Q is formed from V and T. */
199 /* > */
200 /* > If TRANS='N' and SIDE='L', C is on exit replaced with Q * C. */
201 /* > */
202 /* > If TRANS='C' and SIDE='L', C is on exit replaced with Q**H * C. */
203 /* > */
204 /* > If TRANS='N' and SIDE='R', C is on exit replaced with C * Q. */
205 /* > */
206 /* > If TRANS='C' and SIDE='R', C is on exit replaced with C * Q**H. */
207 /* > \endverbatim */
208 /* > */
209 /* ===================================================================== */
210 /* Subroutine */
ctpmqrt_(char * side,char * trans,integer * m,integer * n,integer * k,integer * l,integer * nb,complex * v,integer * ldv,complex * t,integer * ldt,complex * a,integer * lda,complex * b,integer * ldb,complex * work,integer * info)211 int ctpmqrt_(char *side, char *trans, integer *m, integer *n, integer *k, integer *l, integer *nb, complex *v, integer *ldv, complex *t, integer *ldt, complex *a, integer *lda, complex *b, integer *ldb, complex *work, integer *info)
212 {
213 /* System generated locals */
214 integer v_dim1, v_offset, a_dim1, a_offset, b_dim1, b_offset, t_dim1, t_offset, i__1, i__2, i__3, i__4;
215 /* Local variables */
216 integer i__, ib, lb, mb, kf, ldaq;
217 logical left, tran;
218 integer ldvq;
219 extern logical lsame_(char *, char *);
220 logical right;
221 extern /* Subroutine */
222 int xerbla_(char *, integer *), ctprfb_( char *, char *, char *, char *, integer *, integer *, integer *, integer *, complex *, integer *, complex *, integer *, complex *, integer *, complex *, integer *, complex *, integer *);
223 logical notran;
224 /* -- LAPACK computational routine (version 3.5.0) -- */
225 /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */
226 /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */
227 /* November 2013 */
228 /* .. Scalar Arguments .. */
229 /* .. */
230 /* .. Array Arguments .. */
231 /* .. */
232 /* ===================================================================== */
233 /* .. */
234 /* .. Local Scalars .. */
235 /* .. */
236 /* .. External Functions .. */
237 /* .. */
238 /* .. External Subroutines .. */
239 /* .. */
240 /* .. Intrinsic Functions .. */
241 /* .. */
242 /* .. Executable Statements .. */
243 /* .. Test the input arguments .. */
244 /* Parameter adjustments */
245 v_dim1 = *ldv;
246 v_offset = 1 + v_dim1;
247 v -= v_offset;
248 t_dim1 = *ldt;
249 t_offset = 1 + t_dim1;
250 t -= t_offset;
251 a_dim1 = *lda;
252 a_offset = 1 + a_dim1;
253 a -= a_offset;
254 b_dim1 = *ldb;
255 b_offset = 1 + b_dim1;
256 b -= b_offset;
257 --work;
258 /* Function Body */
259 *info = 0;
260 left = lsame_(side, "L");
261 right = lsame_(side, "R");
262 tran = lsame_(trans, "C");
263 notran = lsame_(trans, "N");
264 if (left)
265 {
266 ldvq = max(1,*m);
267 ldaq = max(1,*k);
268 }
269 else if (right)
270 {
271 ldvq = max(1,*n);
272 ldaq = max(1,*m);
273 }
274 if (! left && ! right)
275 {
276 *info = -1;
277 }
278 else if (! tran && ! notran)
279 {
280 *info = -2;
281 }
282 else if (*m < 0)
283 {
284 *info = -3;
285 }
286 else if (*n < 0)
287 {
288 *info = -4;
289 }
290 else if (*k < 0)
291 {
292 *info = -5;
293 }
294 else if (*l < 0 || *l > *k)
295 {
296 *info = -6;
297 }
298 else if (*nb < 1 || *nb > *k && *k > 0)
299 {
300 *info = -7;
301 }
302 else if (*ldv < ldvq)
303 {
304 *info = -9;
305 }
306 else if (*ldt < *nb)
307 {
308 *info = -11;
309 }
310 else if (*lda < ldaq)
311 {
312 *info = -13;
313 }
314 else if (*ldb < max(1,*m))
315 {
316 *info = -15;
317 }
318 if (*info != 0)
319 {
320 i__1 = -(*info);
321 xerbla_("CTPMQRT", &i__1);
322 return 0;
323 }
324 /* .. Quick return if possible .. */
325 if (*m == 0 || *n == 0 || *k == 0)
326 {
327 return 0;
328 }
329 if (left && tran)
330 {
331 i__1 = *k;
332 i__2 = *nb;
333 for (i__ = 1;
334 i__2 < 0 ? i__ >= i__1 : i__ <= i__1;
335 i__ += i__2)
336 {
337 /* Computing MIN */
338 i__3 = *nb;
339 i__4 = *k - i__ + 1; // , expr subst
340 ib = min(i__3,i__4);
341 /* Computing MIN */
342 i__3 = *m - *l + i__ + ib - 1;
343 mb = min(i__3,*m);
344 if (i__ >= *l)
345 {
346 lb = 0;
347 }
348 else
349 {
350 lb = mb - *m + *l - i__ + 1;
351 }
352 ctprfb_("L", "C", "F", "C", &mb, n, &ib, &lb, &v[i__ * v_dim1 + 1] , ldv, &t[i__ * t_dim1 + 1], ldt, &a[i__ + a_dim1], lda, & b[b_offset], ldb, &work[1], &ib);
353 }
354 }
355 else if (right && notran)
356 {
357 i__2 = *k;
358 i__1 = *nb;
359 for (i__ = 1;
360 i__1 < 0 ? i__ >= i__2 : i__ <= i__2;
361 i__ += i__1)
362 {
363 /* Computing MIN */
364 i__3 = *nb;
365 i__4 = *k - i__ + 1; // , expr subst
366 ib = min(i__3,i__4);
367 /* Computing MIN */
368 i__3 = *n - *l + i__ + ib - 1;
369 mb = min(i__3,*n);
370 if (i__ >= *l)
371 {
372 lb = 0;
373 }
374 else
375 {
376 lb = mb - *n + *l - i__ + 1;
377 }
378 ctprfb_("R", "N", "F", "C", m, &mb, &ib, &lb, &v[i__ * v_dim1 + 1] , ldv, &t[i__ * t_dim1 + 1], ldt, &a[i__ * a_dim1 + 1], lda, &b[b_offset], ldb, &work[1], m);
379 }
380 }
381 else if (left && notran)
382 {
383 kf = (*k - 1) / *nb * *nb + 1;
384 i__1 = -(*nb);
385 for (i__ = kf;
386 i__1 < 0 ? i__ >= 1 : i__ <= 1;
387 i__ += i__1)
388 {
389 /* Computing MIN */
390 i__2 = *nb;
391 i__3 = *k - i__ + 1; // , expr subst
392 ib = min(i__2,i__3);
393 /* Computing MIN */
394 i__2 = *m - *l + i__ + ib - 1;
395 mb = min(i__2,*m);
396 if (i__ >= *l)
397 {
398 lb = 0;
399 }
400 else
401 {
402 lb = mb - *m + *l - i__ + 1;
403 }
404 ctprfb_("L", "N", "F", "C", &mb, n, &ib, &lb, &v[i__ * v_dim1 + 1] , ldv, &t[i__ * t_dim1 + 1], ldt, &a[i__ + a_dim1], lda, & b[b_offset], ldb, &work[1], &ib);
405 }
406 }
407 else if (right && tran)
408 {
409 kf = (*k - 1) / *nb * *nb + 1;
410 i__1 = -(*nb);
411 for (i__ = kf;
412 i__1 < 0 ? i__ >= 1 : i__ <= 1;
413 i__ += i__1)
414 {
415 /* Computing MIN */
416 i__2 = *nb;
417 i__3 = *k - i__ + 1; // , expr subst
418 ib = min(i__2,i__3);
419 /* Computing MIN */
420 i__2 = *n - *l + i__ + ib - 1;
421 mb = min(i__2,*n);
422 if (i__ >= *l)
423 {
424 lb = 0;
425 }
426 else
427 {
428 lb = mb - *n + *l - i__ + 1;
429 }
430 ctprfb_("R", "C", "F", "C", m, &mb, &ib, &lb, &v[i__ * v_dim1 + 1] , ldv, &t[i__ * t_dim1 + 1], ldt, &a[i__ * a_dim1 + 1], lda, &b[b_offset], ldb, &work[1], m);
431 }
432 }
433 return 0;
434 /* End of CTPMQRT */
435 }
436 /* ctpmqrt_ */
437