11#ifndef LINEAR_ALGEBRA_GENERIC_H
12#define LINEAR_ALGEBRA_GENERIC_H
14#include "libhr_core.h"
16#define template_error error(1, 1, __func__, "Complex multiplication of real-valued field \n");
19#define __mul_add_assign_suNfc(s1, rho, s2) suNfc * : ({ _suNfc_mul_add(*(suNfc *)s1, 1.0, *(suNfc *)s1, rho, *(suNfc *)s2); }),
21#define __mul_add_assign_suNfc(s1, rho, s2)
24#define mul_add_assign(s1, rho, s2) \
26 spinor_field *: mul_add_assign_spinor_field((spinor_field *)s1, rho, (spinor_field *)s2), \
27 spinor_field_flt *: mul_add_assign_spinor_field_flt((spinor_field_flt *)s1, rho, (spinor_field_flt *)s2), \
28 scalar_field *: mul_add_assign_scalar_field((scalar_field *)s1, rho, (scalar_field *)s2), \
29 suNg_field *: mul_add_assign_suNg_field((suNg_field *)s1, rho, (suNg_field *)s2), \
30 suNf_field *: mul_add_assign_suNf_field((suNf_field *)s1, rho, (suNf_field *)s2), \
31 suNfc_field *: mul_add_assign_suNfc_field((suNfc_field *)s1, rho, (suNfc_field *)s2), \
32 suNg_field_flt *: mul_add_assign_suNg_field_flt((suNg_field_flt *)s1, rho, (suNg_field_flt *)s2), \
33 suNf_field_flt *: mul_add_assign_suNf_field_flt((suNf_field_flt *)s1, rho, (suNf_field_flt *)s2), \
34 suNg_scalar_field *: mul_add_assign_suNg_scalar_field((suNg_scalar_field *)s1, rho, (suNg_scalar_field *)s2), \
35 suNg_av_field *: mul_add_assign_suNg_av_field((suNg_av_field *)s1, rho, (suNg_av_field *)s2), \
36 gtransf *: mul_add_assign_gtransf((gtransf *)s1, rho, (gtransf *)s2), \
37 clover_term *: mul_add_assign_clover_term((clover_term *)s1, rho, (clover_term *)s2), \
38 clover_force *: mul_add_assign_clover_force((clover_force *)s1, rho, (clover_force *)s2), \
39 staple_field *: mul_add_assign_staple_field((staple_field *)s1, rho, (staple_field *)s2), \
40 suNf_spinor *: ({ _spinor_mul_add_assign_f(*(suNf_spinor *)s1, rho, *(suNf_spinor *)s2); }), \
41 suNf_spinor_flt *: ({ _spinor_mul_add_assign_f(*(suNf_spinor_flt *)s1, rho, *(suNf_spinor_flt *)s2); }), \
42 __mul_add_assign_suNfc(s1, rho, s2) suNf *: ({ _suNf_mul_add(*(suNf *)s1, 1.0, *(suNf *)s1, rho, *(suNf *)s2); }), \
43 suNg *: ({ _suNg_mul_add(*(suNg *)s1, 1.0, *(suNg *)s1, rho, *(suNg *)s2); }), \
44 suNf_flt *: ({ _suNf_mul_add(*(suNf_flt *)s1, 1.0, *(suNf_flt *)s1, rho, *(suNf_flt *)s2); }), \
45 suNg_flt *: ({ _suNg_mul_add(*(suNg_flt *)s1, 1.0, *(suNg_flt *)s1, rho, *(suNg_flt *)s2); }), \
46 suNf_vector *: ({ _vector_mul_add_assign_f(*(suNf_vector *)s1, rho, *(suNf_vector *)s2); }), \
47 suNg_vector *: ({ _vector_mul_add_assign_g(*(suNg_vector *)s1, rho, *(suNg_vector *)s2); }), \
48 suNg_algebra_vector *: ({ \
49 _algebra_vector_mul_add_assign_g(*(suNg_algebra_vector *)s1, rho, *(suNg_algebra_vector *)s2); \
51 double *: ({ (*(double *)s1) += (rho) * (*(double *)s2); }), \
52 float *: ({ (*(double *)s1) += (rho) * (*(double *)s2); }))
55#define __mulc_add_assign_suNfc(s1, rho, s2) \
58 _suNfc_mulc(__tmp, rho, *(suNfc *)s2); \
59 _suNfc_add_assign(*(suNfc *)s1, __tmp); \
62#define __mulc_add_assign_suNf(s1, rho, s2) suNf * : ({ template_error; }),
63#define __mulc_add_assign_suNf_flt(s1, rho, s2) suNf_flt * : ({ template_error; }),
65#define __mulc_add_assign_suNfc(s1, rho, s2)
66#define __mulc_add_assign_suNf(s1, rho, s2) \
69 _suNf_mulc(__tmp, rho, *(suNf *)s2); \
70 _suNf_add_assign(*(suNf *)s1, __tmp); \
73#define __mulc_add_assign_suNf_flt(s1, rho, s2) \
76 _suNf_mulc(__tmp, rho, *(suNf_flt *)s2); \
77 _suNf_add_assign(*(suNf_flt *)s1, __tmp); \
81#define mulc_add_assign(s1, rho, s2) \
83 spinor_field *: mulc_add_assign_spinor_field((spinor_field *)s1, rho, (spinor_field *)s2), \
84 spinor_field_flt *: mulc_add_assign_spinor_field_flt((spinor_field_flt *)s1, rho, (spinor_field_flt *)s2), \
85 scalar_field *: mulc_add_assign_scalar_field((scalar_field *)s1, rho, (scalar_field *)s2), \
86 suNg_field *: mulc_add_assign_suNg_field((suNg_field *)s1, rho, (suNg_field *)s2), \
87 suNf_field *: mulc_add_assign_suNf_field((suNf_field *)s1, rho, (suNf_field *)s2), \
88 suNfc_field *: mulc_add_assign_suNfc_field((suNfc_field *)s1, rho, (suNfc_field *)s2), \
89 suNg_field_flt *: mulc_add_assign_suNg_field_flt((suNg_field_flt *)s1, rho, (suNg_field_flt *)s2), \
90 suNf_field_flt *: mulc_add_assign_suNf_field_flt((suNf_field_flt *)s1, rho, (suNf_field_flt *)s2), \
91 suNg_scalar_field *: mulc_add_assign_suNg_scalar_field((suNg_scalar_field *)s1, rho, (suNg_scalar_field *)s2), \
92 suNg_av_field *: mulc_add_assign_suNg_av_field((suNg_av_field *)s1, rho, (suNg_av_field *)s2), \
93 gtransf *: mulc_add_assign_gtransf((gtransf *)s1, rho, (gtransf *)s2), \
94 clover_term *: mulc_add_assign_clover_term((clover_term *)s1, rho, (clover_term *)s2), \
95 clover_force *: mulc_add_assign_clover_force((clover_force *)s1, rho, (clover_force *)s2), \
96 staple_field *: mulc_add_assign_staple_field((staple_field *)s1, rho, (staple_field *)s2), \
97 suNf_spinor *: ({ _spinor_mulc_add_assign_f(*(suNf_spinor *)s1, (hr_complex)rho, *(suNf_spinor *)s2); }), \
98 suNf_spinor_flt *: ({ \
99 _spinor_mulc_add_assign_f(*(suNf_spinor_flt *)s1, (hr_complex_flt)rho, *(suNf_spinor_flt *)s2); \
101 __mulc_add_assign_suNf(s1, rho, s2) __mulc_add_assign_suNf_flt(s1, rho, s2) __mulc_add_assign_suNfc(s1, rho, s2) \
104 _suNg_mulc(__tmp, rho, *(suNg *)s2); \
105 _suNg_add_assign(*(suNg *)s1, __tmp); \
110 _suNg_mulc(__tmp, rho, *(suNg_flt *)s2); \
111 _suNg_add_assign(*(suNg_flt *)s1, __tmp); \
113 suNf_vector *: ({ _vector_mulc_add_assign_f(*(suNf_vector *)s1, rho, *(suNf_vector *)s2); }), \
114 suNg_vector *: ({ _vector_mulc_add_assign_g(*(suNg_vector *)s1, rho, *(suNg_vector *)s2); }), \
115 suNg_algebra_vector *: ({ template_error; }), \
116 double *: ({ template_error; }), \
117 float *: ({ template_error; }))
120#define __mul_suNfc(s1, rho, s2) suNfc * : ({ _suNfc_mul((*((suNfc *)s1)), rho, (*((suNfc *)s2))); }),
122#define __mul_suNfc(s1, rho, s2)
125#define mul(s1, rho, s2) \
127 spinor_field *: mul_spinor_field((spinor_field *)s1, rho, (spinor_field *)s2), \
128 spinor_field_flt *: mul_spinor_field_flt((spinor_field_flt *)s1, rho, (spinor_field_flt *)s2), \
129 scalar_field *: mul_scalar_field((scalar_field *)s1, rho, (scalar_field *)s2), \
130 suNg_field *: mul_suNg_field((suNg_field *)s1, rho, (suNg_field *)s2), \
131 suNf_field *: mul_suNf_field((suNf_field *)s1, rho, (suNf_field *)s2), \
132 suNfc_field *: mul_suNfc_field((suNfc_field *)s1, rho, (suNfc_field *)s2), \
133 suNg_field_flt *: mul_suNg_field_flt((suNg_field_flt *)s1, rho, (suNg_field_flt *)s2), \
134 suNf_field_flt *: mul_suNf_field_flt((suNf_field_flt *)s1, rho, (suNf_field_flt *)s2), \
135 suNg_scalar_field *: mul_suNg_scalar_field((suNg_scalar_field *)s1, rho, (suNg_scalar_field *)s2), \
136 suNg_av_field *: mul_suNg_av_field((suNg_av_field *)s1, rho, (suNg_av_field *)s2), \
137 gtransf *: mul_gtransf((gtransf *)s1, rho, (gtransf *)s2), \
138 clover_term *: mul_clover_term((clover_term *)s1, rho, (clover_term *)s2), \
139 clover_force *: mul_clover_force((clover_force *)s1, rho, (clover_force *)s2), \
140 staple_field *: mul_staple_field((staple_field *)s1, rho, (staple_field *)s2), \
141 suNf_spinor *: ({ _spinor_mul_f(*(suNf_spinor *)s1, (hr_complex)rho, *(suNf_spinor *)s2); }), \
142 suNf_spinor_flt *: ({ _spinor_mul_f(*(suNf_spinor_flt *)s1, (hr_complex_flt)rho, *(suNf_spinor_flt *)s2); }), \
143 __mul_suNfc(s1, rho, s2) suNf *: ({ _suNf_mul((*((suNf *)s1)), rho, (*((suNf *)s2))); }), \
144 suNg *: ({ _suNg_mul(*(suNg *)s1, rho, *(suNg *)s2); }), \
145 suNf_flt *: ({ _suNf_mul(*(suNf_flt *)s1, rho, *(suNf_flt *)s2); }), \
146 suNg_flt *: ({ _suNg_mul(*(suNg_flt *)s1, rho, *(suNg_flt *)s2); }), \
147 suNf_vector *: ({ _vector_mul_f(*(suNf_vector *)s1, rho, *(suNf_vector *)s2); }), \
148 suNg_vector *: ({ _vector_mul_g(*(suNg_vector *)s1, rho, *(suNg_vector *)s2); }), \
149 suNg_algebra_vector *: ({ _algebra_vector_mul_g(*(suNg_algebra_vector *)s1, rho, *(suNg_algebra_vector *)s2); }), \
150 double *: ({ (*(double *)s1) = (rho) * (*(double *)s2); }), \
151 float *: ({ (*(double *)s1) = (rho) * (*(double *)s2); }))
154#define __mulc_suNfc(s1, rho, s2) suNfc * : ({ _suNfc_mulc(*(suNfc *)s1, rho, *(suNfc *)s2); }),
155#define __mulc_suNf(s1, rho, s2) suNf * : ({ template_error; }),
156#define __mulc_suNf_flt(s1, rho, s2) suNf_flt * : ({ template_error; }),
158#define __mulc_suNfc(s1, rho, s2)
159#define __mulc_suNf(s1, rho, s2) suNf * : ({ _suNf_mulc((*((suNf *)s1)), rho, (*((suNf *)s2))); }),
160#define __mulc_suNf_flt(s1, rho, s2) suNf_flt * : ({ _suNf_mulc(*(suNf_flt *)s1, rho, *(suNf_flt *)s2); }),
163#define mulc(s1, rho, s2) \
165 spinor_field *: mulc_spinor_field((spinor_field *)s1, rho, (spinor_field *)s2), \
166 spinor_field_flt *: mulc_spinor_field_flt((spinor_field_flt *)s1, rho, (spinor_field_flt *)s2), \
167 scalar_field *: mulc_scalar_field((scalar_field *)s1, rho, (scalar_field *)s2), \
168 suNg_field *: mulc_suNg_field((suNg_field *)s1, rho, (suNg_field *)s2), \
169 suNf_field *: mulc_suNf_field((suNf_field *)s1, rho, (suNf_field *)s2), \
170 suNfc_field *: mulc_suNfc_field((suNfc_field *)s1, rho, (suNfc_field *)s2), \
171 suNg_field_flt *: mulc_suNg_field_flt((suNg_field_flt *)s1, rho, (suNg_field_flt *)s2), \
172 suNf_field_flt *: mulc_suNf_field_flt((suNf_field_flt *)s1, rho, (suNf_field_flt *)s2), \
173 suNg_scalar_field *: mulc_suNg_scalar_field((suNg_scalar_field *)s1, rho, (suNg_scalar_field *)s2), \
174 suNg_av_field *: mulc_suNg_av_field((suNg_av_field *)s1, rho, (suNg_av_field *)s2), \
175 gtransf *: mulc_gtransf((gtransf *)s1, rho, (gtransf *)s2), \
176 clover_term *: mulc_clover_term((clover_term *)s1, rho, (clover_term *)s2), \
177 clover_force *: mulc_clover_force((clover_force *)s1, rho, (clover_force *)s2), \
178 staple_field *: mulc_staple_field((staple_field *)s1, rho, (staple_field *)s2), \
179 suNf_spinor *: ({ _spinor_mulc_f(*(suNf_spinor *)s1, (hr_complex)rho, *(suNf_spinor *)s2); }), \
180 suNf_spinor_flt *: ({ _spinor_mulc_f(*(suNf_spinor_flt *)s1, (hr_complex_flt)rho, *(suNf_spinor_flt *)s2); }), \
181 __mulc_suNfc(s1, rho, s2) __mulc_suNf(s1, rho, s2) __mulc_suNf_flt(s1, rho, s2) \
182 suNg *: ({ _suNg_mulc(*(suNg *)s1, rho, *(suNg *)s2); }), \
183 suNg_flt *: ({ _suNg_mulc(*(suNg_flt *)s1, rho, *(suNg_flt *)s2); }), \
184 suNf_vector *: ({ _vector_mulc_f(*(suNf_vector *)s1, rho, *(suNf_vector *)s2); }), \
185 suNg_vector *: ({ _vector_mulc_g(*(suNg_vector *)s1, rho, *(suNg_vector *)s2); }), \
186 suNg_algebra_vector *: ({ \
187 _algebra_vector_mul_g(*(suNg_algebra_vector *)s1, creal(rho), *(suNg_algebra_vector *)s2); \
189 double *: ({ template_error; }), \
190 float *: ({ template_error; }))
193#define __add_suNfc(r, s1, s2) suNfc * : ({ _suNfc_mul_add(*(suNfc *)r, 1.0, *(suNfc *)s1, 1.0, *(suNfc *)s2); }),
195#define __add_suNfc(r, s1, s2)
198#define add(r, s1, s2) \
200 spinor_field *: add_spinor_field((spinor_field *)r, (spinor_field *)s1, (spinor_field *)s2), \
201 spinor_field_flt *: add_spinor_field_flt((spinor_field_flt *)r, (spinor_field_flt *)s1, (spinor_field_flt *)s2), \
202 scalar_field *: add_scalar_field((scalar_field *)r, (scalar_field *)s1, (scalar_field *)s2), \
203 suNg_field *: add_suNg_field((suNg_field *)r, (suNg_field *)s1, (suNg_field *)s2), \
204 suNf_field *: add_suNf_field((suNf_field *)r, (suNf_field *)s1, (suNf_field *)s2), \
205 suNfc_field *: add_suNfc_field((suNfc_field *)r, (suNfc_field *)s1, (suNfc_field *)s2), \
206 suNg_field_flt *: add_suNg_field_flt((suNg_field_flt *)r, (suNg_field_flt *)s1, (suNg_field_flt *)s2), \
207 suNf_field_flt *: add_suNf_field_flt((suNf_field_flt *)r, (suNf_field_flt *)s1, (suNf_field_flt *)s2), \
208 suNg_scalar_field *: add_suNg_scalar_field((suNg_scalar_field *)r, (suNg_scalar_field *)s1, (suNg_scalar_field *)s2), \
209 suNg_av_field *: add_suNg_av_field((suNg_av_field *)r, (suNg_av_field *)s1, (suNg_av_field *)s2), \
210 gtransf *: add_gtransf((gtransf *)r, (gtransf *)s1, (gtransf *)s2), \
211 clover_term *: add_clover_term((clover_term *)r, (clover_term *)s1, (clover_term *)s2), \
212 clover_force *: add_clover_force((clover_force *)r, (clover_force *)s1, (clover_force *)s2), \
213 staple_field *: add_staple_field((staple_field *)r, (staple_field *)s1, (staple_field *)s2), \
214 suNf_spinor *: ({ _spinor_add_f(*(suNf_spinor *)r, *(suNf_spinor *)s1, *(suNf_spinor *)s2); }), \
215 suNf_spinor_flt *: ({ _spinor_add_f(*(suNf_spinor_flt *)r, *(suNf_spinor_flt *)s1, *(suNf_spinor_flt *)s2); }), \
216 __add_suNfc(r, s1, s2) suNf *: ({ _suNf_mul_add(*(suNf *)r, 1.0, *(suNf *)s1, 1.0, *(suNf *)s2); }), \
217 suNg *: ({ _suNg_mul_add(*(suNg *)r, 1.0, *(suNg *)s1, 1.0, *(suNg *)s2); }), \
218 suNf_flt *: ({ _suNf_mul_add(*(suNf_flt *)r, 1.0, *(suNf_flt *)s1, 1.0, *(suNf_flt *)s2); }), \
219 suNg_flt *: ({ _suNg_mul_add(*(suNg_flt *)r, 1.0, *(suNg_flt *)s1, 1.0, *(suNg_flt *)s2); }), \
220 suNf_vector *: ({ _vector_add_f(*(suNf_vector *)r, *(suNf_vector *)s1, *(suNf_vector *)s2); }), \
221 suNg_vector *: ({ _vector_add_g(*(suNg_vector *)r, *(suNg_vector *)s1, *(suNg_vector *)s2); }), \
222 suNg_algebra_vector *: ({ \
223 _algebra_vector_zero_g(*(suNg_algebra_vector *)r); \
224 _algebra_vector_add_assign_g(*(suNg_algebra_vector *)r, *(suNg_algebra_vector *)s1); \
225 _algebra_vector_add_assign_g(*(suNg_algebra_vector *)r, *(suNg_algebra_vector *)s2); \
227 double *: ({ (*(double *)r) = (*(double *)s1) + (*(double *)s2); }), \
228 float *: ({ (*(double *)r) = (*(double *)s1) + (*(double *)s2); }))
231#define __sub_suNfc(r, s1, s2) suNfc * : ({ _suNfc_mul_add(*(suNfc *)r, 1.0, *(suNfc *)s1, -1.0, *(suNfc *)s2); }),
233#define __sub_suNfc(r, s1, s2)
236#define sub(r, s1, s2) \
238 spinor_field *: sub_spinor_field((spinor_field *)r, (spinor_field *)s1, (spinor_field *)s2), \
239 spinor_field_flt *: sub_spinor_field_flt((spinor_field_flt *)r, (spinor_field_flt *)s1, (spinor_field_flt *)s2), \
240 scalar_field *: sub_scalar_field((scalar_field *)r, (scalar_field *)s1, (scalar_field *)s2), \
241 suNg_field *: sub_suNg_field((suNg_field *)r, (suNg_field *)s1, (suNg_field *)s2), \
242 suNf_field *: sub_suNf_field((suNf_field *)r, (suNf_field *)s1, (suNf_field *)s2), \
243 suNfc_field *: sub_suNfc_field((suNfc_field *)r, (suNfc_field *)s1, (suNfc_field *)s2), \
244 suNg_field_flt *: sub_suNg_field_flt((suNg_field_flt *)r, (suNg_field_flt *)s1, (suNg_field_flt *)s2), \
245 suNf_field_flt *: sub_suNf_field_flt((suNf_field_flt *)r, (suNf_field_flt *)s1, (suNf_field_flt *)s2), \
246 suNg_scalar_field *: sub_suNg_scalar_field((suNg_scalar_field *)r, (suNg_scalar_field *)s1, (suNg_scalar_field *)s2), \
247 suNg_av_field *: sub_suNg_av_field((suNg_av_field *)r, (suNg_av_field *)s1, (suNg_av_field *)s2), \
248 gtransf *: sub_gtransf((gtransf *)r, (gtransf *)s1, (gtransf *)s2), \
249 clover_term *: sub_clover_term((clover_term *)r, (clover_term *)s1, (clover_term *)s2), \
250 clover_force *: sub_clover_force((clover_force *)r, (clover_force *)s1, (clover_force *)s2), \
251 staple_field *: sub_staple_field((staple_field *)r, (staple_field *)s1, (staple_field *)s2), \
252 suNf_spinor *: ({ _spinor_sub_f(*(suNf_spinor *)r, *(suNf_spinor *)s1, *(suNf_spinor *)s2); }), \
253 suNf_spinor_flt *: ({ _spinor_sub_f(*(suNf_spinor_flt *)r, *(suNf_spinor_flt *)s1, *(suNf_spinor_flt *)s2); }), \
254 __sub_suNfc(r, s1, s2) suNf *: ({ _suNf_mul_add(*(suNf *)r, 1.0, *(suNf *)s1, -1.0, *(suNf *)s2); }), \
255 suNg *: ({ _suNg_mul_add(*(suNg *)r, 1.0, *(suNg *)s1, -1.0, *(suNg *)s2); }), \
256 suNf_flt *: ({ _suNf_mul_add(*(suNf_flt *)r, (float)(1.0), *(suNf_flt *)s1, -(float)(1.0), *(suNf_flt *)s2); }), \
257 suNg_flt *: ({ _suNg_mul_add(*(suNg_flt *)r, (float)(1.0), *(suNg_flt *)s1, -(float)(1.0), *(suNg_flt *)s2); }), \
258 suNf_vector *: ({ _vector_sub_f(*(suNf_vector *)r, *(suNf_vector *)s1, *(suNf_vector *)s2); }), \
259 suNg_vector *: ({ _vector_sub_g(*(suNg_vector *)r, *(suNg_vector *)s1, *(suNg_vector *)s2); }), \
260 suNg_algebra_vector *: ({ \
261 _algebra_vector_zero_g(*(suNg_algebra_vector *)r); \
262 _algebra_vector_add_assign_g(*(suNg_algebra_vector *)r, *(suNg_algebra_vector *)s1); \
263 _algebra_vector_sub_assign_g(*(suNg_algebra_vector *)r, *(suNg_algebra_vector *)s2); \
265 double *: ({ (*(double *)r) = (*(double *)s1) - (*(double *)s2); }), \
266 float *: ({ (*(double *)r) = (*(double *)s1) - (*(double *)s2); }))
269#define __sub_assign_suNfc(s1, s2) suNfc * : ({ _suNfc_sub_assign(*(suNfc *)s1, *(suNfc *)s2); }),
271#define __sub_assign_suNfc(s1, s2)
274#define sub_assign(s1, s2) \
276 spinor_field *: sub_assign_spinor_field((spinor_field *)s1, (spinor_field *)s2), \
277 spinor_field_flt *: sub_assign_spinor_field_flt((spinor_field_flt *)s1, (spinor_field_flt *)s2), \
278 scalar_field *: sub_assign_scalar_field((scalar_field *)s1, (scalar_field *)s2), \
279 suNg_field *: sub_assign_suNg_field((suNg_field *)s1, (suNg_field *)s2), \
280 suNf_field *: sub_assign_suNf_field((suNf_field *)s1, (suNf_field *)s2), \
281 suNfc_field *: sub_assign_suNfc_field((suNfc_field *)s1, (suNfc_field *)s2), \
282 suNg_field_flt *: sub_assign_suNg_field_flt((suNg_field_flt *)s1, (suNg_field_flt *)s2), \
283 suNf_field_flt *: sub_assign_suNf_field_flt((suNf_field_flt *)s1, (suNf_field_flt *)s2), \
284 suNg_scalar_field *: sub_assign_suNg_scalar_field((suNg_scalar_field *)s1, (suNg_scalar_field *)s2), \
285 suNg_av_field *: sub_assign_suNg_av_field((suNg_av_field *)s1, (suNg_av_field *)s2), \
286 gtransf *: sub_assign_gtransf((gtransf *)s1, (gtransf *)s2), \
287 clover_term *: sub_assign_clover_term((clover_term *)s1, (clover_term *)s2), \
288 clover_force *: sub_assign_clover_force((clover_force *)s1, (clover_force *)s2), \
289 staple_field *: sub_assign_staple_field((staple_field *)s1, (staple_field *)s2), \
290 suNf_spinor *: ({ _spinor_sub_assign_f(*(suNf_spinor *)s1, *(suNf_spinor *)s2); }), \
291 suNf_spinor_flt *: ({ _spinor_sub_assign_f(*(suNf_spinor_flt *)s1, *(suNf_spinor_flt *)s2); }), \
292 __sub_assign_suNfc(s1, s2) suNf *: ({ _suNf_sub_assign(*(suNf *)s1, *(suNf *)s2); }), \
293 suNg *: ({ _suNg_sub_assign(*(suNg *)s1, *(suNg *)s2); }), \
294 suNf_flt *: ({ _suNf_sub_assign(*(suNf_flt *)s1, *(suNf_flt *)s2); }), \
295 suNg_flt *: ({ _suNg_sub_assign(*(suNg_flt *)s1, *(suNg_flt *)s2); }), \
296 suNf_vector *: ({ _vector_sub_assign_f(*(suNf_vector *)s1, *(suNf_vector *)s2); }), \
297 suNg_vector *: ({ _vector_sub_assign_g(*(suNg_vector *)s1, *(suNg_vector *)s2); }), \
298 suNg_algebra_vector *: ({ _algebra_vector_sub_assign_g(*(suNg_algebra_vector *)s1, *(suNg_algebra_vector *)s2); }), \
299 double *: ({ (*(double *)s1) -= (*(double *)s2); }), \
300 float *: ({ (*(double *)s1) -= (*(double *)s2); }))
303#define __minus_suNfc(s1, s2) suNfc * : ({ _suNfc_minus(*(suNfc *)s1, *(suNfc *)s2); }),
305#define __minus_suNfc(s1, s2)
308#define minus(s1, s2) \
310 spinor_field *: minus_spinor_field((spinor_field *)s1, (spinor_field *)s2), \
311 spinor_field_flt *: minus_spinor_field_flt((spinor_field_flt *)s1, (spinor_field_flt *)s2), \
312 scalar_field *: minus_scalar_field((scalar_field *)s1, (scalar_field *)s2), \
313 suNg_field *: minus_suNg_field((suNg_field *)s1, (suNg_field *)s2), \
314 suNf_field *: minus_suNf_field((suNf_field *)s1, (suNf_field *)s2), \
315 suNfc_field *: minus_suNfc_field((suNfc_field *)s1, (suNfc_field *)s2), \
316 suNg_field_flt *: minus_suNg_field_flt((suNg_field_flt *)s1, (suNg_field_flt *)s2), \
317 suNf_field_flt *: minus_suNf_field_flt((suNf_field_flt *)s1, (suNf_field_flt *)s2), \
318 suNg_scalar_field *: minus_suNg_scalar_field((suNg_scalar_field *)s1, (suNg_scalar_field *)s2), \
319 suNg_av_field *: minus_suNg_av_field((suNg_av_field *)s1, (suNg_av_field *)s2), \
320 gtransf *: minus_gtransf((gtransf *)s1, (gtransf *)s2), \
321 clover_term *: minus_clover_term((clover_term *)s1, (clover_term *)s2), \
322 clover_force *: minus_clover_force((clover_force *)s1, (clover_force *)s2), \
323 staple_field *: minus_staple_field((staple_field *)s1, (staple_field *)s2), \
324 suNf_spinor *: ({ _spinor_minus_f(*(suNf_spinor *)s1, *(suNf_spinor *)s2); }), \
325 suNf_spinor_flt *: ({ _spinor_minus_f(*(suNf_spinor_flt *)s1, *(suNf_spinor_flt *)s2); }), \
326 __minus_suNfc(s1, s2) suNf *: ({ _suNf_minus(*(suNf *)s1, *(suNf *)s2); }), \
327 suNg *: ({ _suNg_minus(*(suNg *)s1, *(suNg *)s2); }), \
328 suNf_flt *: ({ _suNf_minus(*(suNf_flt *)s1, *(suNf_flt *)s2); }), \
329 suNg_flt *: ({ _suNg_minus(*(suNg_flt *)s1, *(suNg_flt *)s2); }), \
330 suNf_vector *: ({ _vector_minus_f(*(suNf_vector *)s1, *(suNf_vector *)s2); }), \
331 suNg_vector *: ({ _vector_minus_g(*(suNg_vector *)s1, *(suNg_vector *)s2); }), \
332 suNg_algebra_vector *: ({ _algebra_vector_mul_g(*(suNg_algebra_vector *)s1, -1.0, *(suNg_algebra_vector *)s2); }), \
333 double *: ({ (*(double *)s1) = -(*(double *)s2); }), \
334 float *: ({ (*(double *)s1) = -(*(double *)s2); }))
337#define __add_assign_suNfc(s1, s2) suNfc * : ({ _suNfc_add_assign(*(suNfc *)s1, *(suNfc *)s2); }),
339#define __add_assign_suNfc(s1, s2)
342#define add_assign(s1, s2) \
344 spinor_field *: add_assign_spinor_field((spinor_field *)s1, (spinor_field *)s2), \
345 spinor_field_flt *: add_assign_spinor_field_flt((spinor_field_flt *)s1, (spinor_field_flt *)s2), \
346 scalar_field *: add_assign_scalar_field((scalar_field *)s1, (scalar_field *)s2), \
347 suNg_field *: add_assign_suNg_field((suNg_field *)s1, (suNg_field *)s2), \
348 suNf_field *: add_assign_suNf_field((suNf_field *)s1, (suNf_field *)s2), \
349 suNfc_field *: add_assign_suNfc_field((suNfc_field *)s1, (suNfc_field *)s2), \
350 suNg_field_flt *: add_assign_suNg_field_flt((suNg_field_flt *)s1, (suNg_field_flt *)s2), \
351 suNf_field_flt *: add_assign_suNf_field_flt((suNf_field_flt *)s1, (suNf_field_flt *)s2), \
352 suNg_scalar_field *: add_assign_suNg_scalar_field((suNg_scalar_field *)s1, (suNg_scalar_field *)s2), \
353 suNg_av_field *: add_assign_suNg_av_field((suNg_av_field *)s1, (suNg_av_field *)s2), \
354 gtransf *: add_assign_gtransf((gtransf *)s1, (gtransf *)s2), \
355 clover_term *: add_assign_clover_term((clover_term *)s1, (clover_term *)s2), \
356 clover_force *: add_assign_clover_force((clover_force *)s1, (clover_force *)s2), \
357 staple_field *: add_assign_staple_field((staple_field *)s1, (staple_field *)s2), \
358 suNf_spinor *: ({ _spinor_add_assign_f(*(suNf_spinor *)s1, *(suNf_spinor *)s2); }), \
359 suNf_spinor_flt *: ({ _spinor_add_assign_f(*(suNf_spinor_flt *)s1, *(suNf_spinor_flt *)s2); }), \
360 __add_assign_suNfc(s1, s2) suNf *: ({ _suNf_add_assign(*(suNf *)s1, *(suNf *)s2); }), \
361 suNg *: ({ _suNg_add_assign(*(suNg *)s1, *(suNg *)s2); }), \
362 suNf_flt *: ({ _suNf_add_assign(*(suNf_flt *)s1, *(suNf_flt *)s2); }), \
363 suNg_flt *: ({ _suNg_add_assign(*(suNg_flt *)s1, *(suNg_flt *)s2); }), \
364 suNf_vector *: ({ _vector_add_assign_f(*(suNf_vector *)s1, *(suNf_vector *)s2); }), \
365 suNg_vector *: ({ _vector_add_assign_g(*(suNg_vector *)s1, *(suNg_vector *)s2); }), \
366 suNg_algebra_vector *: ({ _algebra_vector_add_assign_g(*(suNg_algebra_vector *)s1, *(suNg_algebra_vector *)s2); }), \
367 double *: ({ (*(double *)s1) += (*(double *)s2); }), \
368 float *: ({ (*(double *)s1) += (*(double *)s2); }))
370double spinor_prod_re_f(suNf_spinor *r, suNf_spinor *s);
371double spinor_prod_re_f_flt(suNf_spinor_flt *r, suNf_spinor_flt *s);
372double suNg_prod_re(suNg *u, suNg *v);
373double suNf_prod_re(suNf *u, suNf *v);
374double suNg_flt_prod_re(suNg_flt *u, suNg_flt *v);
375double suNf_flt_prod_re(suNf_flt *u, suNf_flt *v);
376double suNgc_prod_re(suNgc *u, suNgc *v);
377double suNfc_prod_re(suNfc *u, suNfc *v);
378double suNf_vector_prod_re(suNf_vector *r, suNf_vector *s);
379double suNg_vector_prod_re(suNg_vector *r, suNg_vector *s);
380double suNg_algebra_vector_prod_re(suNg_algebra_vector *r, suNg_algebra_vector *s);
383#define __prod_re_suNfc(s1, s2) suNfc * : suNfc_prod_re((suNfc *)s1, (suNfc *)s2),
385#define __prod_re_suNfc(s1, s2)
388#define prod_re(s1, s2) \
390 spinor_field *: prod_re_spinor_field((spinor_field *)s1, (spinor_field *)s2), \
391 spinor_field_flt *: prod_re_spinor_field_flt((spinor_field_flt *)s1, (spinor_field_flt *)s2), \
392 scalar_field *: prod_re_scalar_field((scalar_field *)s1, (scalar_field *)s2), \
393 suNg_field *: prod_re_suNg_field((suNg_field *)s1, (suNg_field *)s2), \
394 suNf_field *: prod_re_suNf_field((suNf_field *)s1, (suNf_field *)s2), \
395 suNfc_field *: prod_re_suNfc_field((suNfc_field *)s1, (suNfc_field *)s2), \
396 suNg_field_flt *: prod_re_suNg_field_flt((suNg_field_flt *)s1, (suNg_field_flt *)s2), \
397 suNf_field_flt *: prod_re_suNf_field_flt((suNf_field_flt *)s1, (suNf_field_flt *)s2), \
398 suNg_scalar_field *: prod_re_suNg_scalar_field((suNg_scalar_field *)s1, (suNg_scalar_field *)s2), \
399 suNg_av_field *: prod_re_suNg_av_field((suNg_av_field *)s1, (suNg_av_field *)s2), \
400 gtransf *: prod_re_gtransf((gtransf *)s1, (gtransf *)s2), \
401 clover_term *: prod_re_clover_term((clover_term *)s1, (clover_term *)s2), \
402 clover_force *: prod_re_clover_force((clover_force *)s1, (clover_force *)s2), \
403 staple_field *: prod_re_staple_field((staple_field *)s1, (staple_field *)s2), \
404 suNf_spinor *: spinor_prod_re_f((suNf_spinor *)s1, (suNf_spinor *)s2), \
405 suNf_spinor_flt *: spinor_prod_re_f_flt((suNf_spinor_flt *)s1, (suNf_spinor_flt *)s2), \
406 __prod_re_suNfc(s1, s2) suNf *: suNf_prod_re((suNf *)s1, (suNf *)s2), \
407 suNg *: suNg_prod_re((suNg *)s1, (suNg *)s2), \
408 suNf_flt *: suNf_flt_prod_re((suNf_flt *)s1, (suNf_flt *)s2), \
409 suNg_flt *: suNg_flt_prod_re((suNg_flt *)s1, (suNg_flt *)s2), \
410 suNf_vector *: suNf_vector_prod_re((suNf_vector *)s1, (suNf_vector *)s2), \
411 suNg_vector *: suNg_vector_prod_re((suNg_vector *)s1, (suNg_vector *)s2), \
412 suNg_algebra_vector *: suNg_algebra_vector_prod_re((suNg_algebra_vector *)s1, (suNg_algebra_vector *)s2), \
413 double *: ({ (*(double *)s1) * (*(double *)s2); }), \
414 float *: ({ (*(float *)s1) * (*(float *)s2); }))
416double spinor_prod_im_f(suNf_spinor *r, suNf_spinor *s);
417double spinor_prod_im_f_flt(suNf_spinor_flt *r, suNf_spinor_flt *s);
418double suNg_prod_im(suNg *u, suNg *v);
419double suNf_prod_im(suNf *u, suNf *v);
420double suNg_flt_prod_im(suNg_flt *u, suNg_flt *v);
421double suNf_flt_prod_im(suNf_flt *u, suNf_flt *v);
422double suNgc_prod_im(suNgc *u, suNgc *v);
423double suNfc_prod_im(suNfc *u, suNfc *v);
424double suNf_vector_prod_im(suNf_vector *r, suNf_vector *s);
425double suNg_vector_prod_im(suNg_vector *r, suNg_vector *s);
426double suNg_algebra_vector_prod_im(suNg_algebra_vector *r, suNg_algebra_vector *s);
429#define __prod_im_suNfc(s1, s2) suNfc * : suNfc_prod_im((suNfc *)s1, (suNfc *)s2),
431#define __prod_im_suNfc(s1, s2)
434#define prod_im(s1, s2) \
436 spinor_field *: prod_im_spinor_field((spinor_field *)s1, (spinor_field *)s2), \
437 spinor_field_flt *: prod_im_spinor_field_flt((spinor_field_flt *)s1, (spinor_field_flt *)s2), \
438 scalar_field *: prod_im_scalar_field((scalar_field *)s1, (scalar_field *)s2), \
439 suNg_field *: prod_im_suNg_field((suNg_field *)s1, (suNg_field *)s2), \
440 suNf_field *: prod_im_suNf_field((suNf_field *)s1, (suNf_field *)s2), \
441 suNfc_field *: prod_im_suNfc_field((suNfc_field *)s1, (suNfc_field *)s2), \
442 suNg_field_flt *: prod_im_suNg_field_flt((suNg_field_flt *)s1, (suNg_field_flt *)s2), \
443 suNf_field_flt *: prod_im_suNf_field_flt((suNf_field_flt *)s1, (suNf_field_flt *)s2), \
444 suNg_scalar_field *: prod_im_suNg_scalar_field((suNg_scalar_field *)s1, (suNg_scalar_field *)s2), \
445 suNg_av_field *: prod_im_suNg_av_field((suNg_av_field *)s1, (suNg_av_field *)s2), \
446 gtransf *: prod_im_gtransf((gtransf *)s1, (gtransf *)s2), \
447 clover_term *: prod_im_clover_term((clover_term *)s1, (clover_term *)s2), \
448 clover_force *: prod_im_clover_force((clover_force *)s1, (clover_force *)s2), \
449 staple_field *: prod_im_staple_field((staple_field *)s1, (staple_field *)s2), \
450 suNf_spinor *: spinor_prod_im_f((suNf_spinor *)s1, (suNf_spinor *)s2), \
451 suNf_spinor_flt *: spinor_prod_im_f_flt((suNf_spinor_flt *)s1, (suNf_spinor_flt *)s2), \
452 __prod_im_suNfc(s1, s2) suNf *: suNf_prod_re((suNf *)s1, (suNf *)s2), \
453 suNg *: suNg_prod_re((suNg *)s1, (suNg *)s2), \
454 suNf_flt *: suNf_flt_prod_re((suNf_flt *)s1, (suNf_flt *)s2), \
455 suNg_flt *: suNg_flt_prod_re((suNg_flt *)s1, (suNg_flt *)s2), \
456 suNf_vector *: suNf_vector_prod_im((suNf_vector *)s1, (suNf_vector *)s2), \
457 suNg_vector *: suNg_vector_prod_im((suNg_vector *)s1, (suNg_vector *)s2), \
458 suNg_algebra_vector *: suNg_algebra_vector_prod_im((suNg_algebra_vector *)s1, (suNg_algebra_vector *)s2), \
459 double *: ({ 0.0; }), \
462hr_complex spinor_prod_f(suNf_spinor *r, suNf_spinor *s);
463hr_complex spinor_prod_f_flt(suNf_spinor_flt *r, suNf_spinor_flt *s);
464hr_complex suNg_prod(suNg *u, suNg *v);
465hr_complex suNf_prod(suNf *u, suNf *v);
466hr_complex suNg_flt_prod(suNg_flt *u, suNg_flt *v);
467hr_complex suNf_flt_prod(suNf_flt *u, suNf_flt *v);
468hr_complex suNgc_prod(suNgc *u, suNgc *v);
469hr_complex suNfc_prod(suNfc *u, suNfc *v);
470hr_complex suNf_vector_prod(suNf_vector *r, suNf_vector *s);
471hr_complex suNg_vector_prod(suNg_vector *r, suNg_vector *s);
472hr_complex suNg_algebra_vector_prod(suNg_algebra_vector *r, suNg_algebra_vector *s);
475#define __prod_suNfc(s1, s2) suNfc * : suNfc_prod_re((suNfc *)s1, (suNfc *)s2),
477#define __prod_suNfc(s1, s2)
480#define prod(s1, s2) \
482 spinor_field *: prod_spinor_field((spinor_field *)s1, (spinor_field *)s2), \
483 spinor_field_flt *: ({ \
484 prod_re_spinor_field_flt((spinor_field_flt *)s1, (spinor_field_flt *)s2) + \
485 I *prod_im_spinor_field_flt((spinor_field_flt *)s1, (spinor_field_flt *)s2); \
487 scalar_field *: prod_scalar_field((scalar_field *)s1, (scalar_field *)s2), \
488 suNg_field *: prod_suNg_field((suNg_field *)s1, (suNg_field *)s2), \
489 suNf_field *: prod_suNf_field((suNf_field *)s1, (suNf_field *)s2), \
490 suNfc_field *: prod_suNfc_field((suNfc_field *)s1, (suNfc_field *)s2), \
491 suNg_field_flt *: prod_suNg_field_flt((suNg_field_flt *)s1, (suNg_field_flt *)s2), \
492 suNf_field_flt *: prod_suNf_field_flt((suNf_field_flt *)s1, (suNf_field_flt *)s2), \
493 suNg_scalar_field *: prod_suNg_scalar_field((suNg_scalar_field *)s1, (suNg_scalar_field *)s2), \
494 suNg_av_field *: prod_suNg_av_field((suNg_av_field *)s1, (suNg_av_field *)s2), \
495 gtransf *: prod_gtransf((gtransf *)s1, (gtransf *)s2), \
496 clover_term *: prod_clover_term((clover_term *)s1, (clover_term *)s2), \
497 clover_force *: prod_clover_force((clover_force *)s1, (clover_force *)s2), \
498 staple_field *: prod_staple_field((staple_field *)s1, (staple_field *)s2), \
499 suNf_spinor *: spinor_prod_f((suNf_spinor *)s1, (suNf_spinor *)s2), \
500 suNf_spinor_flt *: spinor_prod_f_flt((suNf_spinor_flt *)s1, (suNf_spinor_flt *)s2), \
501 __prod_suNfc(s1, s2) suNf *: suNf_prod((suNf *)s1, (suNf *)s2), \
502 suNg *: suNg_prod((suNg *)s1, (suNg *)s2), \
503 suNf_flt *: suNf_flt_prod((suNf_flt *)s1, (suNf_flt *)s2), \
504 suNg_flt *: suNg_flt_prod((suNg_flt *)s1, (suNg_flt *)s2), \
505 suNf_vector *: suNf_vector_prod((suNf_vector *)s1, (suNf_vector *)s2), \
506 suNg_vector *: suNg_vector_prod((suNg_vector *)s1, (suNg_vector *)s2), \
507 suNg_algebra_vector *: suNg_algebra_vector_prod((suNg_algebra_vector *)s1, (suNg_algebra_vector *)s2), \
508 double *: ({ (*(double *)s1) * (*(double *)s2); }), \
509 float *: ({ (*(float *)s1) * (*(float *)s2); }))
511double spinor_sqnorm_f(suNf_spinor *r);
512double spinor_sqnorm_f_flt(suNf_spinor_flt *r);
513double suNg_sqnorm(suNg *u);
514double suNf_sqnorm(suNf *u);
515double suNg_flt_sqnorm(suNg_flt *u);
516double suNf_flt_sqnorm(suNf_flt *u);
517double suNgc_sqnorm(suNgc *u);
518double suNfc_sqnorm(suNfc *u);
519double suNf_vector_sqnorm(suNf_vector *r);
520double suNg_vector_sqnorm(suNg_vector *r);
521double suNg_algebra_vector_sqnorm(suNg_algebra_vector *r);
524#define __sqnorm_suNfc(s1) suNfc * : suNfc_sqnorm((suNfc *)s1),
526#define __sqnorm_suNfc(s1)
531 spinor_field *: sqnorm_spinor_field((spinor_field *)s1), \
532 spinor_field_flt *: sqnorm_spinor_field_flt((spinor_field_flt *)s1), \
533 scalar_field *: sqnorm_scalar_field((scalar_field *)s1), \
534 suNg_field *: sqnorm_suNg_field((suNg_field *)s1), \
535 suNf_field *: sqnorm_suNf_field((suNf_field *)s1), \
536 suNfc_field *: sqnorm_suNfc_field((suNfc_field *)s1), \
537 suNg_field_flt *: sqnorm_suNg_field_flt((suNg_field_flt *)s1), \
538 suNf_field_flt *: sqnorm_suNf_field_flt((suNf_field_flt *)s1), \
539 suNg_scalar_field *: sqnorm_suNg_scalar_field((suNg_scalar_field *)s1), \
540 suNg_av_field *: sqnorm_suNg_av_field((suNg_av_field *)s1), \
541 gtransf *: sqnorm_gtransf((gtransf *)s1), \
542 clover_term *: sqnorm_clover_term((clover_term *)s1), \
543 clover_force *: sqnorm_clover_force((clover_force *)s1), \
544 staple_field *: sqnorm_staple_field((staple_field *)s1), \
545 suNf_spinor *: spinor_sqnorm_f((suNf_spinor *)s1), \
546 suNf_spinor_flt *: spinor_sqnorm_f_flt((suNf_spinor_flt *)s1), \
547 __sqnorm_suNfc(s1) suNf *: suNf_sqnorm((suNf *)s1), \
548 suNg *: suNg_sqnorm((suNg *)s1), \
549 suNf_flt *: suNf_flt_sqnorm((suNf_flt *)s1), \
550 suNg_flt *: suNg_flt_sqnorm((suNg_flt *)s1), \
551 suNf_vector *: suNf_vector_sqnorm((suNf_vector *)s1), \
552 suNg_vector *: suNg_vector_sqnorm((suNg_vector *)s1), \
553 suNg_algebra_vector *: suNg_algebra_vector_sqnorm((suNg_algebra_vector *)s1), \
554 double *: ({ (*(double *)s1) * (*(double *)s1); }), \
555 float *: ({ (*(float *)s1) * (*(float *)s1); }))
557double spinor_max_f(suNf_spinor *r);
558double spinor_max_f_flt(suNf_spinor_flt *r);
559double suNg_max(suNg *r);
560double suNf_max(suNf *r);
561double suNg_flt_max(suNg_flt *r);
562double suNf_flt_max(suNf_flt *r);
563double suNgc_max(suNgc *r);
564double suNfc_max(suNfc *r);
565double suNf_vector_max(suNf_vector *r);
566double suNg_vector_max(suNg_vector *r);
567double suNg_algebra_vector_max(suNg_algebra_vector *r);
570#define __max_suNfc(s1) suNfc * : suNfc_max((suNfc *)s1),
572#define __max_suNfc(s1)
577 spinor_field *: max_spinor_field((spinor_field *)s1), \
578 spinor_field_flt *: max_spinor_field_flt((spinor_field_flt *)s1), \
579 scalar_field *: max_scalar_field((scalar_field *)s1), \
580 suNg_field *: max_suNg_field((suNg_field *)s1), \
581 suNf_field *: max_suNf_field((suNf_field *)s1), \
582 suNfc_field *: max_suNfc_field((suNfc_field *)s1), \
583 suNg_field_flt *: max_suNg_field_flt((suNg_field_flt *)s1), \
584 suNf_field_flt *: max_suNf_field_flt((suNf_field_flt *)s1), \
585 suNg_scalar_field *: max_suNg_scalar_field((suNg_scalar_field *)s1), \
586 suNg_av_field *: max_suNg_av_field((suNg_av_field *)s1), \
587 gtransf *: max_gtransf((gtransf *)s1), \
588 clover_term *: max_clover_term((clover_term *)s1), \
589 clover_force *: max_clover_force((clover_force *)s1), \
590 staple_field *: max_staple_field((staple_field *)s1), \
591 suNf_spinor *: spinor_max_f((suNf_spinor *)s1), \
592 suNf_spinor_flt *: spinor_max_f_flt((suNf_spinor_flt *)s1), \
593 __max_suNfc(s1) suNf *: suNf_max((suNf *)s1), \
594 suNg *: suNg_max((suNg *)s1), \
595 suNf_flt *: suNf_flt_max((suNf_flt *)s1), \
596 suNg_flt *: suNg_flt_max((suNg_flt *)s1), \
597 suNf_vector *: suNf_vector_max((suNf_vector *)s1), \
598 suNg_vector *: suNg_vector_max((suNg_vector *)s1), \
599 suNg_algebra_vector *: suNg_algebra_vector_max((suNg_algebra_vector *)s1), \
600 double *: ({ (*(double *)s1) > (*(double *)s1) ? (*(double *)s1) : (*(double *)s1); }), \
601 float *: ({ (*(float *)s1) > (*(float *)s1) ? (*(float *)s1) : (*(float *)s1); }))
604#define __zero_suNfc(s1) suNfc * : ({ _suNfc_zero(*(suNfc *)s1); }),
606#define __zero_suNfc(s1)
611 spinor_field *: zero_spinor_field((spinor_field *)s1), \
612 spinor_field_flt *: zero_spinor_field_flt((spinor_field_flt *)s1), \
613 scalar_field *: zero_scalar_field((scalar_field *)s1), \
614 suNg_field *: zero_suNg_field((suNg_field *)s1), \
615 suNf_field *: zero_suNf_field((suNf_field *)s1), \
616 suNfc_field *: zero_suNfc_field((suNfc_field *)s1), \
617 suNg_field_flt *: zero_suNg_field_flt((suNg_field_flt *)s1), \
618 suNf_field_flt *: zero_suNf_field_flt((suNf_field_flt *)s1), \
619 suNg_scalar_field *: zero_suNg_scalar_field((suNg_scalar_field *)s1), \
620 suNg_av_field *: zero_suNg_av_field((suNg_av_field *)s1), \
621 gtransf *: zero_gtransf((gtransf *)s1), \
622 clover_term *: zero_clover_term((clover_term *)s1), \
623 clover_force *: zero_clover_force((clover_force *)s1), \
624 staple_field *: zero_staple_field((staple_field *)s1), \
625 suNf_spinor *: ({ _spinor_zero_f(*(suNf_spinor *)s1); }), \
626 suNf_spinor_flt *: ({ _spinor_zero_f(*(suNf_spinor_flt *)s1); }), \
627 __zero_suNfc(s1) suNf *: ({ _suNf_zero(*(suNf *)s1); }), \
628 suNg *: ({ _suNg_zero(*(suNg *)s1); }), \
629 suNf_flt *: ({ _suNf_zero(*(suNf_flt *)s1); }), \
630 suNg_flt *: ({ _suNg_zero(*(suNg_flt *)s1); }), \
631 suNf_vector *: ({ _vector_zero_f(*(suNf_vector *)s1); }), \
632 suNg_vector *: ({ _vector_zero_g(*(suNg_vector *)s1); }), \
633 suNg_algebra_vector *: ({ _algebra_vector_zero_g(*(suNg_algebra_vector *)s1); }), \
634 double *: ({ *(double *)s1 = 0.0; }), \
635 float *: ({ *(float *)s1 = 0.0f; }), \
636 ldl_t *: ({ memset(s1, 0, sizeof(ldl_t)); }))
638#define copy(s1, s2) \
640 spinor_field *: copy_spinor_field((spinor_field *)s1, (spinor_field *)s2), \
641 spinor_field_flt *: copy_spinor_field_flt((spinor_field_flt *)s1, (spinor_field_flt *)s2), \
642 scalar_field *: copy_scalar_field((scalar_field *)s1, (scalar_field *)s2), \
643 suNg_field *: copy_suNg_field((suNg_field *)s1, (suNg_field *)s2), \
644 suNf_field *: copy_suNf_field((suNf_field *)s1, (suNf_field *)s2), \
645 suNfc_field *: copy_suNfc_field((suNfc_field *)s1, (suNfc_field *)s2), \
646 suNg_field_flt *: copy_suNg_field_flt((suNg_field_flt *)s1, (suNg_field_flt *)s2), \
647 suNf_field_flt *: copy_suNf_field_flt((suNf_field_flt *)s1, (suNf_field_flt *)s2), \
648 suNg_scalar_field *: copy_suNg_scalar_field((suNg_scalar_field *)s1, (suNg_scalar_field *)s2), \
649 suNg_av_field *: copy_suNg_av_field((suNg_av_field *)s1, (suNg_av_field *)s2), \
650 gtransf *: copy_gtransf((gtransf *)s1, (gtransf *)s2), \
651 clover_term *: copy_clover_term((clover_term *)s1, (clover_term *)s2), \
652 clover_force *: copy_clover_force((clover_force *)s1, (clover_force *)s2), \
653 staple_field *: copy_staple_field((staple_field *)s1, (staple_field *)s2))
655double spinor_g5_prod_re_f(suNf_spinor *r, suNf_spinor *s);
656double spinor_g5_prod_re_f_flt(suNf_spinor_flt *r, suNf_spinor_flt *s);
658#define g5_prod_re(s1, s2) \
660 spinor_field *: g5_prod_re_spinor_field((spinor_field *)s1, (spinor_field *)s2), \
661 spinor_field_flt *: g5_prod_re_spinor_field_flt((spinor_field_flt *)s1, (spinor_field_flt *)s2), \
662 suNf_spinor *: spinor_g5_prod_re_f((suNf_spinor *)s1, (suNf_spinor *)s2), \
663 suNf_spinor_flt *: spinor_g5_prod_re_f_flt((suNf_spinor_flt *)s1, (suNf_spinor_flt *)s2))
665double spinor_g5_prod_im_f(suNf_spinor *r, suNf_spinor *s);
666double spinor_g5_prod_im_f_flt(suNf_spinor_flt *r, suNf_spinor_flt *s);
668#define g5_prod_im(s1, s2) \
670 spinor_field *: g5_prod_im_spinor_field((spinor_field *)s1, (spinor_field *)s2), \
671 spinor_field_flt *: g5_prod_im_spinor_field_flt((spinor_field_flt *)s1, (spinor_field_flt *)s2), \
672 suNf_spinor *: spinor_g5_prod_im_f((suNf_spinor *)s1, (suNf_spinor *)s2), \
673 suNf_spinor_flt *: spinor_g5_prod_im_f_flt((suNf_spinor_flt *)s1, (suNf_spinor_flt *)s2))
677 spinor_field *: g5_spinor_field((spinor_field *)s1, (spinor_field *)s2), \
678 spinor_field_flt *: g5_spinor_field_flt((spinor_field_flt *)s1, (spinor_field_flt *)s2), \
679 suNf_spinor *: ({ _spinor_g5_f(*(suNf_spinor *)s1, *(suNf_spinor *)s2); }), \
680 suNf_spinor_flt *: ({ _spinor_g5_f(*(suNf_spinor_flt *)s1, *(suNf_spinor_flt *)s2); }))
682#define g5_assign(s1) \
684 spinor_field *: g5_assign_spinor_field((spinor_field *)s1), \
685 spinor_field_flt *: g5_assign_spinor_field_flt((spinor_field_flt *)s1), \
686 suNf_spinor *: ({ _spinor_g5_assign_f(*(suNf_spinor *)s1); }), \
687 suNf_spinor_flt *: ({ _spinor_g5_assign_f(*(suNf_spinor_flt *)s1); }))
691 spinor_field *: g0_spinor_field((spinor_field *)s1, (spinor_field *)s2), \
692 spinor_field_flt *: g0_spinor_field_flt((spinor_field_flt *)s1, (spinor_field_flt *)s2), \
693 suNf_spinor *: ({ _spinor_g0_f(*(suNf_spinor *)s1, *(suNf_spinor *)s2); }), \
694 suNf_spinor_flt *: ({ _spinor_g0_f(*(suNf_spinor_flt *)s1, *(suNf_spinor_flt *)s2); }))
698 spinor_field *: g1_spinor_field((spinor_field *)s1, (spinor_field *)s2), \
699 spinor_field_flt *: g1_spinor_field_flt((spinor_field_flt *)s1, (spinor_field_flt *)s2), \
700 suNf_spinor *: ({ _spinor_g1_f(*(suNf_spinor *)s1, *(suNf_spinor *)s2); }), \
701 suNf_spinor_flt *: ({ _spinor_g1_f(*(suNf_spinor_flt *)s1, *(suNf_spinor_flt *)s2); }))
705 spinor_field *: g2_spinor_field((spinor_field *)s1, (spinor_field *)s2), \
706 spinor_field_flt *: g2_spinor_field_flt((spinor_field_flt *)s1, (spinor_field_flt *)s2), \
707 suNf_spinor *: ({ _spinor_g2_f(*(suNf_spinor *)s1, *(suNf_spinor *)s2); }), \
708 suNf_spinor_flt *: ({ _spinor_g2_f(*(suNf_spinor_flt *)s1, *(suNf_spinor_flt *)s2); }))
712 spinor_field *: g3_spinor_field((spinor_field *)s1, (spinor_field *)s2), \
713 spinor_field_flt *: g3_spinor_field_flt((spinor_field_flt *)s1, (spinor_field_flt *)s2), \
714 suNf_spinor *: ({ _spinor_g3_f(*(suNf_spinor *)s1, *(suNf_spinor *)s2); }), \
715 suNf_spinor_flt *: ({ _spinor_g3_f(*(suNf_spinor_flt *)s1, *(suNf_spinor_flt *)s2); }))
717#define lc(r, k1, s1, k2, s2) \
719 spinor_field *: lc_spinor_field((spinor_field *)r, k1, (spinor_field *)s1, k2, (spinor_field *)s2), \
720 spinor_field_flt *: lc_spinor_field_flt((spinor_field_flt *)r, k1, (spinor_field_flt *)s1, k2, \
721 (spinor_field_flt *)s2), \
722 suNf_spinor *: ({ _spinor_lc_f(*(suNf_spinor *)r, k1, *(suNf_spinor *)s1, k2, *(suNf_spinor *)s2); }), \
723 suNf_spinor_flt *: ({ _spinor_lc_f(*(suNf_spinor_flt *)r, k1, *(suNf_spinor_flt *)s1, k2, *(suNf_spinor_flt *)s2); }))
725#define lc_add_assign(r, k1, s1, k2, s2) \
727 spinor_field *: lc_add_assign_spinor_field((spinor_field *)r, k1, (spinor_field *)s1, k2, (spinor_field *)s2), \
728 spinor_field_flt *: lc_add_assign_spinor_field_flt((spinor_field_flt *)r, k1, (spinor_field_flt *)s1, k2, \
729 (spinor_field_flt *)s2), \
730 suNf_spinor *: ({ _spinor_lc_add_assign_f(*(suNf_spinor *)r, k1, *(suNf_spinor *)s1, k2, *(suNf_spinor *)s2); }), \
731 suNf_spinor_flt *: ({ \
732 _spinor_lc_add_assign_f(*(suNf_spinor_flt *)r, k1, *(suNf_spinor_flt *)s1, k2, *(suNf_spinor_flt *)s2); \
735#define clc(r, k1, s1, k2, s2) \
737 spinor_field *: clc_spinor_field((spinor_field *)r, k1, (spinor_field *)s1, k2, (spinor_field *)s2), \
738 spinor_field_flt *: clc_spinor_field_flt((spinor_field_flt *)r, k1, (spinor_field_flt *)s1, k2, \
739 (spinor_field_flt *)s2), \
740 suNf_spinor *: ({ _spinor_clc_f(*(suNf_spinor *)r, k1, *(suNf_spinor *)s1, k2, *(suNf_spinor *)s2); }), \
741 suNf_spinor_flt *: ({ \
742 _spinor_clc_f(*(suNf_spinor_flt *)r, k1, *(suNf_spinor_flt *)s1, k2, *(suNf_spinor_flt *)s2); \
745#define clc_add_assign(r, k1, s1, k2, s2) \
747 spinor_field *: clc_add_assign_spinor_field((spinor_field *)r, k1, (spinor_field *)s1, k2, (spinor_field *)s2), \
748 spinor_field_flt *: clc_add_assign_spinor_field_flt((spinor_field_flt *)r, k1, (spinor_field_flt *)s1, k2, \
749 (spinor_field_flt *)s2), \
750 suNf_spinor *: ({ _spinor_clc_add_assign_f(*(suNf_spinor *)r, k1, *(suNf_spinor *)s1, k2, *(suNf_spinor *)s2); }), \
751 suNf_spinor_flt *: ({ \
752 _spinor_clc_add_assign_f(*(suNf_spinor_flt *)r, k1, *(suNf_spinor_flt *)s1, k2, *(suNf_spinor_flt *)s2); \
757#define mul_add_assign_cpu(s1, rho, s2) \
759 spinor_field *: mul_add_assign_spinor_field_cpu((spinor_field *)s1, rho, (spinor_field *)s2), \
760 spinor_field_flt *: mul_add_assign_spinor_field_flt_cpu((spinor_field_flt *)s1, rho, (spinor_field_flt *)s2), \
761 scalar_field *: mul_add_assign_scalar_field_cpu((scalar_field *)s1, rho, (scalar_field *)s2), \
762 suNg_field *: mul_add_assign_suNg_field_cpu((suNg_field *)s1, rho, (suNg_field *)s2), \
763 suNf_field *: mul_add_assign_suNf_field_cpu((suNf_field *)s1, rho, (suNf_field *)s2), \
764 suNfc_field *: mul_add_assign_suNfc_field_cpu((suNfc_field *)s1, rho, (suNfc_field *)s2), \
765 suNg_field_flt *: mul_add_assign_suNg_field_flt_cpu((suNg_field_flt *)s1, rho, (suNg_field_flt *)s2), \
766 suNf_field_flt *: mul_add_assign_suNf_field_flt_cpu((suNf_field_flt *)s1, rho, (suNf_field_flt *)s2), \
767 suNg_scalar_field *: mul_add_assign_suNg_scalar_field_cpu((suNg_scalar_field *)s1, rho, (suNg_scalar_field *)s2), \
768 suNg_av_field *: mul_add_assign_suNg_av_field_cpu((suNg_av_field *)s1, rho, (suNg_av_field *)s2), \
769 gtransf *: mul_add_assign_gtransf_cpu((gtransf *)s1, rho, (gtransf *)s2), \
770 clover_term *: mul_add_assign_clover_term_cpu((clover_term *)s1, rho, (clover_term *)s2), \
771 clover_force *: mul_add_assign_clover_force_cpu((clover_force *)s1, rho, (clover_force *)s2), \
772 staple_field *: mul_add_assign_staple_field_cpu((staple_field *)s1, rho, (staple_field *)s2))
774#define mulc_add_assign_cpu(s1, rho, s2) \
776 spinor_field *: mulc_add_assign_spinor_field_cpu((spinor_field *)s1, rho, (spinor_field *)s2), \
777 spinor_field_flt *: mulc_add_assign_spinor_field_flt_cpu((spinor_field_flt *)s1, rho, (spinor_field_flt *)s2), \
778 scalar_field *: mulc_add_assign_scalar_field_cpu((scalar_field *)s1, rho, (scalar_field *)s2), \
779 suNg_field *: mulc_add_assign_suNg_field_cpu((suNg_field *)s1, rho, (suNg_field *)s2), \
780 suNf_field *: mulc_add_assign_suNf_field_cpu((suNf_field *)s1, rho, (suNf_field *)s2), \
781 suNfc_field *: mulc_add_assign_suNfc_field_cpu((suNfc_field *)s1, rho, (suNfc_field *)s2), \
782 suNg_field_flt *: mulc_add_assign_suNg_field_flt_cpu((suNg_field_flt *)s1, rho, (suNg_field_flt *)s2), \
783 suNf_field_flt *: mulc_add_assign_suNf_field_flt_cpu((suNf_field_flt *)s1, rho, (suNf_field_flt *)s2), \
784 suNg_scalar_field *: mulc_add_assign_suNg_scalar_field_cpu((suNg_scalar_field *)s1, rho, (suNg_scalar_field *)s2), \
785 suNg_av_field *: mulc_add_assign_suNg_av_field_cpu((suNg_av_field *)s1, rho, (suNg_av_field *)s2), \
786 gtransf *: mulc_add_assign_gtransf_cpu((gtransf *)s1, rho, (gtransf *)s2), \
787 clover_term *: mulc_add_assign_clover_term_cpu((clover_term *)s1, rho, (clover_term *)s2), \
788 clover_force *: mulc_add_assign_clover_force_cpu((clover_force *)s1, rho, (clover_force *)s2), \
789 staple_field *: mulc_add_assign_staple_field_cpu((staple_field *)s1, rho, (staple_field *)s2))
791#define mul_cpu(s1, rho, s2) \
793 spinor_field *: mul_spinor_field_cpu((spinor_field *)s1, rho, (spinor_field *)s2), \
794 spinor_field_flt *: mul_spinor_field_flt_cpu((spinor_field_flt *)s1, rho, (spinor_field_flt *)s2), \
795 scalar_field *: mul_scalar_field_cpu((scalar_field *)s1, rho, (scalar_field *)s2), \
796 suNg_field *: mul_suNg_field_cpu((suNg_field *)s1, rho, (suNg_field *)s2), \
797 suNf_field *: mul_suNf_field_cpu((suNf_field *)s1, rho, (suNf_field *)s2), \
798 suNfc_field *: mul_suNfc_field_cpu((suNfc_field *)s1, rho, (suNfc_field *)s2), \
799 suNg_field_flt *: mul_suNg_field_flt_cpu((suNg_field_flt *)s1, rho, (suNg_field_flt *)s2), \
800 suNf_field_flt *: mul_suNf_field_flt_cpu((suNf_field_flt *)s1, rho, (suNf_field_flt *)s2), \
801 suNg_scalar_field *: mul_suNg_scalar_field_cpu((suNg_scalar_field *)s1, rho, (suNg_scalar_field *)s2), \
802 suNg_av_field *: mul_suNg_av_field_cpu((suNg_av_field *)s1, rho, (suNg_av_field *)s2), \
803 gtransf *: mul_gtransf_cpu((gtransf *)s1, rho, (gtransf *)s2), \
804 clover_term *: mul_clover_term_cpu((clover_term *)s1, rho, (clover_term *)s2), \
805 clover_force *: mul_clover_force_cpu((clover_force *)s1, rho, (clover_force *)s2), \
806 staple_field *: mul_staple_field_cpu((staple_field *)s1, rho, (staple_field *)s2))
808#define mulc_cpu(s1, rho, s2) \
810 spinor_field *: mulc_spinor_field_cpu((spinor_field *)s1, rho, (spinor_field *)s2), \
811 spinor_field_flt *: mulc_spinor_field_flt_cpu((spinor_field_flt *)s1, rho, (spinor_field_flt *)s2), \
812 scalar_field *: mulc_scalar_field_cpu((scalar_field *)s1, rho, (scalar_field *)s2), \
813 suNg_field *: mulc_suNg_field_cpu((suNg_field *)s1, rho, (suNg_field *)s2), \
814 suNf_field *: mulc_suNf_field_cpu((suNf_field *)s1, rho, (suNf_field *)s2), \
815 suNfc_field *: mulc_suNfc_field_cpu((suNfc_field *)s1, rho, (suNfc_field *)s2), \
816 suNg_field_flt *: mulc_suNg_field_flt_cpu((suNg_field_flt *)s1, rho, (suNg_field_flt *)s2), \
817 suNf_field_flt *: mulc_suNf_field_flt_cpu((suNf_field_flt *)s1, rho, (suNf_field_flt *)s2), \
818 suNg_scalar_field *: mulc_suNg_scalar_field_cpu((suNg_scalar_field *)s1, rho, (suNg_scalar_field *)s2), \
819 suNg_av_field *: mulc_suNg_av_field_cpu((suNg_av_field *)s1, rho, (suNg_av_field *)s2), \
820 gtransf *: mulc_gtransf_cpu((gtransf *)s1, rho, (gtransf *)s2), \
821 clover_term *: mulc_clover_term_cpu((clover_term *)s1, rho, (clover_term *)s2), \
822 clover_force *: mulc_clover_force_cpu((clover_force *)s1, rho, (clover_force *)s2), \
823 staple_field *: mulc_staple_field_cpu((staple_field *)s1, rho, (staple_field *)s2))
825#define add_cpu(r, s1, s2) \
827 spinor_field *: add_spinor_field_cpu((spinor_field *)r, (spinor_field *)s1, (spinor_field *)s2), \
828 spinor_field_flt *: add_spinor_field_flt_cpu((spinor_field_flt *)r, (spinor_field_flt *)s1, (spinor_field_flt *)s2), \
829 scalar_field *: add_scalar_field_cpu((scalar_field *)r, (scalar_field *)s1, (scalar_field *)s2), \
830 suNg_field *: add_suNg_field_cpu((suNg_field *)r, (suNg_field *)s1, (suNg_field *)s2), \
831 suNf_field *: add_suNf_field_cpu((suNf_field *)r, (suNf_field *)s1, (suNf_field *)s2), \
832 suNfc_field *: add_suNfc_field_cpu((suNfc_field *)r, (suNfc_field *)s1, (suNfc_field *)s2), \
833 suNg_field_flt *: add_suNg_field_flt_cpu((suNg_field_flt *)r, (suNg_field_flt *)s1, (suNg_field_flt *)s2), \
834 suNf_field_flt *: add_suNf_field_flt_cpu((suNf_field_flt *)r, (suNf_field_flt *)s1, (suNf_field_flt *)s2), \
835 suNg_scalar_field *: add_suNg_scalar_field_cpu((suNg_scalar_field *)r, (suNg_scalar_field *)s1, \
836 (suNg_scalar_field *)s2), \
837 suNg_av_field *: add_suNg_av_field_cpu((suNg_av_field *)r, (suNg_av_field *)s1, (suNg_av_field *)s2), \
838 gtransf *: add_gtransf_cpu((gtransf *)r, (gtransf *)s1, (gtransf *)s2), \
839 clover_term *: add_clover_term_cpu((clover_term *)r, (clover_term *)s1, (clover_term *)s2), \
840 clover_force *: add_clover_force_cpu((clover_force *)r, (clover_force *)s1, (clover_force *)s2), \
841 staple_field *: add_staple_field_cpu((staple_field *)r, (staple_field *)s1, (staple_field *)s2))
843#define sub_cpu(r, s1, s2) \
845 spinor_field *: sub_spinor_field_cpu((spinor_field *)r, (spinor_field *)s1, (spinor_field *)s2), \
846 spinor_field_flt *: sub_spinor_field_flt_cpu((spinor_field_flt *)r, (spinor_field_flt *)s1, (spinor_field_flt *)s2), \
847 scalar_field *: sub_scalar_field_cpu((scalar_field *)r, (scalar_field *)s1, (scalar_field *)s2), \
848 suNg_field *: sub_suNg_field_cpu((suNg_field *)r, (suNg_field *)s1, (suNg_field *)s2), \
849 suNf_field *: sub_suNf_field_cpu((suNf_field *)r, (suNf_field *)s1, (suNf_field *)s2), \
850 suNfc_field *: sub_suNfc_field_cpu((suNfc_field *)r, (suNfc_field *)s1, (suNfc_field *)s2), \
851 suNg_field_flt *: sub_suNg_field_flt_cpu((suNg_field_flt *)r, (suNg_field_flt *)s1, (suNg_field_flt *)s2), \
852 suNf_field_flt *: sub_suNf_field_flt_cpu((suNf_field_flt *)r, (suNf_field_flt *)s1, (suNf_field_flt *)s2), \
853 suNg_scalar_field *: sub_suNg_scalar_field_cpu((suNg_scalar_field *)r, (suNg_scalar_field *)s1, \
854 (suNg_scalar_field *)s2), \
855 suNg_av_field *: sub_suNg_av_field_cpu((suNg_av_field *)r, (suNg_av_field *)s1, (suNg_av_field *)s2), \
856 gtransf *: sub_gtransf_cpu((gtransf *)r, (gtransf *)s1, (gtransf *)s2), \
857 clover_term *: sub_clover_term_cpu((clover_term *)r, (clover_term *)s1, (clover_term *)s2), \
858 clover_force *: sub_clover_force_cpu((clover_force *)r, (clover_force *)s1, (clover_force *)s2), \
859 staple_field *: sub_staple_field_cpu((staple_field *)r, (staple_field *)s1, (staple_field *)s2))
861#define sub_assign_cpu(s1, s2) \
863 spinor_field *: sub_assign_spinor_field_cpu((spinor_field *)s1, (spinor_field *)s2), \
864 spinor_field_flt *: sub_assign_spinor_field_flt_cpu((spinor_field_flt *)s1, (spinor_field_flt *)s2), \
865 scalar_field *: sub_assign_scalar_field_cpu((scalar_field *)s1, (scalar_field *)s2), \
866 suNg_field *: sub_assign_suNg_field_cpu((suNg_field *)s1, (suNg_field *)s2), \
867 suNf_field *: sub_assign_suNf_field_cpu((suNf_field *)s1, (suNf_field *)s2), \
868 suNfc_field *: sub_assign_suNfc_field_cpu((suNfc_field *)s1, (suNfc_field *)s2), \
869 suNg_field_flt *: sub_assign_suNg_field_flt_cpu((suNg_field_flt *)s1, (suNg_field_flt *)s2), \
870 suNf_field_flt *: sub_assign_suNf_field_flt_cpu((suNf_field_flt *)s1, (suNf_field_flt *)s2), \
871 suNg_scalar_field *: sub_assign_suNg_scalar_field_cpu((suNg_scalar_field *)s1, (suNg_scalar_field *)s2), \
872 suNg_av_field *: sub_assign_suNg_av_field_cpu((suNg_av_field *)s1, (suNg_av_field *)s2), \
873 gtransf *: sub_assign_gtransf_cpu((gtransf *)s1, (gtransf *)s2), \
874 clover_term *: sub_assign_clover_term_cpu((clover_term *)s1, (clover_term *)s2), \
875 clover_force *: sub_assign_clover_force_cpu((clover_force *)s1, (clover_force *)s2), \
876 staple_field *: sub_assign_staple_field_cpu((staple_field *)s1, (staple_field *)s2))
878#define minus_cpu(s1, s2) \
880 spinor_field *: minus_spinor_field_cpu((spinor_field *)s1, (spinor_field *)s2), \
881 spinor_field_flt *: minus_spinor_field_flt_cpu((spinor_field_flt *)s1, (spinor_field_flt *)s2), \
882 scalar_field *: minus_scalar_field_cpu((scalar_field *)s1, (scalar_field *)s2), \
883 suNg_field *: minus_suNg_field_cpu((suNg_field *)s1, (suNg_field *)s2), \
884 suNf_field *: minus_suNf_field_cpu((suNf_field *)s1, (suNf_field *)s2), \
885 suNfc_field *: minus_suNfc_field_cpu((suNfc_field *)s1, (suNfc_field *)s2), \
886 suNg_field_flt *: minus_suNg_field_flt_cpu((suNg_field_flt *)s1, (suNg_field_flt *)s2), \
887 suNf_field_flt *: minus_suNf_field_flt_cpu((suNf_field_flt *)s1, (suNf_field_flt *)s2), \
888 suNg_scalar_field *: minus_suNg_scalar_field_cpu((suNg_scalar_field *)s1, (suNg_scalar_field *)s2), \
889 suNg_av_field *: minus_suNg_av_field_cpu((suNg_av_field *)s1, (suNg_av_field *)s2), \
890 gtransf *: minus_gtransf_cpu((gtransf *)s1, (gtransf *)s2), \
891 clover_term *: minus_clover_term_cpu((clover_term *)s1, (clover_term *)s2), \
892 clover_force *: minus_clover_force_cpu((clover_force *)s1, (clover_force *)s2), \
893 staple_field *: minus_staple_field_cpu((staple_field *)s1, (staple_field *)s2))
895#define add_assign_cpu(s1, s2) \
897 spinor_field *: add_assign_spinor_field_cpu((spinor_field *)s1, (spinor_field *)s2), \
898 spinor_field_flt *: add_assign_spinor_field_flt_cpu((spinor_field_flt *)s1, (spinor_field_flt *)s2), \
899 scalar_field *: add_assign_scalar_field_cpu((scalar_field *)s1, (scalar_field *)s2), \
900 suNg_field *: add_assign_suNg_field_cpu((suNg_field *)s1, (suNg_field *)s2), \
901 suNf_field *: add_assign_suNf_field_cpu((suNf_field *)s1, (suNf_field *)s2), \
902 suNfc_field *: add_assign_suNfc_field_cpu((suNfc_field *)s1, (suNfc_field *)s2), \
903 suNg_field_flt *: add_assign_suNg_field_flt_cpu((suNg_field_flt *)s1, (suNg_field_flt *)s2), \
904 suNf_field_flt *: add_assign_suNf_field_flt_cpu((suNf_field_flt *)s1, (suNf_field_flt *)s2), \
905 suNg_scalar_field *: add_assign_suNg_scalar_field_cpu((suNg_scalar_field *)s1, (suNg_scalar_field *)s2), \
906 suNg_av_field *: add_assign_suNg_av_field_cpu((suNg_av_field *)s1, (suNg_av_field *)s2), \
907 gtransf *: add_assign_gtransf_cpu((gtransf *)s1, (gtransf *)s2), \
908 clover_term *: add_assign_clover_term_cpu((clover_term *)s1, (clover_term *)s2), \
909 clover_force *: add_assign_clover_force_cpu((clover_force *)s1, (clover_force *)s2), \
910 staple_field *: add_assign_staple_field_cpu((staple_field *)s1, (staple_field *)s2))
912#define prod_re_cpu(s1, s2) \
914 spinor_field *: prod_re_spinor_field_cpu((spinor_field *)s1, (spinor_field *)s2), \
915 spinor_field_flt *: prod_re_spinor_field_flt_cpu((spinor_field_flt *)s1, (spinor_field_flt *)s2), \
916 scalar_field *: prod_re_scalar_field_cpu((scalar_field *)s1, (scalar_field *)s2), \
917 suNg_field *: prod_re_suNg_field_cpu((suNg_field *)s1, (suNg_field *)s2), \
918 suNf_field *: prod_re_suNf_field_cpu((suNf_field *)s1, (suNf_field *)s2), \
919 suNfc_field *: prod_re_suNfc_field_cpu((suNfc_field *)s1, (suNfc_field *)s2), \
920 suNg_field_flt *: prod_re_suNg_field_flt_cpu((suNg_field_flt *)s1, (suNg_field_flt *)s2), \
921 suNf_field_flt *: prod_re_suNf_field_flt_cpu((suNf_field_flt *)s1, (suNf_field_flt *)s2), \
922 suNg_scalar_field *: prod_re_suNg_scalar_field_cpu((suNg_scalar_field *)s1, (suNg_scalar_field *)s2), \
923 suNg_av_field *: prod_re_suNg_av_field_cpu((suNg_av_field *)s1, (suNg_av_field *)s2), \
924 gtransf *: prod_re_gtransf_cpu((gtransf *)s1, (gtransf *)s2), \
925 clover_term *: prod_re_clover_term_cpu((clover_term *)s1, (clover_term *)s2), \
926 clover_force *: prod_re_clover_force_cpu((clover_force *)s1, (clover_force *)s2), \
927 staple_field *: prod_re_staple_field_cpu((staple_field *)s1, (staple_field *)s2))
929#define prod_im_cpu(s1, s2) \
931 spinor_field *: prod_im_spinor_field_cpu((spinor_field *)s1, (spinor_field *)s2), \
932 spinor_field_flt *: prod_im_spinor_field_flt_cpu((spinor_field_flt *)s1, (spinor_field_flt *)s2), \
933 scalar_field *: prod_im_scalar_field_cpu((scalar_field *)s1, (scalar_field *)s2), \
934 suNg_field *: prod_im_suNg_field_cpu((suNg_field *)s1, (suNg_field *)s2), \
935 suNf_field *: prod_im_suNf_field_cpu((suNf_field *)s1, (suNf_field *)s2), \
936 suNfc_field *: prod_im_suNfc_field_cpu((suNfc_field *)s1, (suNfc_field *)s2), \
937 suNg_field_flt *: prod_im_suNg_field_flt_cpu((suNg_field_flt *)s1, (suNg_field_flt *)s2), \
938 suNf_field_flt *: prod_im_suNf_field_flt_cpu((suNf_field_flt *)s1, (suNf_field_flt *)s2), \
939 suNg_scalar_field *: prod_im_suNg_scalar_field_cpu((suNg_scalar_field *)s1, (suNg_scalar_field *)s2), \
940 suNg_av_field *: prod_im_suNg_av_field_cpu((suNg_av_field *)s1, (suNg_av_field *)s2), \
941 gtransf *: prod_im_gtransf_cpu((gtransf *)s1, (gtransf *)s2), \
942 clover_term *: prod_im_clover_term_cpu((clover_term *)s1, (clover_term *)s2), \
943 clover_force *: prod_im_clover_force_cpu((clover_force *)s1, (clover_force *)s2), \
944 staple_field *: prod_im_staple_field_cpu((staple_field *)s1, (staple_field *)s2))
946#define prod_cpu(s1, s2) \
948 spinor_field *: prod_spinor_field_cpu((spinor_field *)s1, (spinor_field *)s2), \
949 spinor_field_flt *: prod_spinor_field_flt_cpu((spinor_field_flt *)s1, (spinor_field_flt *)s2), \
950 scalar_field *: prod_scalar_field_cpu((scalar_field *)s1, (scalar_field *)s2), \
951 suNg_field *: prod_suNg_field_cpu((suNg_field *)s1, (suNg_field *)s2), \
952 suNf_field *: prod_suNf_field_cpu((suNf_field *)s1, (suNf_field *)s2), \
953 suNfc_field *: prod_suNfc_field_cpu((suNfc_field *)s1, (suNfc_field *)s2), \
954 suNg_field_flt *: prod_suNg_field_flt_cpu((suNg_field_flt *)s1, (suNg_field_flt *)s2), \
955 suNf_field_flt *: prod_suNf_field_flt_cpu((suNf_field_flt *)s1, (suNf_field_flt *)s2), \
956 suNg_scalar_field *: prod_suNg_scalar_field_cpu((suNg_scalar_field *)s1, (suNg_scalar_field *)s2), \
957 suNg_av_field *: prod_suNg_av_field_cpu((suNg_av_field *)s1, (suNg_av_field *)s2), \
958 gtransf *: prod_gtransf_cpu((gtransf *)s1, (gtransf *)s2), \
959 clover_term *: prod_clover_term_cpu((clover_term *)s1, (clover_term *)s2), \
960 clover_force *: prod_clover_force_cpu((clover_force *)s1, (clover_force *)s2), \
961 staple_field *: prod_staple_field_cpu((staple_field *)s1, (staple_field *)s2), \
962 suNf_spinor *: spinor_prod_f((suNf_spinor *)s1, (suNf_spinor *)s2))
964#define sqnorm_cpu(s1) \
966 spinor_field *: sqnorm_spinor_field_cpu((spinor_field *)s1), \
967 spinor_field_flt *: sqnorm_spinor_field_flt_cpu((spinor_field_flt *)s1), \
968 scalar_field *: sqnorm_scalar_field_cpu((scalar_field *)s1), \
969 suNg_field *: sqnorm_suNg_field_cpu((suNg_field *)s1), \
970 suNf_field *: sqnorm_suNf_field_cpu((suNf_field *)s1), \
971 suNfc_field *: sqnorm_suNfc_field_cpu((suNfc_field *)s1), \
972 suNg_field_flt *: sqnorm_suNg_field_flt_cpu((suNg_field_flt *)s1), \
973 suNf_field_flt *: sqnorm_suNf_field_flt_cpu((suNf_field_flt *)s1), \
974 suNg_scalar_field *: sqnorm_suNg_scalar_field_cpu((suNg_scalar_field *)s1), \
975 suNg_av_field *: sqnorm_suNg_av_field_cpu((suNg_av_field *)s1), \
976 gtransf *: sqnorm_gtransf_cpu((gtransf *)s1), \
977 clover_term *: sqnorm_clover_term_cpu((clover_term *)s1), \
978 clover_force *: sqnorm_clover_force_cpu((clover_force *)s1), \
979 staple_field *: sqnorm_staple_field_cpu((staple_field *)s1))
983 spinor_field *: max_spinor_field_cpu((spinor_field *)s1), \
984 spinor_field_flt *: max_spinor_field_flt_cpu((spinor_field_flt *)s1), \
985 scalar_field *: max_scalar_field_cpu((scalar_field *)s1), \
986 suNg_field *: max_suNg_field_cpu((suNg_field *)s1), \
987 suNf_field *: max_suNf_field_cpu((suNf_field *)s1), \
988 suNfc_field *: max_suNfc_field_cpu((suNfc_field *)s1), \
989 suNg_field_flt *: max_suNg_field_flt_cpu((suNg_field_flt *)s1), \
990 suNf_field_flt *: max_suNf_field_flt_cpu((suNf_field_flt *)s1), \
991 suNg_scalar_field *: max_suNg_scalar_field_cpu((suNg_scalar_field *)s1), \
992 suNg_av_field *: max_suNg_av_field_cpu((suNg_av_field *)s1), \
993 gtransf *: max_gtransf_cpu((gtransf *)s1), \
994 clover_term *: max_clover_term_cpu((clover_term *)s1), \
995 clover_force *: max_clover_force_cpu((clover_force *)s1), \
996 staple_field *: max_staple_field_cpu((staple_field *)s1), \
997 suNf_spinor *: spinor_max_f((suNf_spinor *)s1), \
998 suNf_spinor_flt *: spinor_max_f_flt((suNf_spinor_flt *)s1))
1000#define zero_cpu(s1) \
1002 spinor_field *: zero_spinor_field_cpu((spinor_field *)s1), \
1003 spinor_field_flt *: zero_spinor_field_flt_cpu((spinor_field_flt *)s1), \
1004 scalar_field *: zero_scalar_field_cpu((scalar_field *)s1), \
1005 suNg_field *: zero_suNg_field_cpu((suNg_field *)s1), \
1006 suNf_field *: zero_suNf_field_cpu((suNf_field *)s1), \
1007 suNfc_field *: zero_suNfc_field_cpu((suNfc_field *)s1), \
1008 suNg_field_flt *: zero_suNg_field_flt_cpu((suNg_field_flt *)s1), \
1009 suNf_field_flt *: zero_suNf_field_flt_cpu((suNf_field_flt *)s1), \
1010 suNg_scalar_field *: zero_suNg_scalar_field_cpu((suNg_scalar_field *)s1), \
1011 suNg_av_field *: zero_suNg_av_field_cpu((suNg_av_field *)s1), \
1012 gtransf *: zero_gtransf_cpu((gtransf *)s1), \
1013 clover_term *: zero_clover_term_cpu((clover_term *)s1), \
1014 clover_force *: zero_clover_force_cpu((clover_force *)s1), \
1015 staple_field *: zero_staple_field_cpu((staple_field *)s1))
1017#define copy_cpu(s1, s2) \
1019 spinor_field *: copy_spinor_field_cpu((spinor_field *)s1, (spinor_field *)s2), \
1020 spinor_field_flt *: copy_spinor_field_flt_cpu((spinor_field_flt *)s1, (spinor_field_flt *)s2), \
1021 scalar_field *: copy_scalar_field_cpu((scalar_field *)s1, (scalar_field *)s2), \
1022 suNg_field *: copy_suNg_field_cpu((suNg_field *)s1, (suNg_field *)s2), \
1023 suNf_field *: copy_suNf_field_cpu((suNf_field *)s1, (suNf_field *)s2), \
1024 suNfc_field *: copy_suNfc_field_cpu((suNfc_field *)s1, (suNfc_field *)s2), \
1025 suNg_field_flt *: copy_suNg_field_flt_cpu((suNg_field_flt *)s1, (suNg_field_flt *)s2), \
1026 suNf_field_flt *: copy_suNf_field_flt_cpu((suNf_field_flt *)s1, (suNf_field_flt *)s2), \
1027 suNg_scalar_field *: copy_suNg_scalar_field_cpu((suNg_scalar_field *)s1, (suNg_scalar_field *)s2), \
1028 suNg_av_field *: copy_suNg_av_field_cpu((suNg_av_field *)s1, (suNg_av_field *)s2), \
1029 gtransf *: copy_gtransf_cpu((gtransf *)s1, (gtransf *)s2), \
1030 clover_term *: copy_clover_term_cpu((clover_term *)s1, (clover_term *)s2), \
1031 clover_force *: copy_clover_force_cpu((clover_force *)s1, (clover_force *)s2), \
1032 staple_field *: copy_staple_field_cpu((staple_field *)s1, (staple_field *)s2))
1034#define g5_prod_re_cpu(s1, s2) \
1036 spinor_field *: g5_prod_re_spinor_field_cpu((spinor_field *)s1, (spinor_field *)s2), \
1037 spinor_field_flt *: g5_prod_re_spinor_field_flt_cpu((spinor_field_flt *)s1, (spinor_field_flt *)s2))
1039#define g5_prod_im_cpu(s1, s2) \
1041 spinor_field *: g5_prod_im_spinor_field_cpu((spinor_field *)s1, (spinor_field *)s2), \
1042 spinor_field_flt *: g5_prod_im_spinor_field_flt_cpu((spinor_field_flt *)s1, (spinor_field_flt *)s2))
1044#define g5_cpu(s1, s2) \
1046 spinor_field *: g5_spinor_field_cpu((spinor_field *)s1, (spinor_field *)s2), \
1047 spinor_field_flt *: g5_spinor_field_flt_cpu((spinor_field_flt *)s1, (spinor_field_flt *)s2))
1049#define g5_assign_cpu(s1) \
1051 spinor_field *: g5_assign_spinor_field_cpu((spinor_field *)s1), \
1052 spinor_field_flt *: g5_assign_spinor_field_flt_cpu((spinor_field_flt *)s1))
1054#define g0_cpu(s1, s2) \
1056 spinor_field *: g0_spinor_field_cpu((spinor_field *)s1, (spinor_field *)s2), \
1057 spinor_field_flt *: g0_spinor_field_flt_cpu((spinor_field_flt *)s1, (spinor_field_flt *)s2))
1059#define g1_cpu(s1, s2) \
1061 spinor_field *: g1_spinor_field_cpu((spinor_field *)s1, (spinor_field *)s2), \
1062 spinor_field_flt *: g1_spinor_field_flt_cpu((spinor_field_flt *)s1, (spinor_field_flt *)s2))
1064#define g2_cpu(s1, s2) \
1066 spinor_field *: g2_spinor_field_cpu((spinor_field *)s1, (spinor_field *)s2), \
1067 spinor_field_flt *: g2_spinor_field_flt_cpu((spinor_field_flt *)s1, (spinor_field_flt *)s2))
1069#define g3_cpu(s1, s2) \
1071 spinor_field *: g3_spinor_field_cpu((spinor_field *)s1, (spinor_field *)s2), \
1072 spinor_field_flt *: g3_spinor_field_flt_cpu((spinor_field_flt *)s1, (spinor_field_flt *)s2))
1074#define lc_cpu(r, k1, s1, k2, s2) \
1076 spinor_field *: lc_spinor_field_cpu((spinor_field *)r, k1, (spinor_field *)s1, k2, (spinor_field *)s2), \
1077 spinor_field_flt *: lc_spinor_field_flt_cpu((spinor_field_flt *)r, k1, (spinor_field_flt *)s1, k2, \
1078 (spinor_field_flt *)s2))
1080#define lc_add_assign_cpu(r, k1, s1, k2, s2) \
1082 spinor_field *: lc_add_assign_spinor_field_cpu((spinor_field *)r, k1, (spinor_field *)s1, k2, (spinor_field *)s2), \
1083 spinor_field_flt *: lc_add_assign_spinor_field_flt_cpu((spinor_field_flt *)r, k1, (spinor_field_flt *)s1, k2, \
1084 (spinor_field_flt *)s2))
1086#define clc_cpu(r, k1, s1, k2, s2) \
1088 spinor_field *: clc_spinor_field_cpu((spinor_field *)r, k1, (spinor_field *)s1, k2, (spinor_field *)s2), \
1089 spinor_field_flt *: clc_spinor_field_flt_cpu((spinor_field_flt *)r, k1, (spinor_field_flt *)s1, k2, \
1090 (spinor_field_flt *)s2))
1092#define clc_add_assign_cpu(r, k1, s1, k2, s2) \
1094 spinor_field *: clc_add_assign_spinor_field_cpu((spinor_field *)r, k1, (spinor_field *)s1, k2, (spinor_field *)s2), \
1095 spinor_field_flt *: clc_add_assign_spinor_field_flt_cpu((spinor_field_flt *)r, k1, (spinor_field_flt *)s1, k2, \
1096 (spinor_field_flt *)s2))