Bridge++  Ver. 1.2.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
field_F_imp.cpp
Go to the documentation of this file.
1 
14 #include "field_F.h"
15 
16 using std::valarray;
17 
18 //#include "threadManager_OpenMP.h"
19 
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"
26 #endif
27 
28 //====================================================================
30 {
31  // assert(NC == CommonParameters::Nc());
32  // assert(ND == CommonParameters::Nd());
33 
34  check_Nc();
35 }
36 
37 
38 //====================================================================
39 void mult_GM(Field_F& y, const GammaMatrix& gm, const Field_F& x)
40 {
41  assert(x.nex() == y.nex());
42  assert(x.nvol() == y.nvol());
43 
44  const int Nd = x.nd();
45  const int Nc = x.nc();
46  const int Nc2 = x.nc2();
47  const int Ncd2 = Nc2 * Nd;
48 
49  int id[Nd];
50  int idc_r[Nd];
51  int idc_i[Nd];
52  double gv_r[Nd];
53  double gv_i[Nd];
54 
55  for (int s = 0; s < Nd; ++s) {
56  id[s] = gm.index(s);
57  gv_r[s] = gm.value_r(s);
58  gv_i[s] = gm.value_i(s);
59  idc_r[s] = gm.index_c(s);
60  idc_i[s] = 1 - idc_r[s];
61  }
62 
63  // int nth = ThreadManager_OpenMP::get_num_threads();
64  // int ith = ThreadManager_OpenMP::get_thread_id();
65  int nth = 1;
66  int ith = 0;
67 
68  int is = y.nvol() * ith / nth;
69  int ns = y.nvol() * (ith + 1) / nth - is;
70 
71  const int Nex = y.nex();
72 
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);
76 
77  for (int site = 0; site < ns; ++site) {
78  int iv = Ncd2 * site;
79 
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];
86  }
87  }
88  }
89  }
90 }
91 
92 
93 //====================================================================
94 void mult_iGM(Field_F& y, const GammaMatrix& gm, const Field_F& x)
95 {
96  assert(x.nex() == y.nex());
97  assert(x.nvol() == y.nvol());
98 
99  const int Nd = x.nd();
100  const int Nc = x.nc();
101  const int Nc2 = x.nc2();
102  const int Ncd2 = Nc2 * Nd;
103 
104  int id[Nd];
105  int idc_r[Nd];
106  int idc_i[Nd];
107  double gv_r[Nd];
108  double gv_i[Nd];
109 
110  for (int s = 0; s < Nd; ++s) {
111  id[s] = gm.index(s);
112  gv_r[s] = -gm.value_i(s);
113  gv_i[s] = gm.value_r(s);
114  idc_r[s] = 1 - gm.index_c(s);
115  idc_i[s] = 1 - idc_r[s];
116  }
117 
118  // int nth = ThreadManager_OpenMP::get_num_threads();
119  // int ith = ThreadManager_OpenMP::get_thread_id();
120  int nth = 1;
121  int ith = 0;
122 
123  int is = y.nvol() * ith / nth;
124  int ns = y.nvol() * (ith + 1) / nth - is;
125 
126  const int Nex = y.nex();
127 
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);
131 
132  for (int site = 0; site < ns; ++site) {
133  int iv = Ncd2 * site;
134 
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];
141  }
142  }
143  }
144  }
145 }
146 
147 
148 //====================================================================
150  const int pm, const GammaMatrix& gm,
151  const Field_F& w)
152 {
153  assert(w.nvol() == y.nvol());
154  assert(w.nex() == y.nex());
155 
156  mult_GM(y, gm, w);
157 
158  if (pm == 1) {
159  y += w;
160  y *= 0.5;
161  } else if (pm == -1) {
162  y -= w;
163  y *= -0.5;
164  } else {
165  vout.general("%s: wrong pm.\n", __func__);
166  abort();
167  }
168 }
169 
170 
171 //====================================================================
173  const int pm, const GammaMatrix& gm,
174  const Field_F& w)
175 {
176  assert(w.nvol() == y.nvol());
177  assert(w.nex() == y.nex());
178 
179  mult_GM(y, gm, w);
180 
181  if (pm == 1) {
182  y += w;
183  } else if (pm == -1) {
184  y -= w;
185  y *= -1;
186  } else {
187  vout.general("%s: wrong pm.\n", __func__);
188  abort();
189  }
190 }
191 
192 
193 //====================================================================
194 void mult_Field_Gn(Field_F& y, const int ex,
195  const Field_G& U, const int ex1,
196  const Field_F& x, const int ex2)
197 {
198  assert(ex < y.nex());
199  assert(ex1 < U.nex());
200  assert(ex2 < x.nex());
201  assert(U.nvol() == y.nvol());
202  assert(x.nvol() == y.nvol());
203 
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;
209 
210  // int nth = ThreadManager_OpenMP::get_num_threads();
211  // int ith = ThreadManager_OpenMP::get_thread_id();
212  int nth = 1;
213  int ith = 0;
214 
215  int is = y.nvol() * ith / nth;
216  int ns = y.nvol() * (ith + 1) / nth - is;
217 
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);
221 
222  for (int site = 0; site < ns; ++site) {
223  int ig = Ndf * 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);
231  }
232  }
233  }
234 }
235 
236 
237 //====================================================================
238 void mult_Field_Gd(Field_F& y, const int ex,
239  const Field_G& U, const int ex1,
240  const Field_F& x, const int ex2)
241 {
242  assert(ex < y.nex());
243  assert(ex1 < U.nex());
244  assert(ex2 < x.nex());
245  assert(U.nvol() == y.nvol());
246  assert(x.nvol() == y.nvol());
247 
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;
253 
254  // int nth = ThreadManager_OpenMP::get_num_threads();
255  // int ith = ThreadManager_OpenMP::get_thread_id();
256  int nth = 1;
257  int ith = 0;
258 
259  int is = y.nvol() * ith / nth;
260  int ns = y.nvol() * (ith + 1) / nth - is;
261 
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);
265 
266  for (int site = 0; site < ns; ++site) {
267  int ig = Ndf * 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);
275  }
276  }
277  }
278 }
279 
280 
281 //====================================================================
282 void multadd_Field_Gn(Field_F& y, const int ex,
283  const Field_G& U, const int ex1,
284  const Field_F& x, const int ex2,
285  const double a)
286 {
287  assert(ex < y.nex());
288  assert(ex1 < U.nex());
289  assert(ex2 < x.nex());
290  assert(U.nvol() == y.nvol());
291  assert(x.nvol() == y.nvol());
292 
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;
298 
299  // int nth = ThreadManager_OpenMP::get_num_threads();
300  // int ith = ThreadManager_OpenMP::get_thread_id();
301  int nth = 1;
302  int ith = 0;
303 
304  int is = y.nvol() * ith / nth;
305  int ns = y.nvol() * (ith + 1) / nth - is;
306 
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);
310 
311  for (int site = 0; site < ns; ++site) {
312  int ig = Ndf * 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);
320  }
321  }
322  }
323 }
324 
325 
326 //====================================================================
327 void multadd_Field_Gd(Field_F& y, const int ex,
328  const Field_G& U, const int ex1,
329  const Field_F& x, const int ex2,
330  const double a)
331 {
332  assert(ex < y.nex());
333  assert(ex1 < U.nex());
334  assert(ex2 < x.nex());
335  assert(U.nvol() == y.nvol());
336  assert(x.nvol() == y.nvol());
337 
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;
343 
344  // int nth = ThreadManager_OpenMP::get_num_threads();
345  // int ith = ThreadManager_OpenMP::get_thread_id();
346  int nth = 1;
347  int ith = 0;
348 
349  int is = y.nvol() * ith / nth;
350  int ns = y.nvol() * (ith + 1) / nth - is;
351 
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);
355 
356  for (int site = 0; site < ns; ++site) {
357  int ig = Ndf * 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);
365  }
366  }
367  }
368 }
369 
370 
371 //====================================================================
372 //============================================================END=====
void mult_Field_Gd(Field_F &y, const int ex, const Field_G &u, int ex1, const Field_F &x, int ex2)
BridgeIO vout
Definition: bridgeIO.cpp:207
void general(const char *format,...)
Definition: bridgeIO.cpp:38
double * ptr(const int jin, const int site, const int jex)
Definition: field.h:118
void check()
check several assumptions for performance implementation.
Definition: field_F_imp.cpp:29
int nvol() const
Definition: field.h:101
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.
Definition: field_F.h:37
void mult_GMproj2(Field_F &y, const int pm, const GammaMatrix &gm, const Field_F &x)
projection with gamma matrix: (1 gamma)
Gamma Matrix class.
Definition: gammaMatrix.h:45
double value_r(int row) const
Definition: gammaMatrix.h:99
SU(N) gauge field.
Definition: field_G.h:36
void mult_iGM(Field_F &y, const GammaMatrix &gm, const Field_F &x)
gamma matrix multiplication (i is multiplied)
Definition: field_F_imp.cpp:94
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)
int nex() const
Definition: field.h:102
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
Definition: field_F_imp.cpp:39
int index_c(int row) const
Definition: gammaMatrix.h:94
int nc() const
Definition: field_F.h:89
int nc2() const
Definition: field_F.h:90
double value_i(int row) const
Definition: gammaMatrix.h:104
void mult_GMproj(Field_F &y, const int pm, const GammaMatrix &gm, const Field_F &x)
projection with gamma matrix: (1 gamma)/2
int nd() const
Definition: field_F.h:91
int index(int row) const
Definition: gammaMatrix.h:84