QDP++
generic_mat_vec.h
Go to the documentation of this file.
1#ifndef GENERIC_MAT_VEC_H
2#define GENERIC_MAT_VEC_H
3/*
4 * Generic routines for multiplying SU(3) matrix with Vector
5 * and SU(3) matrix dagger with color vector
6 *
7 * Author: $Id: generic_mat_vec.h,v 1.3 2007-02-06 15:01:58 bjoo Exp $
8*/
9
10/* SU(3)*color vector: aa * bb -> cc */
11/* aa = QDP++ PColorMatrix
12 bb = QDP++ PColorVector
13 cc = QDP++ PColorVector */
14
15/* Ideally want to registerize b, have a in cache, and store gather c? */
16#define _inline_generic_mult_su3_mat_vec(aa,bb,cc) \
17{\
18 cc.elem(0).real() = aa.elem(0,0).real()*bb.elem(0).real() ; \
19 cc.elem(0).real() -= aa.elem(0,0).imag()*bb.elem(0).imag() ; \
20\
21 cc.elem(0).real() += aa.elem(0,1).real()*bb.elem(1).real() ; \
22 cc.elem(0).real() -= aa.elem(0,1).imag()*bb.elem(1).imag() ; \
23\
24 cc.elem(0).real() += aa.elem(0,2).real()*bb.elem(2).real() ; \
25 cc.elem(0).real() -= aa.elem(0,2).imag()*bb.elem(2).imag() ; \
26\
27 cc.elem(0).imag() = aa.elem(0,0).real()*bb.elem(0).imag() ; \
28 cc.elem(0).imag() += aa.elem(0,0).imag()*bb.elem(0).real() ; \
29\
30 cc.elem(0).imag() += aa.elem(0,1).real()*bb.elem(1).imag() ; \
31 cc.elem(0).imag() += aa.elem(0,1).imag()*bb.elem(1).real() ; \
32\
33 cc.elem(0).imag() += aa.elem(0,2).real()*bb.elem(2).imag() ; \
34 cc.elem(0).imag() += aa.elem(0,2).imag()*bb.elem(2).real() ; \
35\
36\
37 cc.elem(1).real() = aa.elem(1,0).real()*bb.elem(0).real() ; \
38 cc.elem(1).real() -= aa.elem(1,0).imag()*bb.elem(0).imag() ; \
39\
40 cc.elem(1).real() += aa.elem(1,1).real()*bb.elem(1).real() ; \
41 cc.elem(1).real() -= aa.elem(1,1).imag()*bb.elem(1).imag() ; \
42\
43 cc.elem(1).real() += aa.elem(1,2).real()*bb.elem(2).real() ; \
44 cc.elem(1).real() -= aa.elem(1,2).imag()*bb.elem(2).imag() ; \
45\
46 cc.elem(1).imag() = aa.elem(1,0).real()*bb.elem(0).imag() ; \
47 cc.elem(1).imag() += aa.elem(1,0).imag()*bb.elem(0).real() ; \
48\
49 cc.elem(1).imag() += aa.elem(1,1).real()*bb.elem(1).imag() ; \
50 cc.elem(1).imag() += aa.elem(1,1).imag()*bb.elem(1).real() ; \
51\
52 cc.elem(1).imag() += aa.elem(1,2).real()*bb.elem(2).imag() ; \
53 cc.elem(1).imag() += aa.elem(1,2).imag()*bb.elem(2).real() ; \
54\
55\
56 cc.elem(2).real() = aa.elem(2,0).real()*bb.elem(0).real() ; \
57 cc.elem(2).real() -= aa.elem(2,0).imag()*bb.elem(0).imag() ; \
58\
59 cc.elem(2).real() += aa.elem(2,1).real()*bb.elem(1).real() ; \
60 cc.elem(2).real() -= aa.elem(2,1).imag()*bb.elem(1).imag() ; \
61\
62 cc.elem(2).real() += aa.elem(2,2).real()*bb.elem(2).real() ; \
63 cc.elem(2).real() -= aa.elem(2,2).imag()*bb.elem(2).imag() ; \
64\
65 cc.elem(2).imag() = aa.elem(2,0).real()*bb.elem(0).imag() ; \
66 cc.elem(2).imag() += aa.elem(2,0).imag()*bb.elem(0).real() ; \
67\
68 cc.elem(2).imag() += aa.elem(2,1).real()*bb.elem(1).imag() ; \
69 cc.elem(2).imag() += aa.elem(2,1).imag()*bb.elem(1).real() ; \
70\
71 cc.elem(2).imag() += aa.elem(2,2).real()*bb.elem(2).imag() ; \
72 cc.elem(2).imag() += aa.elem(2,2).imag()*bb.elem(2).real() ; \
73}
74
75/* Unrolled adj SU(3)*color vector: aa^\dagger * bb -> cc
76 * aa = QDP++ PColorMatrix
77 * bb = QDP++ PColorVector
78 * cc = QDP++ PColorVector
79 */
80/* Ideally want to registerize b, have a in cache, and store gather c? */
81#define _inline_generic_mult_adj_su3_mat_vec(aa,bb,cc) \
82{\
83 cc.elem(0).real() = aa.elem(0,0).real()*bb.elem(0).real() ; \
84 cc.elem(0).real() += aa.elem(0,0).imag()*bb.elem(0).imag() ; \
85\
86 cc.elem(0).real() += aa.elem(1,0).real()*bb.elem(1).real() ; \
87 cc.elem(0).real() += aa.elem(1,0).imag()*bb.elem(1).imag() ; \
88\
89 cc.elem(0).real() += aa.elem(2,0).real()*bb.elem(2).real() ; \
90 cc.elem(0).real() += aa.elem(2,0).imag()*bb.elem(2).imag() ; \
91\
92 cc.elem(0).imag() = aa.elem(0,0).real()*bb.elem(0).imag() ; \
93 cc.elem(0).imag() -= aa.elem(0,0).imag()*bb.elem(0).real() ; \
94\
95 cc.elem(0).imag() += aa.elem(1,0).real()*bb.elem(1).imag() ; \
96 cc.elem(0).imag() -= aa.elem(1,0).imag()*bb.elem(1).real() ; \
97\
98 cc.elem(0).imag() += aa.elem(2,0).real()*bb.elem(2).imag() ; \
99 cc.elem(0).imag() -= aa.elem(2,0).imag()*bb.elem(2).real() ; \
100\
101\
102 cc.elem(1).real() = aa.elem(0,1).real()*bb.elem(0).real() ; \
103 cc.elem(1).real() += aa.elem(0,1).imag()*bb.elem(0).imag() ; \
104\
105 cc.elem(1).real() += aa.elem(1,1).real()*bb.elem(1).real() ; \
106 cc.elem(1).real() += aa.elem(1,1).imag()*bb.elem(1).imag() ; \
107\
108 cc.elem(1).real() += aa.elem(2,1).real()*bb.elem(2).real() ; \
109 cc.elem(1).real() += aa.elem(2,1).imag()*bb.elem(2).imag() ; \
110\
111 cc.elem(1).imag() = aa.elem(0,1).real()*bb.elem(0).imag() ; \
112 cc.elem(1).imag() -= aa.elem(0,1).imag()*bb.elem(0).real() ; \
113\
114 cc.elem(1).imag() += aa.elem(1,1).real()*bb.elem(1).imag() ; \
115 cc.elem(1).imag() -= aa.elem(1,1).imag()*bb.elem(1).real() ; \
116\
117 cc.elem(1).imag() += aa.elem(2,1).real()*bb.elem(2).imag() ; \
118 cc.elem(1).imag() -= aa.elem(2,1).imag()*bb.elem(2).real() ; \
119\
120\
121 cc.elem(2).real() = aa.elem(0,2).real()*bb.elem(0).real() ; \
122 cc.elem(2).real() += aa.elem(0,2).imag()*bb.elem(0).imag() ; \
123\
124 cc.elem(2).real() += aa.elem(1,2).real()*bb.elem(1).real() ; \
125 cc.elem(2).real() += aa.elem(1,2).imag()*bb.elem(1).imag() ; \
126\
127 cc.elem(2).real() += aa.elem(2,2).real()*bb.elem(2).real() ; \
128 cc.elem(2).real() += aa.elem(2,2).imag()*bb.elem(2).imag() ; \
129\
130 cc.elem(2).imag() = aa.elem(0,2).real()*bb.elem(0).imag() ; \
131 cc.elem(2).imag() -= aa.elem(0,2).imag()*bb.elem(0).real() ; \
132\
133 cc.elem(2).imag() += aa.elem(1,2).real()*bb.elem(1).imag() ; \
134 cc.elem(2).imag() -= aa.elem(1,2).imag()*bb.elem(1).real() ; \
135\
136 cc.elem(2).imag() += aa.elem(2,2).real()*bb.elem(2).imag() ; \
137 cc.elem(2).imag() -= aa.elem(2,2).imag()*bb.elem(2).real() ; \
138}
139
140#endif