6 template <
typename Float>
8 for (
int i = 0; i < cnt; i++)
12 template <
typename Float>
14 for (
int i = 0; i < cnt; i++)
18 template <
typename Float>
20 for (
int i = 0; i < cnt; i++)
25 template <
typename Float>
27 for (
int i=0; i<len; i++) y[i] = x[i] + a*y[i];
30 template <
typename Float>
32 for (
int i=0; i<len; i++) y[i] = a*x[i] - y[i];
35 template <
typename Float>
38 for (
int i=0; i<len; i++) sum += v[i]*v[i];
42 template <
typename Float>
43 static inline void negx(
Float *x,
int len) {
44 for (
int i=0; i<len; i++) x[i] = -x[i];
47 template <
typename sFloat,
typename gFloat>
48 static inline void dot(sFloat* res, gFloat* a, sFloat* b) {
50 for (
int m = 0; m < 3; m++) {
51 sFloat a_re = a[2*m+0];
52 sFloat a_im = a[2*m+1];
53 sFloat b_re = b[2*m+0];
54 sFloat b_im = b[2*m+1];
55 res[0] += a_re * b_re - a_im * b_im;
56 res[1] += a_re * b_im + a_im * b_re;
60 template <
typename Float>
62 for (
int m = 0; m < 3; m++) {
63 for (
int n = 0; n < 3; n++) {
64 res[m*(3*2) + n*(2) + 0] = + mat[n*(3*2) + m*(2) + 0];
65 res[m*(3*2) + n*(2) + 1] = - mat[n*(3*2) + m*(2) + 1];
71 template <
typename sFloat,
typename gFloat>
72 static inline void su3Mul(sFloat *res, gFloat *mat, sFloat *vec) {
73 for (
int n = 0; n < 3; n++) dot(&res[n*(2)], &mat[n*(3*2)], vec);
76 template <
typename sFloat,
typename gFloat>
77 static inline void su3Tmul(sFloat *res, gFloat *mat, sFloat *vec) {
79 su3Transpose(matT, mat);
80 su3Mul(res, matT, vec);
95 template <
typename Float>
96 static inline Float *gaugeLink(
int i,
int dir,
int oddBit,
Float **gaugeEven,
Float **gaugeOdd,
int nbr_distance) {
102 gaugeField = (oddBit ? gaugeOdd : gaugeEven);
110 default: j = -1;
break;
112 gaugeField = (oddBit ? gaugeEven : gaugeOdd);
115 return &gaugeField[dir/2][j*(3*3*2)];
118 template <
typename Float>
119 static inline Float *spinorNeighbor(
int i,
int dir,
int oddBit,
Float *spinorField,
int neighbor_distance)
122 int nb = neighbor_distance;
132 default: j = -1;
break;
142 x4_mg(
int i,
int oddBit)
145 int x4 = Y/(
Z[2]*
Z[1]*
Z[0]);
149 template <
typename Float>
150 static inline Float *gaugeLink_mg4dir(
int i,
int dir,
int oddBit,
Float **gaugeEven,
Float **gaugeOdd,
151 Float** ghostGaugeEven,
Float** ghostGaugeOdd,
int n_ghost_faces,
int nbr_distance) {
154 int d = nbr_distance;
157 gaugeField = (oddBit ? gaugeOdd : gaugeEven);
162 int x4 = Y/(
Z[2]*
Z[1]*
Z[0]);
163 int x3 = (Y/(
Z[1]*
Z[0])) %
Z[2];
164 int x2 = (Y/
Z[0]) %
Z[1];
170 Float* ghostGaugeField;
175 int new_x1 = (x1 - d +
X1 )% X1;
177 ghostGaugeField = (oddBit?ghostGaugeEven[0]: ghostGaugeOdd[0]);
178 int offset = (n_ghost_faces + x1 -d)*X4*X3*X2/2 + (x4*X3*X2 + x3*X2+x2)/2;
179 return &ghostGaugeField[offset*(3*3*2)];
181 j = (x4*X3*X2*X1 + x3*X2*X1 + x2*X1 + new_x1) / 2;
186 int new_x2 = (x2 - d +
X2 )% X2;
188 ghostGaugeField = (oddBit?ghostGaugeEven[1]: ghostGaugeOdd[1]);
189 int offset = (n_ghost_faces + x2 -d)*X4*X3*X1/2 + (x4*X3*X1 + x3*X1+x1)/2;
190 return &ghostGaugeField[offset*(3*3*2)];
192 j = (x4*X3*X2*X1 + x3*X2*X1 + new_x2*X1 +
x1) / 2;
198 int new_x3 = (x3 - d +
X3 )% X3;
200 ghostGaugeField = (oddBit?ghostGaugeEven[2]: ghostGaugeOdd[2]);
201 int offset = (n_ghost_faces + x3 -d)*X4*X2*X1/2 + (x4*X2*X1 + x2*X1+x1)/2;
202 return &ghostGaugeField[offset*(3*3*2)];
204 j = (x4*X3*X2*X1 + new_x3*X2*X1 + x2*X1 +
x1) / 2;
209 int new_x4 = (x4 - d +
X4)% X4;
211 ghostGaugeField = (oddBit?ghostGaugeEven[3]: ghostGaugeOdd[3]);
212 int offset = (n_ghost_faces + x4 -d)*X1*X2*X3/2 + (x3*X2*X1 + x2*X1+x1)/2;
213 return &ghostGaugeField[offset*(3*3*2)];
215 j = (new_x4*(X3*X2*
X1) + x3*(X2*X1) + x2*(
X1) + x1) / 2;
219 default: j = -1; printf(
"ERROR: wrong dir \n"); exit(1);
221 gaugeField = (oddBit ? gaugeEven : gaugeOdd);
225 return &gaugeField[dir/2][j*(3*3*2)];
228 template <
typename Float>
229 static inline Float *spinorNeighbor_mg4dir(
int i,
int dir,
int oddBit,
Float *spinorField,
Float** fwd_nbr_spinor,
230 Float** back_nbr_spinor,
int neighbor_distance,
int nFace)
233 int nb = neighbor_distance;
235 int x4 = Y/(
Z[2]*
Z[1]*
Z[0]);
236 int x3 = (Y/(
Z[1]*
Z[0])) %
Z[2];
237 int x2 = (Y/
Z[0]) %
Z[1];
247 int new_x1 = (x1 + nb)% X1;
249 int offset = ( x1 + nb -
X1)*X4*X3*X2/2+(x4*X3*X2 + x3*X2+x2)/2;
252 j = (x4*X3*X2*X1 + x3*X2*X1 + x2*X1 + new_x1) / 2;
258 int new_x1 = (x1 - nb +
X1)% X1;
260 int offset = ( x1+nFace- nb)*X4*X3*X2/2+(x4*X3*X2 + x3*X2+x2)/2;
263 j = (x4*X3*X2*X1 + x3*X2*X1 + x2*X1 + new_x1) / 2;
268 int new_x2 = (x2 + nb)% X2;
270 int offset = ( x2 + nb -
X2)*X4*X3*X1/2+(x4*X3*X1 + x3*X1+x1)/2;
273 j = (x4*X3*X2*X1 + x3*X2*X1 + new_x2*X1 +
x1) / 2;
278 int new_x2 = (x2 - nb +
X2)% X2;
280 int offset = ( x2 + nFace -nb)*X4*X3*X1/2+(x4*X3*X1 + x3*X1+x1)/2;
283 j = (x4*X3*X2*X1 + x3*X2*X1 + new_x2*X1 +
x1) / 2;
288 int new_x3 = (x3 + nb)% X3;
290 int offset = ( x3 + nb -
X3)*X4*X2*X1/2+(x4*X2*X1 + x2*X1+x1)/2;
293 j = (x4*X3*X2*X1 + new_x3*X2*X1 + x2*X1 +
x1) / 2;
298 int new_x3 = (x3 - nb +
X3)% X3;
300 int offset = ( x3 + nFace -nb)*X4*X2*X1/2+(x4*X2*X1 + x2*X1+x1)/2;
303 j = (x4*X3*X2*X1 + new_x3*X2*X1 + x2*X1 +
x1) / 2;
309 int x4 = x4_mg(i, oddBit);
310 if ( (x4 + nb) >=
Z[3]){
311 int offset = (x4+nb -
Z[3])*
Vsh_t;
319 int x4 = x4_mg(i, oddBit);
321 int offset = ( x4 - nb +nFace)*
Vsh_t;
326 default: j = -1; printf(
"ERROR: wrong dir\n"); exit(1);
334 #endif // _DSLASH_UTIL_H