Bridge++  Version 1.4.4
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
field_G_imp.cpp
Go to the documentation of this file.
1 
14 #include "Field/field_G.h"
15 
16 #include "IO/bridgeIO.h"
17 using Bridge::vout;
18 
19 //#include "ResourceManager/threadManager_OpenMP.h"
20 
21 #if defined USE_GROUP_SU3
22 #include "field_G_imp_SU3.inc"
23 #elif defined USE_GROUP_SU2
24 #include "field_G_imp_SU2.inc"
25 #elif defined USE_GROUP_SU_N
26 #include "field_G_imp_SU_N.inc"
27 #endif
28 
29 //====================================================================
31 {
32  assert(NC == CommonParameters::Nc());
33 
34  check_Nc();
35 }
36 
37 
38 //====================================================================
40 {
41  Mat_SU_N ut(nc());
42 
43  ut.unit();
44 
45  // int Nthread = ThreadManager_OpenMP::get_num_threads();
46  // int i_thread = ThreadManager_OpenMP::get_thread_id();
47  int Nthread = 1;
48  int i_thread = 0;
49 
50  int is = nvol() * i_thread / Nthread;
51  int ns = nvol() * (i_thread + 1) / Nthread - is;
52 
53  for (int mu = 0; mu < nex(); ++mu) {
54  for (int site = is; site < is + ns; ++site) {
55  set_mat(site, mu, ut);
56  }
57  }
58 }
59 
60 
61 //====================================================================
63 {
64  rand->gauss_lex_global(*this);
65 
66  Mat_SU_N ut(m_Nc);
67 
68  for (int mu = 0; mu < m_Nex; ++mu) {
69  for (int site = 0; site < m_Nvol; ++site) {
70  this->mat(ut, site, mu);
71  ut.reunit();
72  this->set_mat(site, mu, ut);
73  }
74  }
75 }
76 
77 
78 //====================================================================
80 {
81  set_random(rand.get());
82 }
83 
84 
85 //====================================================================
87 {
88  Mat_SU_N ut(nc());
89 
90  // int Nthread = ThreadManager_OpenMP::get_num_threads();
91  // int i_thread = ThreadManager_OpenMP::get_thread_id();
92  int Nthread = 1;
93  int i_thread = 0;
94 
95  int is = nvol() * i_thread / Nthread;
96  int ns = nvol() * (i_thread + 1) / Nthread - is;
97 
98  for (int mu = 0; mu < nex(); ++mu) {
99  for (int site = is; site < is + ns; ++site) {
100  mat(ut, site, mu);
101  ut.reunit();
102  set_mat(site, mu, ut);
103  }
104  }
105 }
106 
107 
108 //====================================================================
109 void mult_Field_Gnn(Field_G& W, const int ex,
110  const Field_G& U1, int ex1,
111  const Field_G& U2, int ex2)
112 {
113  assert(ex < W.nex());
114  assert(ex1 < U1.nex());
115  assert(ex2 < U2.nex());
116  assert(U1.nvol() == W.nvol());
117  assert(U2.nvol() == W.nvol());
118 
119  // int Nthread = ThreadManager_OpenMP::get_num_threads();
120  // int i_thread = ThreadManager_OpenMP::get_thread_id();
121  int Nthread = 1;
122  int i_thread = 0;
123 
124  int is = W.nvol() * i_thread / Nthread;
125  int ns = W.nvol() * (i_thread + 1) / Nthread - is;
126 
127  double *g = W.ptr(0, is, ex);
128  const double *g1 = U1.ptr(0, is, ex1);
129  const double *g2 = U2.ptr(0, is, ex2);
130 
131  const int Nc = W.nc();
132  const int Nc2 = 2 * Nc;
133  const int Ndf = Nc2 * Nc;
134 
135  for (int site = 0; site < ns; ++site) {
136  int ig = Ndf * site;
137 
138  for (int ic2 = 0; ic2 < Nc; ++ic2) {
139  for (int ic1 = 0; ic1 < Nc; ++ic1) {
140  int jg2 = ic2 * 2 + ig;
141  int jg1 = ic1 * Nc2 + ig;
142  g[2 * ic2 + Nc2 * ic1 + ig] = mult_Gnn_r(&g1[jg1], &g2[jg2], Nc);
143  g[2 * ic2 + 1 + Nc2 * ic1 + ig] = mult_Gnn_i(&g1[jg1], &g2[jg2], Nc);
144  }
145  }
146  }
147 }
148 
149 
150 //====================================================================
151 void mult_Field_Gdn(Field_G& W, const int ex,
152  const Field_G& U1, int ex1,
153  const Field_G& U2, int ex2)
154 {
155  assert(ex < W.nex());
156  assert(ex1 < U1.nex());
157  assert(ex2 < U2.nex());
158  assert(U1.nvol() == W.nvol());
159  assert(U2.nvol() == W.nvol());
160 
161  // int Nthread = ThreadManager_OpenMP::get_num_threads();
162  // int i_thread = ThreadManager_OpenMP::get_thread_id();
163  int Nthread = 1;
164  int i_thread = 0;
165 
166  int is = W.nvol() * i_thread / Nthread;
167  int ns = W.nvol() * (i_thread + 1) / Nthread - is;
168 
169  double *g = W.ptr(0, is, ex);
170  const double *g1 = U1.ptr(0, is, ex1);
171  const double *g2 = U2.ptr(0, is, ex2);
172 
173  const int Nc = W.nc();
174  const int Nc2 = 2 * Nc;
175  const int Ndf = Nc2 * Nc;
176 
177  for (int site = 0; site < ns; ++site) {
178  int ig = Ndf * site;
179 
180  for (int ic2 = 0; ic2 < Nc; ++ic2) {
181  for (int ic1 = 0; ic1 < Nc; ++ic1) {
182  int jg2 = ic2 * 2 + ig;
183  int jg1 = ic1 * 2 + ig;
184  g[2 * ic2 + Nc2 * ic1 + ig] = mult_Gdn_r(&g1[jg1], &g2[jg2], Nc);
185  g[2 * ic2 + 1 + Nc2 * ic1 + ig] = mult_Gdn_i(&g1[jg1], &g2[jg2], Nc);
186  }
187  }
188  }
189 }
190 
191 
192 //====================================================================
193 void mult_Field_Gnd(Field_G& W, const int ex,
194  const Field_G& U1, int ex1,
195  const Field_G& U2, int ex2)
196 {
197  assert(ex < W.nex());
198  assert(ex1 < U1.nex());
199  assert(ex2 < U2.nex());
200  assert(U1.nvol() == W.nvol());
201  assert(U2.nvol() == W.nvol());
202 
203  // int Nthread = ThreadManager_OpenMP::get_num_threads();
204  // int i_thread = ThreadManager_OpenMP::get_thread_id();
205  int Nthread = 1;
206  int i_thread = 0;
207 
208  int is = W.nvol() * i_thread / Nthread;
209  int ns = W.nvol() * (i_thread + 1) / Nthread - is;
210 
211  double *g = W.ptr(0, is, ex);
212  const double *g1 = U1.ptr(0, is, ex1);
213  const double *g2 = U2.ptr(0, is, ex2);
214 
215  const int Nc = W.nc();
216  const int Nc2 = 2 * Nc;
217  const int Ndf = Nc2 * Nc;
218 
219  for (int site = 0; site < ns; ++site) {
220  int ig = Ndf * site;
221 
222  for (int ic2 = 0; ic2 < Nc; ++ic2) {
223  for (int ic1 = 0; ic1 < Nc; ++ic1) {
224  int jg2 = ic2 * Nc2 + ig;
225  int jg1 = ic1 * Nc2 + ig;
226  g[2 * ic2 + Nc2 * ic1 + ig] = mult_Gnd_r(&g1[jg1], &g2[jg2], Nc);
227  g[2 * ic2 + 1 + Nc2 * ic1 + ig] = mult_Gnd_i(&g1[jg1], &g2[jg2], Nc);
228  }
229  }
230  }
231 }
232 
233 
234 //====================================================================
235 void mult_Field_Gdd(Field_G& W, const int ex,
236  const Field_G& U1, int ex1,
237  const Field_G& U2, int ex2)
238 {
239  assert(ex < W.nex());
240  assert(ex1 < U1.nex());
241  assert(ex2 < U2.nex());
242  assert(U1.nvol() == W.nvol());
243  assert(U2.nvol() == W.nvol());
244 
245  // int Nthread = ThreadManager_OpenMP::get_num_threads();
246  // int i_thread = ThreadManager_OpenMP::get_thread_id();
247  int Nthread = 1;
248  int i_thread = 0;
249 
250  int is = W.nvol() * i_thread / Nthread;
251  int ns = W.nvol() * (i_thread + 1) / Nthread - is;
252 
253  double *g = W.ptr(0, is, ex);
254  const double *g1 = U1.ptr(0, is, ex1);
255  const double *g2 = U2.ptr(0, is, ex2);
256 
257  const int Nc = W.nc();
258  const int Nc2 = 2 * Nc;
259  const int Ndf = Nc2 * Nc;
260 
261  for (int site = 0; site < ns; ++site) {
262  int ig = Ndf * site;
263 
264  for (int ic2 = 0; ic2 < Nc; ++ic2) {
265  for (int ic1 = 0; ic1 < Nc; ++ic1) {
266  int jg2 = ic2 * Nc2 + ig;
267  int jg1 = ic1 * 2 + ig;
268  g[2 * ic2 + Nc2 * ic1 + ig] = mult_Gdd_r(&g1[jg1], &g2[jg2], Nc);
269  g[2 * ic2 + 1 + Nc2 * ic1 + ig] = mult_Gdd_i(&g1[jg1], &g2[jg2], Nc);
270  }
271  }
272  }
273 }
274 
275 
276 //====================================================================
277 void multadd_Field_Gnn(Field_G& W, const int ex,
278  const Field_G& U1, int ex1,
279  const Field_G& U2, int ex2,
280  const double ff)
281 {
282  assert(ex < W.nex());
283  assert(ex1 < U1.nex());
284  assert(ex2 < U2.nex());
285  assert(U1.nvol() == W.nvol());
286  assert(U2.nvol() == W.nvol());
287 
288  // int Nthread = ThreadManager_OpenMP::get_num_threads();
289  // int i_thread = ThreadManager_OpenMP::get_thread_id();
290  int Nthread = 1;
291  int i_thread = 0;
292 
293  int is = W.nvol() * i_thread / Nthread;
294  int ns = W.nvol() * (i_thread + 1) / Nthread - is;
295 
296  double *g = W.ptr(0, is, ex);
297  const double *g1 = U1.ptr(0, is, ex1);
298  const double *g2 = U2.ptr(0, is, ex2);
299 
300  const int Nc = W.nc();
301  const int Nc2 = 2 * Nc;
302  const int Ndf = Nc2 * Nc;
303 
304  for (int site = 0; site < ns; ++site) {
305  int ig = Ndf * site;
306 
307  for (int ic2 = 0; ic2 < Nc; ++ic2) {
308  for (int ic1 = 0; ic1 < Nc; ++ic1) {
309  int jg2 = ic2 * 2 + ig;
310  int jg1 = ic1 * Nc2 + ig;
311  g[2 * ic2 + Nc2 * ic1 + ig] +=
312  ff * mult_Gnn_r(&g1[jg1], &g2[jg2], Nc);
313  g[2 * ic2 + 1 + Nc2 * ic1 + ig] +=
314  ff * mult_Gnn_i(&g1[jg1], &g2[jg2], Nc);
315  }
316  }
317  }
318 }
319 
320 
321 //====================================================================
322 void multadd_Field_Gdn(Field_G& W, const int ex,
323  const Field_G& U1, int ex1,
324  const Field_G& U2, int ex2,
325  const double ff)
326 {
327  assert(ex < W.nex());
328  assert(ex1 < U1.nex());
329  assert(ex2 < U2.nex());
330  assert(U1.nvol() == W.nvol());
331  assert(U2.nvol() == W.nvol());
332 
333  // int Nthread = ThreadManager_OpenMP::get_num_threads();
334  // int i_thread = ThreadManager_OpenMP::get_thread_id();
335  int Nthread = 1;
336  int i_thread = 0;
337 
338  int is = W.nvol() * i_thread / Nthread;
339  int ns = W.nvol() * (i_thread + 1) / Nthread - is;
340 
341  double *g = W.ptr(0, is, ex);
342  const double *g1 = U1.ptr(0, is, ex1);
343  const double *g2 = U2.ptr(0, is, ex2);
344 
345  const int Nc = W.nc();
346  const int Nc2 = 2 * Nc;
347  const int Ndf = Nc2 * Nc;
348 
349  for (int site = 0; site < ns; ++site) {
350  int ig = Ndf * site;
351 
352  for (int ic2 = 0; ic2 < Nc; ++ic2) {
353  for (int ic1 = 0; ic1 < Nc; ++ic1) {
354  int jg2 = ic2 * 2 + ig;
355  int jg1 = ic1 * 2 + ig;
356  g[2 * ic2 + Nc2 * ic1 + ig] +=
357  ff * mult_Gdn_r(&g1[jg1], &g2[jg2], Nc);
358  g[2 * ic2 + 1 + Nc2 * ic1 + ig] +=
359  ff * mult_Gdn_i(&g1[jg1], &g2[jg2], Nc);
360  }
361  }
362  }
363 }
364 
365 
366 //====================================================================
367 void multadd_Field_Gnd(Field_G& W, const int ex,
368  const Field_G& U1, int ex1,
369  const Field_G& U2, int ex2,
370  const double ff)
371 {
372  assert(ex < W.nex());
373  assert(ex1 < U1.nex());
374  assert(ex2 < U2.nex());
375  assert(U1.nvol() == W.nvol());
376  assert(U2.nvol() == W.nvol());
377 
378  // int Nthread = ThreadManager_OpenMP::get_num_threads();
379  // int i_thread = ThreadManager_OpenMP::get_thread_id();
380  int Nthread = 1;
381  int i_thread = 0;
382 
383  int is = W.nvol() * i_thread / Nthread;
384  int ns = W.nvol() * (i_thread + 1) / Nthread - is;
385 
386  double *g = W.ptr(0, is, ex);
387  const double *g1 = U1.ptr(0, is, ex1);
388  const double *g2 = U2.ptr(0, is, ex2);
389 
390  const int Nc = W.nc();
391  const int Nc2 = 2 * Nc;
392  const int Ndf = Nc2 * Nc;
393 
394  for (int site = 0; site < ns; ++site) {
395  int ig = Ndf * site;
396 
397  for (int ic2 = 0; ic2 < Nc; ++ic2) {
398  for (int ic1 = 0; ic1 < Nc; ++ic1) {
399  int jg2 = ic2 * Nc2 + ig;
400  int jg1 = ic1 * Nc2 + ig;
401  g[2 * ic2 + Nc2 * ic1 + ig] +=
402  ff * mult_Gnd_r(&g1[jg1], &g2[jg2], Nc);
403  g[2 * ic2 + 1 + Nc2 * ic1 + ig]
404  += ff * mult_Gnd_i(&g1[jg1], &g2[jg2], Nc);
405  }
406  }
407  }
408 }
409 
410 
411 //====================================================================
412 void multadd_Field_Gdd(Field_G& W, const int ex,
413  const Field_G& U1, int ex1,
414  const Field_G& U2, int ex2,
415  const double ff)
416 {
417  assert(ex < W.nex());
418  assert(ex1 < U1.nex());
419  assert(ex2 < U2.nex());
420  assert(U1.nvol() == W.nvol());
421  assert(U2.nvol() == W.nvol());
422 
423  // int Nthread = ThreadManager_OpenMP::get_num_threads();
424  // int i_thread = ThreadManager_OpenMP::get_thread_id();
425  int Nthread = 1;
426  int i_thread = 0;
427 
428  int is = W.nvol() * i_thread / Nthread;
429  int ns = W.nvol() * (i_thread + 1) / Nthread - is;
430 
431  double *g = W.ptr(0, is, ex);
432  const double *g1 = U1.ptr(0, is, ex1);
433  const double *g2 = U2.ptr(0, is, ex2);
434 
435  const int Nc = W.nc();
436  const int Nc2 = 2 * Nc;
437  const int Ndf = Nc2 * Nc;
438 
439  for (int site = 0; site < ns; ++site) {
440  int ig = Ndf * site;
441 
442  for (int ic2 = 0; ic2 < Nc; ++ic2) {
443  for (int ic1 = 0; ic1 < Nc; ++ic1) {
444  int jg2 = ic2 * Nc2 + ig;
445  int jg1 = ic1 * 2 + ig;
446  g[2 * ic2 + Nc2 * ic1 + ig] +=
447  ff * mult_Gdd_r(&g1[jg1], &g2[jg2], Nc);
448  g[2 * ic2 + 1 + Nc2 * ic1 + ig] +=
449  ff * mult_Gdd_i(&g1[jg1], &g2[jg2], Nc);
450  }
451  }
452  }
453 }
454 
455 
456 //====================================================================
457 void at_Field_G(Field_G& W, const int ex)
458 {
459  assert(ex < W.nex());
460 
461  // int Nthread = ThreadManager_OpenMP::get_num_threads();
462  // int i_thread = ThreadManager_OpenMP::get_thread_id();
463  int Nthread = 1;
464  int i_thread = 0;
465 
466  int is = W.nvol() * i_thread / Nthread;
467  int ns = W.nvol() * (i_thread + 1) / Nthread - is;
468 
469  double *g = W.ptr(0, is, ex);
470 
471  const int Nc = W.nc();
472  const int Ndf = 2 * Nc * Nc;
473 
474  for (int site = 0; site < ns; ++site) {
475  int ig = Ndf * site;
476 
477  for (int a = 0; a < Nc; ++a) {
478  for (int b = a + 1; b < Nc; ++b) {
479  double re = g[2 * (Nc * a + b) + ig] - g[2 * (Nc * b + a) + ig];
480  double im = g[2 * (Nc * a + b) + 1 + ig] + g[2 * (Nc * b + a) + 1 + ig];
481 
482  g[2 * (Nc * a + b) + ig] = 0.5 * re;
483  g[2 * (Nc * a + b) + 1 + ig] = 0.5 * im;
484 
485  g[2 * (Nc * b + a) + ig] = -0.5 * re;
486  g[2 * (Nc * b + a) + 1 + ig] = 0.5 * im;
487  }
488  }
489  double tr = 0.0;
490  for (int cc = 0; cc < Nc; ++cc) {
491  tr += g[2 * (Nc * cc + cc) + 1 + ig];
492  }
493  tr = tr / Nc;
494  for (int cc = 0; cc < Nc; ++cc) {
495  g[2 * (Nc * cc + cc) + ig] = 0.0;
496  g[2 * (Nc * cc + cc) + 1 + ig] -= tr;
497  }
498  }
499 }
500 
501 
502 //====================================================================
503 void ah_Field_G(Field_G& W, const int ex)
504 {
505  assert(ex < W.nex());
506 
507  // int Nthread = ThreadManager_OpenMP::get_num_threads();
508  // int i_thread = ThreadManager_OpenMP::get_thread_id();
509  int Nthread = 1;
510  int i_thread = 0;
511 
512  int is = W.nvol() * i_thread / Nthread;
513  int ns = W.nvol() * (i_thread + 1) / Nthread - is;
514 
515  double *g = W.ptr(0, is, ex);
516 
517  const int Nc = W.nc();
518  const int Ndf = 2 * Nc * Nc;
519 
520  for (int site = 0; site < ns; ++site) {
521  int ig = Ndf * site;
522 
523  for (int a = 0; a < Nc; ++a) {
524  for (int b = a; b < Nc; ++b) {
525  double re = g[2 * (Nc * a + b) + ig] - g[2 * (Nc * b + a) + ig];
526  double im = g[2 * (Nc * a + b) + 1 + ig] + g[2 * (Nc * b + a) + 1 + ig];
527 
528  g[2 * (Nc * a + b) + ig] = 0.5 * re;
529  g[2 * (Nc * a + b) + 1 + ig] = 0.5 * im;
530 
531  g[2 * (Nc * b + a) + ig] = -0.5 * re;
532  g[2 * (Nc * b + a) + 1 + ig] = 0.5 * im;
533  }
534  }
535  }
536 }
537 
538 
539 //====================================================================
540 void mult_exp_Field_G(Field_G& W, const double alpha, const Field_G& iP, const Field_G& U, const int Nprec)
541 {
542  //- not imp version, yet.
543 
544  // W = exp(alpha * iP) * U
545  // = (U + alpha * iP * (U + alpha/2 * iP * ( ... (U + alpha/n * iP * U) ... )
546  int Nvol = U.nvol();
547  int Nex = U.nex();
548  int Nc = CommonParameters::Nc();
549 
550  Mat_SU_N u0(Nc), v0(Nc), w0(Nc);
551 
552  for (int ex = 0; ex < Nex; ++ex) {
553  for (int site = 0; site < Nvol; ++site) {
554  u0 = U.mat(site, ex);
555  v0 = iP.mat(site, ex);
556 
557  w0 = SU_N::mat_exp(alpha, v0, u0, Nprec);
558 
559  W.set_mat(site, ex, w0);
560  }
561  }
562 }
563 
564 
565 //====================================================================
566 //============================================================END=====
BridgeIO vout
Definition: bridgeIO.cpp:495
int m_Nex
Definition: field.h:47
const double * ptr(const int jin, const int site, const int jex) const
Definition: field.h:142
void at_Field_G(Field_G &W, const int ex)
int m_Nvol
Definition: field.h:46
int nvol() const
Definition: field.h:116
void check()
check of assumptions for performance implementation.
Definition: field_G_imp.cpp:30
void ah_Field_G(Field_G &W, const int ex)
virtual void gauss_lex_global(Field &)
gaussian random number defined on global lattice.
void set_random(RandomNumbers *rand)
Definition: field_G_imp.cpp:62
#define NC
void multadd_Field_Gdd(Field_G &W, const int ex, const Field_G &U1, int ex1, const Field_G &U2, int ex2, const double ff)
Mat_SU_N & reunit()
Definition: mat_SU_N.h:71
void set_unit()
Definition: field_G_imp.cpp:39
int nc() const
Definition: field_G.h:83
SU(N) gauge field.
Definition: field_G.h:38
void multadd_Field_Gnn(Field_G &W, const int ex, const Field_G &U1, int ex1, const Field_G &U2, int ex2, const double ff)
void multadd_Field_Gdn(Field_G &W, const int ex, const Field_G &U1, int ex1, const Field_G &U2, int ex2, const double ff)
pointer get() const
int nex() const
Definition: field.h:117
void multadd_Field_Gnd(Field_G &W, const int ex, const Field_G &U1, int ex1, const Field_G &U2, int ex2, const double ff)
void reunit()
Definition: field_G_imp.cpp:86
void mult_Field_Gnn(Field_G &W, const int ex, const Field_G &U1, int ex1, const Field_G &U2, int ex2)
void mult_Field_Gnd(Field_G &W, const int ex, const Field_G &U1, int ex1, const Field_G &U2, int ex2)
Base class of random number generators.
Definition: randomNumbers.h:36
void mult_Field_Gdd(Field_G &W, const int ex, const Field_G &U1, int ex1, const Field_G &U2, int ex2)
Mat_SU_N mat_exp(const double alpha, const Mat_SU_N &iv, const Mat_SU_N &u, const int Nprec)
Definition: mat_SU_N.h:577
Mat_SU_N & unit()
Definition: mat_SU_N.h:373
void set_mat(const int site, const int mn, const Mat_SU_N &U)
Definition: field_G.h:159
void mult_exp_Field_G(Field_G &W, const double alpha, const Field_G &iP, const Field_G &U, const int Nprec)
Mat_SU_N mat(const int site, const int mn=0) const
Definition: field_G.h:113
void mult_Field_Gdn(Field_G &W, const int ex, const Field_G &U1, int ex1, const Field_G &U2, int ex2)
int m_Nc
Definition: field_G.h:41