QDP++
qdp_primgamma.h
Go to the documentation of this file.
1// -*- C++ -*-
2//
3//
4// QDP data parallel interface
5//
6
7#ifndef QDP_PRIMGAMMA_H
8#define QDP_PRIMGAMMA_H
9
10namespace QDP {
11
12//-------------------------------------------------------------------------------------
15template<int N> class GammaType
16{
17public:
22
24 GammaType(int mm) : m(mm) {}
25
26public:
28 int elem() const {return m;}
29
30private:
32
36 const int m;
37};
38
39
40//-------------------------------------------------------------------------------------
43template<int N> class GammaTypeDP
44{
45public:
50
52 GammaTypeDP(int mm) : m(mm) {}
53
54public:
56 int elem() const {return m;}
57
58private:
60
64 const int m;
65};
66
67
68//-------------------------------------------------------------------------------------
71template<int N, int m> class GammaConst
72{
73};
74
75
76//-------------------------------------------------------------------------------------
79template<int N, int m> class GammaConstDP
80{
81};
82
83
84//-----------------------------------------------------------------------------
85// Traits classes to support return types
86//-----------------------------------------------------------------------------
87
88// PScalar
89template<int N, int m, class T2, class OpGammaConstMultiply>
93
94template<class T2, int N, int m, class OpMultiplyGammaConst>
98
99template<class T2, int N, class OpGammaTypeMultiply>
103
104template<class T2, int N, class OpMultiplyGammaType>
108
109
110// PScalar
111template<int N, int m, class T2, class OpGammaConstDPMultiply>
115
116template<class T2, int N, int m, class OpMultiplyGammaConstDP>
120
121template<class T2, int N, class OpGammaTypeDPMultiply>
125
126template<class T2, int N, class OpMultiplyGammaTypeDP>
130
131
132//-----------------------------------------------------------------------------
133// Operators
134//-----------------------------------------------------------------------------
135
136// Wrappers for standard binary multiplication with gamma matrix constants
137template<class T, int N> inline T Multiply_gamma0_arg(const T& s1) {return (GammaConst<N,0>() * s1);}
138template<class T, int N> inline T Multiply_gamma1_arg(const T& s1) {return (GammaConst<N,1>() * s1);}
139template<class T, int N> inline T Multiply_gamma2_arg(const T& s1) {return (GammaConst<N,2>() * s1);}
140template<class T, int N> inline T Multiply_gamma3_arg(const T& s1) {return (GammaConst<N,3>() * s1);}
141template<class T, int N> inline T Multiply_gamma4_arg(const T& s1) {return (GammaConst<N,4>() * s1);}
142template<class T, int N> inline T Multiply_gamma5_arg(const T& s1) {return (GammaConst<N,5>() * s1);}
143template<class T, int N> inline T Multiply_gamma6_arg(const T& s1) {return (GammaConst<N,6>() * s1);}
144template<class T, int N> inline T Multiply_gamma7_arg(const T& s1) {return (GammaConst<N,7>() * s1);}
145template<class T, int N> inline T Multiply_gamma8_arg(const T& s1) {return (GammaConst<N,8>() * s1);}
146template<class T, int N> inline T Multiply_gamma9_arg(const T& s1) {return (GammaConst<N,9>() * s1);}
147template<class T, int N> inline T Multiply_gamma10_arg(const T& s1) {return (GammaConst<N,10>() * s1);}
148template<class T, int N> inline T Multiply_gamma11_arg(const T& s1) {return (GammaConst<N,11>() * s1);}
149template<class T, int N> inline T Multiply_gamma12_arg(const T& s1) {return (GammaConst<N,12>() * s1);}
150template<class T, int N> inline T Multiply_gamma13_arg(const T& s1) {return (GammaConst<N,13>() * s1);}
151template<class T, int N> inline T Multiply_gamma14_arg(const T& s1) {return (GammaConst<N,14>() * s1);}
152template<class T, int N> inline T Multiply_gamma15_arg(const T& s1) {return (GammaConst<N,15>() * s1);}
153
154// Wrappers for standard binary multiplication with gamma matrix constants
155template<class T, int N> inline T Multiply_arg_gamma0(const T& s1) {return (s1 * GammaConst<N,0>());}
156template<class T, int N> inline T Multiply_arg_gamma1(const T& s1) {return (s1 * GammaConst<N,1>());}
157template<class T, int N> inline T Multiply_arg_gamma2(const T& s1) {return (s1 * GammaConst<N,2>());}
158template<class T, int N> inline T Multiply_arg_gamma3(const T& s1) {return (s1 * GammaConst<N,3>());}
159template<class T, int N> inline T Multiply_arg_gamma4(const T& s1) {return (s1 * GammaConst<N,4>());}
160template<class T, int N> inline T Multiply_arg_gamma5(const T& s1) {return (s1 * GammaConst<N,5>());}
161template<class T, int N> inline T Multiply_arg_gamma6(const T& s1) {return (s1 * GammaConst<N,6>());}
162template<class T, int N> inline T Multiply_arg_gamma7(const T& s1) {return (s1 * GammaConst<N,7>());}
163template<class T, int N> inline T Multiply_arg_gamma8(const T& s1) {return (s1 * GammaConst<N,8>());}
164template<class T, int N> inline T Multiply_arg_gamma9(const T& s1) {return (s1 * GammaConst<N,9>());}
165template<class T, int N> inline T Multiply_arg_gamma10(const T& s1) {return (s1 * GammaConst<N,10>());}
166template<class T, int N> inline T Multiply_arg_gamma11(const T& s1) {return (s1 * GammaConst<N,11>());}
167template<class T, int N> inline T Multiply_arg_gamma12(const T& s1) {return (s1 * GammaConst<N,12>());}
168template<class T, int N> inline T Multiply_arg_gamma13(const T& s1) {return (s1 * GammaConst<N,13>());}
169template<class T, int N> inline T Multiply_arg_gamma14(const T& s1) {return (s1 * GammaConst<N,14>());}
170template<class T, int N> inline T Multiply_arg_gamma15(const T& s1) {return (s1 * GammaConst<N,15>());}
171
172
173
174template<int N, class T>
175inline T OpGammaTypeMultiply:: operator()(const GammaType<N>& a, const T &b) const
176{
177 typedef T (*Ptrfunc)(const T&);
178 Ptrfunc s[] = {&Multiply_gamma0_arg<T,N>,
194
195 // Using the function pointer table, call via indirection the desired function
196 // based on the argument to Gamma. It is assumed the argument must be a valid
197 // integer since Gamma was constructed (and should check it).
198 return s[a.elem()](b);
199}
200
201
202template<class T, int N>
203inline T OpMultiplyGammaType::operator()(const T &a, const GammaType<N>& b) const
204{
205 typedef T (*Ptrfunc)(const T&);
206 Ptrfunc s[] = {&Multiply_arg_gamma0<T,N>,
222
223 // Using the function pointer table, call via indirection the desired function
224 // based on the argument to Gamma. It is assumed the argument must be a valid
225 // integer since Gamma was constructed (and should check it).
226 return s[b.elem()](a);
227}
228
229//-----------------------------------------------------------------------------
230// Operators
231//-----------------------------------------------------------------------------
232
233// Wrappers for standard binary multiplication with gamma matrix constants
234template<class T, int N> inline T Multiply_gamma0_DP_arg(const T& s1) {return (GammaConstDP<N,0>() * s1);}
235template<class T, int N> inline T Multiply_gamma1_DP_arg(const T& s1) {return (GammaConstDP<N,1>() * s1);}
236template<class T, int N> inline T Multiply_gamma2_DP_arg(const T& s1) {return (GammaConstDP<N,2>() * s1);}
237template<class T, int N> inline T Multiply_gamma3_DP_arg(const T& s1) {return (GammaConstDP<N,3>() * s1);}
238template<class T, int N> inline T Multiply_gamma4_DP_arg(const T& s1) {return (GammaConstDP<N,4>() * s1);}
239template<class T, int N> inline T Multiply_gamma5_DP_arg(const T& s1) {return (GammaConstDP<N,5>() * s1);}
240template<class T, int N> inline T Multiply_gamma6_DP_arg(const T& s1) {return (GammaConstDP<N,6>() * s1);}
241template<class T, int N> inline T Multiply_gamma7_DP_arg(const T& s1) {return (GammaConstDP<N,7>() * s1);}
242template<class T, int N> inline T Multiply_gamma8_DP_arg(const T& s1) {return (GammaConstDP<N,8>() * s1);}
243template<class T, int N> inline T Multiply_gamma9_DP_arg(const T& s1) {return (GammaConstDP<N,9>() * s1);}
244template<class T, int N> inline T Multiply_gamma10_DP_arg(const T& s1) {return (GammaConstDP<N,10>() * s1);}
245template<class T, int N> inline T Multiply_gamma11_DP_arg(const T& s1) {return (GammaConstDP<N,11>() * s1);}
246template<class T, int N> inline T Multiply_gamma12_DP_arg(const T& s1) {return (GammaConstDP<N,12>() * s1);}
247template<class T, int N> inline T Multiply_gamma13_DP_arg(const T& s1) {return (GammaConstDP<N,13>() * s1);}
248template<class T, int N> inline T Multiply_gamma14_DP_arg(const T& s1) {return (GammaConstDP<N,14>() * s1);}
249template<class T, int N> inline T Multiply_gamma15_DP_arg(const T& s1) {return (GammaConstDP<N,15>() * s1);}
250
251// Wrappers for standard binary multiplication with gamma matrix constants
252template<class T, int N> inline T Multiply_DP_arg_gamma0(const T& s1) {return (s1 * GammaConstDP<N,0>());}
253template<class T, int N> inline T Multiply_DP_arg_gamma1(const T& s1) {return (s1 * GammaConstDP<N,1>());}
254template<class T, int N> inline T Multiply_DP_arg_gamma2(const T& s1) {return (s1 * GammaConstDP<N,2>());}
255template<class T, int N> inline T Multiply_DP_arg_gamma3(const T& s1) {return (s1 * GammaConstDP<N,3>());}
256template<class T, int N> inline T Multiply_DP_arg_gamma4(const T& s1) {return (s1 * GammaConstDP<N,4>());}
257template<class T, int N> inline T Multiply_DP_arg_gamma5(const T& s1) {return (s1 * GammaConstDP<N,5>());}
258template<class T, int N> inline T Multiply_DP_arg_gamma6(const T& s1) {return (s1 * GammaConstDP<N,6>());}
259template<class T, int N> inline T Multiply_DP_arg_gamma7(const T& s1) {return (s1 * GammaConstDP<N,7>());}
260template<class T, int N> inline T Multiply_DP_arg_gamma8(const T& s1) {return (s1 * GammaConstDP<N,8>());}
261template<class T, int N> inline T Multiply_DP_arg_gamma9(const T& s1) {return (s1 * GammaConstDP<N,9>());}
262template<class T, int N> inline T Multiply_DP_arg_gamma10(const T& s1) {return (s1 * GammaConstDP<N,10>());}
263template<class T, int N> inline T Multiply_DP_arg_gamma11(const T& s1) {return (s1 * GammaConstDP<N,11>());}
264template<class T, int N> inline T Multiply_DP_arg_gamma12(const T& s1) {return (s1 * GammaConstDP<N,12>());}
265template<class T, int N> inline T Multiply_DP_arg_gamma13(const T& s1) {return (s1 * GammaConstDP<N,13>());}
266template<class T, int N> inline T Multiply_DP_arg_gamma14(const T& s1) {return (s1 * GammaConstDP<N,14>());}
267template<class T, int N> inline T Multiply_DP_arg_gamma15(const T& s1) {return (s1 * GammaConstDP<N,15>());}
268
269
270
271template<int N, class T>
272inline T OpGammaTypeDPMultiply:: operator()(const GammaTypeDP<N>& a, const T &b) const
273{
274 typedef T (*Ptrfunc)(const T&);
275 Ptrfunc s[] = {&Multiply_gamma0_DP_arg<T,N>,
291
292 // Using the function pointer table, call via indirection the desired function
293 // based on the argument to Gamma. It is assumed the argument must be a valid
294 // integer since Gamma was constructed (and should check it).
295 return s[a.elem()](b);
296}
297
298
299template<class T, int N>
300inline T OpMultiplyGammaTypeDP::operator()(const T &a, const GammaTypeDP<N>& b) const
301{
302 typedef T (*Ptrfunc)(const T&);
303 Ptrfunc s[] = {&Multiply_DP_arg_gamma0<T,N>,
319
320 // Using the function pointer table, call via indirection the desired function
321 // based on the argument to Gamma. It is assumed the argument must be a valid
322 // integer since Gamma was constructed (and should check it).
323 return s[b.elem()](a);
324}
325
326} // namespace QDP
327
328#endif
GammaTypeDP(int mm)
Index from an integer.
GammaTypeDP()
Main constructor.
int elem() const
The integer representation for which product of gamma matrices.
~GammaTypeDP()
Destructor.
int elem() const
The integer representation for which product of gamma matrices.
GammaType(int mm)
Index from an integer.
GammaType()
Main constructor.
~GammaType()
Destructor.
Primitive Scalar.
Yet another random number generator.
T Multiply_gamma14_arg(const T &s1)
T Multiply_arg_gamma15(const T &s1)
T Multiply_gamma3_arg(const T &s1)
T Multiply_gamma4_arg(const T &s1)
T Multiply_DP_arg_gamma15(const T &s1)
T Multiply_gamma6_DP_arg(const T &s1)
T Multiply_gamma1_arg(const T &s1)
T Multiply_arg_gamma3(const T &s1)
T Multiply_arg_gamma6(const T &s1)
T Multiply_arg_gamma8(const T &s1)
T Multiply_gamma9_DP_arg(const T &s1)
T Multiply_gamma4_DP_arg(const T &s1)
T Multiply_arg_gamma0(const T &s1)
T Multiply_gamma9_arg(const T &s1)
T Multiply_gamma6_arg(const T &s1)
T Multiply_gamma3_DP_arg(const T &s1)
T Multiply_gamma0_DP_arg(const T &s1)
T Multiply_arg_gamma10(const T &s1)
T Multiply_DP_arg_gamma0(const T &s1)
T Multiply_gamma8_DP_arg(const T &s1)
T Multiply_gamma12_DP_arg(const T &s1)
T Multiply_DP_arg_gamma7(const T &s1)
T Multiply_gamma7_DP_arg(const T &s1)
T Multiply_gamma5_DP_arg(const T &s1)
T Multiply_gamma8_arg(const T &s1)
T Multiply_gamma1_DP_arg(const T &s1)
T Multiply_DP_arg_gamma12(const T &s1)
T Multiply_gamma13_DP_arg(const T &s1)
T Multiply_DP_arg_gamma10(const T &s1)
T Multiply_arg_gamma4(const T &s1)
T Multiply_DP_arg_gamma9(const T &s1)
T Multiply_gamma2_DP_arg(const T &s1)
T Multiply_arg_gamma13(const T &s1)
T Multiply_gamma14_DP_arg(const T &s1)
T Multiply_DP_arg_gamma4(const T &s1)
T Multiply_gamma10_arg(const T &s1)
T Multiply_DP_arg_gamma3(const T &s1)
T Multiply_arg_gamma12(const T &s1)
T Multiply_gamma15_arg(const T &s1)
T Multiply_gamma11_arg(const T &s1)
T Multiply_gamma13_arg(const T &s1)
T Multiply_gamma15_DP_arg(const T &s1)
T Multiply_DP_arg_gamma5(const T &s1)
T Multiply_gamma10_DP_arg(const T &s1)
T Multiply_arg_gamma11(const T &s1)
T Multiply_gamma5_arg(const T &s1)
T Multiply_DP_arg_gamma2(const T &s1)
T Multiply_DP_arg_gamma11(const T &s1)
T Multiply_DP_arg_gamma1(const T &s1)
T Multiply_gamma7_arg(const T &s1)
T Multiply_arg_gamma7(const T &s1)
T Multiply_gamma12_arg(const T &s1)
T Multiply_arg_gamma5(const T &s1)
T Multiply_DP_arg_gamma6(const T &s1)
T Multiply_DP_arg_gamma13(const T &s1)
T Multiply_gamma0_arg(const T &s1)
T Multiply_arg_gamma9(const T &s1)
T Multiply_arg_gamma14(const T &s1)
T Multiply_arg_gamma2(const T &s1)
T Multiply_arg_gamma1(const T &s1)
T Multiply_DP_arg_gamma14(const T &s1)
T Multiply_DP_arg_gamma8(const T &s1)
T Multiply_gamma2_arg(const T &s1)
T Multiply_gamma11_DP_arg(const T &s1)
PScalar< typename UnaryReturn< T2, OpUnaryPlus >::Type_t > Type_t
PScalar< typename UnaryReturn< T2, OpUnaryPlus >::Type_t > Type_t
PScalar< typename UnaryReturn< T2, OpUnaryPlus >::Type_t > Type_t
PScalar< typename UnaryReturn< T2, OpUnaryPlus >::Type_t > Type_t
PScalar< typename UnaryReturn< T2, OpUnaryPlus >::Type_t > Type_t
PScalar< typename UnaryReturn< T2, OpUnaryPlus >::Type_t > Type_t
PScalar< typename UnaryReturn< T2, OpUnaryPlus >::Type_t > Type_t
PScalar< typename UnaryReturn< T2, OpUnaryPlus >::Type_t > Type_t
T operator()(const GammaTypeDP< N > &a, const T &b) const
T operator()(const GammaType< N > &a, const T &b) const
T operator()(const T &a, const GammaTypeDP< N > &b) const
T operator()(const T &a, const GammaType< N > &b) const