20 #if defined USE_GROUP_SU3
21 #include "field_F_imp_SU3.inc"
22 #elif defined USE_GROUP_SU2
23 #include "field_F_imp_SU2.inc"
24 #elif defined USE_GROUP_SU_N
25 #include "field_F_imp_SU_N.inc"
41 assert(x.
nex() == y.
nex());
44 const int Nd = x.
nd();
45 const int Nc = x.
nc();
46 const int Nc2 = x.
nc2();
47 const int Ncd2 = Nc2 * Nd;
55 for (
int s = 0; s < Nd; ++s) {
60 idc_i[s] = 1 - idc_r[s];
68 int is = y.
nvol() * ith / nth;
69 int ns = y.
nvol() * (ith + 1) / nth - is;
71 const int Nex = y.
nex();
73 for (
int ex = 0; ex < Nex; ++ex) {
74 double *v = y.
ptr(0, is, ex);
75 double *w =
const_cast<Field_F *
>(&x)->ptr(0, is, ex);
77 for (
int site = 0; site < ns; ++site) {
80 for (
int s = 0; s < Nd; ++s) {
81 int iv2 = s * Nc2 + iv;
82 int iw2 =
id[s] * Nc2 + iv;
83 for (
int ic = 0; ic < Nc; ++ic) {
84 v[2 * ic + iv2] = gv_r[s] * w[2 * ic + idc_r[s] + iw2];
85 v[2 * ic + 1 + iv2] = gv_i[s] * w[2 * ic + idc_i[s] + iw2];
96 assert(x.
nex() == y.
nex());
99 const int Nd = x.
nd();
100 const int Nc = x.
nc();
101 const int Nc2 = x.
nc2();
102 const int Ncd2 = Nc2 * Nd;
110 for (
int s = 0; s < Nd; ++s) {
115 idc_i[s] = 1 - idc_r[s];
123 int is = y.
nvol() * ith / nth;
124 int ns = y.
nvol() * (ith + 1) / nth - is;
126 const int Nex = y.
nex();
128 for (
int ex = 0; ex < Nex; ++ex) {
129 double *v = y.
ptr(0, is, ex);
130 double *w =
const_cast<Field_F *
>(&x)->ptr(0, is, ex);
132 for (
int site = 0; site < ns; ++site) {
133 int iv = Ncd2 * site;
135 for (
int s = 0; s < Nd; ++s) {
136 int iv2 = s * Nc2 + iv;
137 int iw2 =
id[s] * Nc2 + iv;
138 for (
int ic = 0; ic < Nc; ++ic) {
139 v[2 * ic + iv2] = gv_r[s] * w[2 * ic + idc_r[s] + iw2];
140 v[2 * ic + 1 + iv2] = gv_i[s] * w[2 * ic + idc_i[s] + iw2];
154 assert(w.
nex() == y.
nex());
161 }
else if (pm == -1) {
177 assert(w.
nex() == y.
nex());
183 }
else if (pm == -1) {
195 const Field_G& U,
const int ex1,
196 const Field_F& x,
const int ex2)
198 assert(ex < y.
nex());
199 assert(ex1 < U.
nex());
200 assert(ex2 < x.
nex());
204 const int Nd = x.
nd();
205 const int Nc = x.
nc();
206 const int Nc2 = x.
nc2();
207 const int Ncd2 = Nc2 * Nd;
208 const int Ndf = Nc2 * Nc;
215 int is = y.
nvol() * ith / nth;
216 int ns = y.
nvol() * (ith + 1) / nth - is;
218 double *v = y.
ptr(0, is, ex);
219 double *g =
const_cast<Field_G *
>(&U)->ptr(0, is, ex1);
220 double *w =
const_cast<Field_F *
>(&x)->ptr(0, is, ex2);
222 for (
int site = 0; site < ns; ++site) {
224 int iv = Ncd2 * site;
225 for (
int s = 0; s < Nd; ++s) {
226 for (
int ic = 0; ic < Nc; ++ic) {
227 int ig2 = ic * Nc2 + ig;
228 int iv2 = s * Nc2 + iv;
229 v[2 * ic + iv2] = mult_Gn_r(&g[ig2], &w[iv2], Nc);
230 v[2 * ic + 1 + iv2] = mult_Gn_i(&g[ig2], &w[iv2], Nc);
239 const Field_G& U,
const int ex1,
240 const Field_F& x,
const int ex2)
242 assert(ex < y.
nex());
243 assert(ex1 < U.
nex());
244 assert(ex2 < x.
nex());
248 const int Nd = x.
nd();
249 const int Nc = x.
nc();
250 const int Nc2 = x.
nc2();
251 const int Ncd2 = Nc2 * Nd;
252 const int Ndf = Nc2 * Nc;
259 int is = y.
nvol() * ith / nth;
260 int ns = y.
nvol() * (ith + 1) / nth - is;
262 double *v = y.
ptr(0, is, ex);
263 double *g =
const_cast<Field_G *
>(&U)->ptr(0, is, ex1);
264 double *w =
const_cast<Field_F *
>(&x)->ptr(0, is, ex2);
266 for (
int site = 0; site < ns; ++site) {
268 int iv = Ncd2 * site;
269 for (
int s = 0; s < Nd; ++s) {
270 for (
int ic = 0; ic < Nc; ++ic) {
271 int ig2 = ic * 2 + ig;
272 int iv2 = s * Nc2 + iv;
273 v[2 * ic + iv2] = mult_Gd_r(&g[ig2], &w[iv2], Nc);
274 v[2 * ic + 1 + iv2] = mult_Gd_i(&g[ig2], &w[iv2], Nc);
283 const Field_G& U,
const int ex1,
284 const Field_F& x,
const int ex2,
287 assert(ex < y.
nex());
288 assert(ex1 < U.
nex());
289 assert(ex2 < x.
nex());
293 const int Nd = x.
nd();
294 const int Nc = x.
nc();
295 const int Nc2 = x.
nc2();
296 const int Ncd2 = Nc2 * Nd;
297 const int Ndf = Nc2 * Nc;
304 int is = y.
nvol() * ith / nth;
305 int ns = y.
nvol() * (ith + 1) / nth - is;
307 double *v = y.
ptr(0, is, ex);
308 double *g =
const_cast<Field_G *
>(&U)->ptr(0, is, ex1);
309 double *w =
const_cast<Field_F *
>(&x)->ptr(0, is, ex2);
311 for (
int site = 0; site < ns; ++site) {
313 int iv = Ncd2 * site;
314 for (
int s = 0; s < Nd; ++s) {
315 for (
int ic = 0; ic < Nc; ++ic) {
316 int ig2 = ic * Nc2 + ig;
317 int iv2 = s * Nc2 + iv;
318 v[2 * ic + iv2] += a * mult_Gn_r(&g[ig2], &w[iv2], Nc);
319 v[2 * ic + 1 + iv2] += a * mult_Gn_i(&g[ig2], &w[iv2], Nc);
328 const Field_G& U,
const int ex1,
329 const Field_F& x,
const int ex2,
332 assert(ex < y.
nex());
333 assert(ex1 < U.
nex());
334 assert(ex2 < x.
nex());
338 const int Nd = x.
nd();
339 const int Nc = x.
nc();
340 const int Nc2 = x.
nc2();
341 const int Ncd2 = Nc2 * Nd;
342 const int Ndf = Nc2 * Nc;
349 int is = y.
nvol() * ith / nth;
350 int ns = y.
nvol() * (ith + 1) / nth - is;
352 double *v = y.
ptr(0, is, ex);
353 double *g =
const_cast<Field_G *
>(&U)->ptr(0, is, ex1);
354 double *w =
const_cast<Field_F *
>(&x)->ptr(0, is, ex2);
356 for (
int site = 0; site < ns; ++site) {
358 int iv = Ncd2 * site;
359 for (
int s = 0; s < Nd; ++s) {
360 for (
int ic = 0; ic < Nc; ++ic) {
361 int ig2 = ic * 2 + ig;
362 int iv2 = s * Nc2 + iv;
363 v[2 * ic + iv2] += a * mult_Gd_r(&g[ig2], &w[iv2], Nc);
364 v[2 * ic + 1 + iv2] += a * mult_Gd_i(&g[ig2], &w[iv2], Nc);
void mult_Field_Gd(Field_F &y, const int ex, const Field_G &u, int ex1, const Field_F &x, int ex2)
void general(const char *format,...)
double * ptr(const int jin, const int site, const int jex)
void check()
check several assumptions for performance implementation.
void multadd_Field_Gn(Field_F &y, const int ex, const Field_G &u, int ex1, const Field_F &x, int ex2, const double a)
Wilson-type fermion field.
void mult_GMproj2(Field_F &y, const int pm, const GammaMatrix &gm, const Field_F &x)
projection with gamma matrix: (1 gamma)
double value_r(int row) const
void mult_iGM(Field_F &y, const GammaMatrix &gm, const Field_F &x)
gamma matrix multiplication (i is multiplied)
void multadd_Field_Gd(Field_F &y, const int ex, const Field_G &u, int ex1, const Field_F &x, int ex2, const double a)
void mult_Field_Gn(Field_F &y, const int ex, const Field_G &u, int ex1, const Field_F &x, int ex2)
void mult_GM(Field_F &y, const GammaMatrix &gm, const Field_F &x)
gamma matrix multiplication
int index_c(int row) const
double value_i(int row) const
void mult_GMproj(Field_F &y, const int pm, const GammaMatrix &gm, const Field_F &x)
projection with gamma matrix: (1 gamma)/2