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