Bridge++  Ver. 1.2.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
field_F.cpp
Go to the documentation of this file.
1 
14 #include "field_F.h"
15 #include "index_lex.h"
16 
17 #include "bridgeIO.h"
18 using Bridge::vout;
19 
20 using std::valarray;
21 
22 //====================================================================
23 void Field_F::check()
24 {
25  // do nothing.
26 }
27 
28 
29 //====================================================================
30 void mult_GM(Field_F& v, const GammaMatrix& gm, const Field_F& w)
31 {
32  assert(w.nex() == v.nex());
33  assert(w.nvol() == v.nvol());
34 
35  const int Nvol = v.nvol();
36  const int Nex = v.nex();
37  const int Nd = v.nd();
38  const int Nc = v.nc();
39 
40  valarray<int> id(Nd);
41  valarray<int> idc_r(Nd);
42  valarray<int> idc_i(Nd);
43  valarray<double> gv_r(Nd);
44  valarray<double> gv_i(Nd);
45 
46  for (int s = 0; s < Nd; ++s) {
47  id[s] = gm.index(s);
48  gv_r[s] = gm.value_r(s);
49  gv_i[s] = gm.value_i(s);
50  idc_r[s] = gm.index_c(s);
51  idc_i[s] = 1 - idc_r[s];
52  }
53 
54  for (int ex = 0; ex < Nex; ++ex) {
55  for (int site = 0; site < Nvol; ++site) {
56  for (int s = 0; s < Nd; ++s) {
57  for (int c = 0; c < Nc; ++c) {
58  double ww[2];
59  ww[0] = w.cmp_r(c, id[s], site, ex);
60  ww[1] = w.cmp_i(c, id[s], site, ex);
61 
62  v.set_ri(c, s, site, ex,
63  gv_r[s] * ww[idc_r[s]],
64  gv_i[s] * ww[idc_i[s]]);
65  }
66  }
67  }
68  }
69 }
70 
71 
72 //====================================================================
73 void mult_iGM(Field_F& v, const GammaMatrix& gm, const Field_F& w)
74 {
75  assert(w.nex() == v.nex());
76  assert(w.nvol() == v.nvol());
77 
78  const int Nvol = v.nvol();
79  const int Nex = v.nex();
80  const int Nd = v.nd();
81  const int Nc = v.nc();
82 
83  valarray<int> id(Nd);
84  valarray<int> idc_r(Nd);
85  valarray<int> idc_i(Nd);
86  valarray<double> gv_r(Nd);
87  valarray<double> gv_i(Nd);
88 
89  for (int s = 0; s < Nd; ++s) {
90  id[s] = gm.index(s);
91  gv_r[s] = -gm.value_i(s);
92  gv_i[s] = gm.value_r(s);
93  idc_r[s] = 1 - gm.index_c(s);
94  idc_i[s] = 1 - idc_r[s];
95  }
96 
97  for (int ex = 0; ex < Nex; ++ex) {
98  for (int site = 0; site < Nvol; ++site) {
99  for (int s = 0; s < Nd; ++s) {
100  for (int c = 0; c < Nc; ++c) {
101  double ww[2];
102  ww[0] = w.cmp_r(c, id[s], site, ex);
103  ww[1] = w.cmp_i(c, id[s], site, ex);
104 
105  v.set_ri(c, s, site, ex,
106  gv_r[s] * ww[idc_r[s]],
107  gv_i[s] * ww[idc_i[s]]);
108  }
109  }
110  }
111  }
112 }
113 
114 
115 //====================================================================
117  const int pm, const GammaMatrix& gm,
118  const Field_F& w)
119 {
120  assert(w.nvol() == v.nvol());
121  assert(w.nex() == v.nex());
122  assert(pm == 1 || pm == -1);
123 
124  mult_GM(v, gm, w);
125 
126  if (pm == 1) {
127  v += w;
128  v *= 0.5;
129  } else if (pm == -1) {
130  v -= w;
131  v *= -0.5;
132  } else {
133  vout.general("%s: wrong pm = %d\n", __func__, pm);
134  abort();
135  }
136 }
137 
138 
139 //====================================================================
141  const int pm, const GammaMatrix& gm,
142  const Field_F& w)
143 {
144  assert(w.nvol() == v.nvol());
145  assert(w.nex() == v.nex());
146  assert(pm == 1 || pm == -1);
147 
148  mult_GM(v, gm, w);
149 
150  if (pm == 1) {
151  v += w;
152  } else if (pm == -1) {
153  v -= w;
154  v *= -1;
155  } else {
156  vout.general("%s: wrong pm = %d\n", __func__, pm);
157  abort();
158  }
159 }
160 
161 
162 //====================================================================
163 void mult_Field_Gn(Field_F& y, const int ex,
164  const Field_G& U, int ex1,
165  const Field_F& x, int ex2)
166 {
167  assert(ex < y.nex());
168  assert(ex1 < U.nex());
169  assert(ex2 < x.nex());
170  assert(U.nvol() == y.nvol());
171  assert(x.nvol() == y.nvol());
172 
173  const int Nvol = x.nvol();
174  const int Nd = x.nd();
175  const int Nc = x.nc();
176 
177  for (int site = 0; site < Nvol; ++site) {
178  for (int s = 0; s < Nd; ++s) {
179  y.set_vec(s, site, ex, U.mat(site, ex1) * x.vec(s, site, ex2));
180  }
181  }
182 }
183 
184 
185 //====================================================================
186 void mult_Field_Gd(Field_F& y, const int ex,
187  const Field_G& U, int ex1,
188  const Field_F& x, int ex2)
189 {
190  assert(ex < y.nex());
191  assert(ex1 < U.nex());
192  assert(ex2 < x.nex());
193  assert(U.nvol() == y.nvol());
194  assert(x.nvol() == y.nvol());
195 
196  const int Nvol = y.nvol();
197  const int Nd = y.nd();
198  const int Nc = y.nc();
199 
200  for (int site = 0; site < Nvol; ++site) {
201  for (int s = 0; s < Nd; ++s) {
202  y.set_vec(s, site, ex, U.mat_dag(site, ex1) * x.vec(s, site, ex2));
203  }
204  }
205 }
206 
207 
208 //====================================================================
209 void multadd_Field_Gn(Field_F& y, const int ex,
210  const Field_G& U, int ex1,
211  const Field_F& x, int ex2,
212  const double a)
213 {
214  assert(ex < y.nex());
215  assert(ex1 < U.nex());
216  assert(ex2 < x.nex());
217  assert(U.nvol() == y.nvol());
218  assert(x.nvol() == y.nvol());
219 
220  const int Nvol = y.nvol();
221  const int Nd = y.nd();
222  const int Nc = y.nc();
223 
224  Vec_SU_N vec(Nc);
225 
226  for (int site = 0; site < Nvol; ++site) {
227  for (int s = 0; s < Nd; ++s) {
228  y.add_vec(s, site, ex, U.mat(site, ex1) * x.vec(s, site, ex2) * a);
229  }
230  }
231 }
232 
233 
234 //====================================================================
235 void multadd_Field_Gd(Field_F& y, const int ex,
236  const Field_G& U, int ex1,
237  const Field_F& x, int ex2,
238  const double a)
239 {
240  assert(ex < y.nex());
241  assert(ex1 < U.nex());
242  assert(ex2 < x.nex());
243  assert(U.nvol() == y.nvol());
244  assert(x.nvol() == y.nvol());
245 
246  const int Nvol = y.nvol();
247  const int Nd = y.nd();
248  const int Nc = y.nc();
249 
250  for (int site = 0; site < Nvol; ++site) {
251  for (int s = 0; s < Nd; ++s) {
252  y.add_vec(s, site, ex, U.mat_dag(site, ex1) * x.vec(s, site, ex2) * a);
253  }
254  }
255 }
256 
257 
258 //====================================================================
259 //============================================================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
double cmp_i(const int cc, const int s, const int site, const int e=0) const
Definition: field_F.h:100
void set_vec(const int s, const int site, const int e, const Vec_SU_N &F)
Definition: field_F.h:134
void general(const char *format,...)
Definition: bridgeIO.cpp:38
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)
void set_ri(const int cc, const int s, const int site, const int e, const double re, const double im)
Definition: field_F.h:116
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
Vec_SU_N vec(const int s, const int site, const int e=0) const
Definition: field_F.h:122
Mat_SU_N mat_dag(const int site, const int mn=0) const
Definition: field_G.h:123
double value_i(int row) const
Definition: gammaMatrix.h:104
void add_vec(const int s, const int site, const int e, const Vec_SU_N &F)
Definition: field_F.h:142
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
Mat_SU_N mat(const int site, const int mn=0) const
Definition: field_G.h:110
int index(int row) const
Definition: gammaMatrix.h:84
double cmp_r(const int cc, const int s, const int site, const int e=0) const
Definition: field_F.h:94