01: /* ///////////////////////////// P /// L /// A /// S /// M /// A /////////////////////////////// */
02: /* ///                    PLASMA auxiliary routines (version 2.1.0)                          ///
03:  * ///                    Release Date: November, 15th 2009                                  ///
04:  * ///                    PLASMA is a software package provided by Univ. of Tennessee,       ///
05:  * ///                    Univ. of California Berkeley and Univ. of Colorado Denver          /// */
06: /* ///////////////////////////////////////////////////////////////////////////////////////////// */
07: #include "common.h"
08: #include "lapack.h"
09: 
10: /* ///////////////////////////////////////////////////////////////////////////////////////////// */
11: #define A(m,n) &((PLASMA_Complex64_t*)A.mat)[A.bsiz*(m)+A.bsiz*A.lmt*(n)]
12: #define B(m,n) &((PLASMA_Complex64_t*)B.mat)[B.bsiz*(m)+B.bsiz*B.lmt*(n)]
13: 
14: void plasma_pzaxpy(plasma_context_t *plasma)
15: {
16: 
17:     PLASMA_Complex64_t one;
18:     PLASMA_desc A;
19:     PLASMA_desc B;
20: 
21:     int X, X1, X2, Y, Y1, Y2;
22:     int m, n;
23:     int next_m;
24:     int next_n;
25: 
26:     plasma_unpack_args_3(one, A, B);
27: 
28:     n = 0;
29:     m = PLASMA_RANK;
30:     while (m >= A.mt && n < A.nt) {
31:         n++;
32:         m = m-A.mt;
33:     }
34: 
35:     while (n < A.nt) {
36:         next_m = m;
37:         next_n = n;
38: 
39:         next_m += PLASMA_SIZE;
40:         while (next_m >= A.mt && next_n < A.nt) {
41:             next_n++;
42:             next_m = next_m-A.mt;
43:         }
44: 
45:         X1 = m == 0 ? A.i%A.nb : 0;
46:         Y1 = n == 0 ? A.j%A.nb : 0;
47:         X2 = m == A.mt-1 ? (A.i+A.m-1)%A.nb+1 : A.nb;
48:         Y2 = n == A.nt-1 ? (A.j+A.n-1)%A.nb+1 : A.nb;
49:         X = X2 - X1;
50:         Y = Y2 - Y1;
51: 
52:         //TODO: Nov 5 2009: please check whether you agree with "A.nb*Y"
53:         //                  and remove this note if so.
54:         cblas_zaxpy(A.nb*Y, CBLAS_SADDR(one), A(m,n), 1, B(m,n), 1);
55: 
56:         m = next_m;
57:         n = next_n;
58:     }
59: }
60: