01: /* ///////////////////////////// P /// L /// A /// S /// M /// A /////////////////////////////// */
02: /* ///                    PLASMA auxiliary routines (version 2.1.0)                          ///
03:  * ///                    Author: Hatem Ltaief, Jakub Kurzak                                 ///
04:  * ///                    Release Date: November, 15th 2009                                  ///
05:  * ///                    PLASMA is a software package provided by Univ. of Tennessee,       ///
06:  * ///                    Univ. of California Berkeley and Univ. of Colorado Denver          /// */
07: /* ///////////////////////////////////////////////////////////////////////////////////////////// */
08: #include "common.h"
09: 
10: /* ///////////////////////////////////////////////////////////////////////////////////////////// */
11: //  Parallel construction of Q using tile V (application to identity)
12: #define A(m,n) &((PLASMA_Complex64_t*)A.mat)[A.bsiz*(m)+A.bsiz*A.lmt*(n)]
13: #define Q(m,n) &((PLASMA_Complex64_t*)Q.mat)[Q.bsiz*(m)+Q.bsiz*Q.lmt*(n)]
14: #define T(m,n) &((PLASMA_Complex64_t*)T.mat)[T.bsiz*(m)+T.bsiz*T.lmt*(n)]
15: void plasma_pzungqr(plasma_context_t *plasma)
16: {
17:     PLASMA_desc A;
18:     PLASMA_desc Q;
19:     PLASMA_desc T;
20: 
21:     int k, m, n;
22:     PLASMA_Complex64_t *work;
23: 
24:     // Currently sequential
25:     if (PLASMA_RANK > 0) return;
26: 
27:     plasma_unpack_args_3(A, Q, T);
28:     work = (PLASMA_Complex64_t *)plasma_private_alloc(plasma, T.mb*T.nb, T.dtyp);
29: 
30: 
31:     for (k = A.nt - 1; k >= 0; k--) {
32:         for (m = Q.mt - 1; m > k; m--) {
33:             for (n = 0; n < Q.nt; n++) {
34:                 CORE_zssmqr(
35:                     PlasmaLeft, PlasmaNoTrans,
36:                     A.nb,
37:                     m == Q.mt-1 ? Q.m-m*Q.nb : Q.nb,
38:                     n == Q.nt-1 ? Q.n-n*Q.nb : Q.nb,
39:                     T.mb,
40:                     k == A.nt-1 ? A.n-k*A.nb : A.nb,
41:                     Q(k, n), Q.nb,
42:                     Q(m, n), Q.nb,
43:                     A(m, k), A.nb,
44:                     T(m, k), T.mb,
45:                     work, T.mb);
46:             }
47:         }
48:         for (n = 0; n < Q.nt; n++) {
49:             CORE_zunmqr(
50:                 PlasmaLeft, PlasmaNoTrans,
51:                 k == A.mt-1 ? A.m-k*A.nb : A.nb,
52:                 n == Q.nt-1 ? Q.n-n*Q.nb : Q.nb,
53:                 T.mb,
54:                 k == A.nt-1 ? min(A.m, A.n)-k*A.nb : A.nb,
55:                 A(k, k), A.nb,
56:                 T(k, k), T.mb,
57:                 Q(k, n), Q.nb,
58:                 work, T.nb);
59:         }
60:     }
61:     plasma_private_free(plasma, work);
62: }
63: