Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
field_F.h
Go to the documentation of this file.
1 
14 #ifndef FIELD_F_INCLUDED
15 #define FIELD_F_INCLUDED
16 
17 #include "commonParameters.h"
18 #include "communicator.h"
19 #include "field.h"
20 #include "field_G.h"
21 #include "vec_SU_N.h"
22 #include "gammaMatrix.h"
23 
25 
34 class Field_F : public Field {
35  private:
36  int m_Nc; // num of the color elements
37  int m_Nc2; // num of the double color elements
38  int m_Nvol; // lattice volume
39  int m_Nd; // num of the spinor elements
40  int m_Nex; // num of the extra indices
41 
42  int myindex(const int c2, const int s, const int site, const int ex)
43  const
44  {
45  return Field::myindex(c2 + m_Nc2 * s, site, ex);
46  }
47 
48  public:
49  Field_F(const int Nvol = CommonParameters::Nvol(), const int Nex = 1) :
50  Field(), m_Nc(CommonParameters::Nc()),
51  m_Nvol(Nvol),
52  m_Nd(CommonParameters::Nd()),
53  m_Nex(Nex)
54  {
55  m_Nc2 = 2 * m_Nc;
57  check();
58  }
59 
60  Field_F(const Field& x) :
61  Field(x),
62  m_Nc(CommonParameters::Nc()),
63  m_Nc2(2 * m_Nc),
64  m_Nvol(x.nvol()),
65  m_Nd(CommonParameters::Nd()),
66  m_Nex(x.nex())
67  {
68  }
69 
70  int nc() const { return m_Nc; }
71  int nc2() const { return m_Nc2; }
72  int nd() const { return m_Nd; }
73 
74  double cmp_r(const int cc, const int s, const int site, const int e = 0)
75  const
76  {
77  return field[myindex(2 * cc, s, site, e)];
78  }
79 
80  double cmp_i(const int cc, const int s, const int site, const int e = 0)
81  const
82  {
83  return field[myindex(2 * cc + 1, s, site, e)];
84  }
85 
86  void set_r(const int cc, const int s, const int site, const int e,
87  const double re)
88  {
89  field[myindex(2 * cc, s, site, e)] = re;
90  }
91 
92  void set_i(const int cc, const int s, const int site, const int e,
93  const double im)
94  {
95  field[myindex(2 * cc + 1, s, site, e)] = im;
96  }
97 
98  void set_ri(const int cc, const int s, const int site, const int e,
99  const double re, const double im)
100  {
101  field[myindex(2 * cc, s, site, e)] = re;
102  field[myindex(2 * cc + 1, s, site, e)] = im;
103  }
104 
105  Vec_SU_N vec(const int s, const int site, const int e = 0) const
106  {
107  Vec_SU_N Tmp;
108 
109  for (int cc = 0; cc < m_Nc; ++cc) {
110  Tmp.set(cc, field[myindex(2 * cc, s, site, e)],
111  field[myindex(2 * cc + 1, s, site, e)]);
112  }
113  return Tmp;
114  }
115 
116  void set_vec(const int s, const int site, const int e, const Vec_SU_N& F)
117  {
118  for (int cc = 0; cc < m_Nc; ++cc) {
119  field[myindex(2 * cc, s, site, e)] = F.r(cc);
120  field[myindex(2 * cc + 1, s, site, e)] = F.i(cc);
121  }
122  }
123 
124  void add_vec(const int s, const int site, const int e, const Vec_SU_N& F)
125  {
126  for (int cc = 0; cc < m_Nc; ++cc) {
127  field[myindex(2 * cc, s, site, e)] += F.r(cc);
128  field[myindex(2 * cc + 1, s, site, e)] += F.i(cc);
129  }
130  }
131 
132  void clear_vec(const int s, const int site, const int e)
133  {
134  for (int cc = 0; cc < m_Nc2; ++cc) {
135  field[myindex(cc, s, site, e)] = 0.0;
136  }
137  }
138 
139  void xI()
140  {
141  double tmp_r, tmp_i;
142 
143  for (int ex = 0; ex < m_Nex; ++ex) {
144  for (int site = 0; site < m_Nvol; ++site) {
145  for (int s = 0; s < m_Nd; ++s) {
146  for (int cc = 0; cc < m_Nc; ++cc) {
147  tmp_r = field[myindex(2 * cc, s, site, ex)];
148  tmp_i = field[myindex(2 * cc + 1, s, site, ex)];
149  field[myindex(2 * cc, s, site, ex)] = -tmp_i;
150  field[myindex(2 * cc + 1, s, site, ex)] = tmp_r;
151  }
152  }
153  }
154  }
155  }
156 
157  void Ix(const Field_F& w)
158  {
159  for (int ex = 0; ex < m_Nex; ++ex) {
160  for (int site = 0; site < m_Nvol; ++site) {
161  for (int s = 0; s < m_Nd; ++s) {
162  for (int cc = 0; cc < m_Nc; ++cc) {
163  field[myindex(2 * cc, s, site, ex)] = -w.cmp_i(cc, s, site, ex);
164  field[myindex(2 * cc + 1, s, site, ex)] = w.cmp_r(cc, s, site, ex);
165  }
166  }
167  }
168  }
169  }
170 
171  void mult_Field_Gn(int ex, const Field_G&, int ex1,
172  const Field_F&, int ex2);
173 
174  void mult_Field_Gd(int ex, const Field_G&, int ex1,
175  const Field_F&, int ex2);
176 
177  void multadd_Field_Gn(int ex, const Field_G&, int ex1,
178  const Field_F&, int ex2, double);
179 
180  void multadd_Field_Gd(int ex, const Field_G&, int ex1,
181  const Field_F&, int ex2, double);
182 
184  void mult_GM(const GammaMatrix&, const Field_F&);
185 
187  void mult_iGM(const GammaMatrix&, const Field_F&);
188 
190  void mult_GMproj(int, const GammaMatrix&, const Field_F&);
191 
193  void mult_GMproj2(int, const GammaMatrix&, const Field_F&);
194 
195  double operator*(const Field_F&);
196 
197  // check several assumptions for performance implementation.
198  void check();
199 
200  template<typename T>
201  Field_F& operator=(const T& rhs)
202  {
203  *this = rhs.eval();
204  return *this;
205  }
206 
207  template<typename T>
208  Field_F& operator+=(const T& rhs)
209  {
210  *this += rhs.eval();
211  return *this;
212  }
213 
214  template<typename T>
215  Field_F& operator-=(const T& rhs)
216  {
217  *this -= rhs.eval();
218  return *this;
219  }
220 
221  /*
222  */
223 
224  Field_F& operator-();
225  Field_F& operator=(const double&);
226  Field_F& operator+=(const Field_F&);
227  Field_F& operator-=(const Field_F&);
228  Field_F& operator*=(const double&);
229  Field_F& operator*=(const dcomplex&);
230  Field_F& operator/=(const double&);
231  Field_F& operator/=(const dcomplex&);
232 };
233 
234 inline Field_F& Field_F::operator=(const double& r)
235 {
236  field = r;
237  return *this;
238 }
239 
240 
242 {
243  field = -field;
244  return *this;
245 }
246 
247 
249 {
250  field += rhs.field;
251  return *this;
252 }
253 
254 
256 {
257  field -= rhs.field;
258  return *this;
259 }
260 
261 
262 inline Field_F& Field_F::operator*=(const double& rhs)
263 {
264  field *= rhs;
265  return *this;
266 }
267 
268 
269 inline Field_F& Field_F::operator/=(const double& rhs)
270 {
271  field /= rhs;
272  return *this;
273 }
274 
275 
276 inline double Field_F::operator*(const Field_F& rhs)
277 {
278  double a = (field * rhs.field).sum();
279  double b = Communicator::reduce_sum(a);
280 
281  return b;
282  // return (field*rhs.field).sum();
283 }
284 #endif