Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
field_G.h
Go to the documentation of this file.
1 
15 #ifndef FIELD_G_INCLUDED
16 #define FIELD_G_INCLUDED
17 
18 #include "bridge_complex.h"
19 
20 #include "commonParameters.h"
21 #include "field.h"
22 #include "mat_SU_N.h"
23 using namespace SU_N;
24 
26 
35 class Field_G : public Field {
36  private:
37  int m_Nc; // number of color elements
38  int m_Ndf; // number of components as real values
39  int m_Nvol; // number of sites
40  int m_Nex; // extra degree of freedom, such as mu, nu.
41 
42  public:
43 
44  Field_G(const int Nvol = CommonParameters::Nvol(), const int Nex = 1) :
45  Field(),
46  m_Nc(CommonParameters::Nc()),
47  m_Nvol(Nvol),
48  m_Nex(Nex)
49  {
50  m_Ndf = 2 * m_Nc * m_Nc;
51  Field::reset(m_Ndf, m_Nvol, m_Nex);
52  }
53 
54  Field_G(const Field& x) :
55  Field(x),
56  m_Nc(CommonParameters::Nc()),
57  m_Ndf(x.nin()),
58  m_Nvol(x.nvol()),
59  m_Nex(x.nex())
60  {
61  assert(m_Ndf == 2 * m_Nc * m_Nc);
62  }
63 
64  void reset(const int Nvol, const int Nex)
65  {
66  m_Nvol = Nvol;
67  m_Nex = Nex;
68  Field::reset(m_Ndf, m_Nvol, m_Nex);
69  }
70 
71  double cmp_r(const int cc, const int site, const int mn = 0) const
72  {
73  return field[myindex(2 * cc, site, mn)];
74  }
75 
76  double cmp_i(const int cc, const int site, const int mn = 0) const
77  {
78  return field[myindex(2 * cc + 1, site, mn)];
79  }
80 
81  void set_r(const int cc, const int site, const int mn, const double re)
82  {
83  field[myindex(2 * cc, site, mn)] = re;
84  }
85 
86  void set_i(const int cc, const int site, const int mn, const double im)
87  {
88  field[myindex(2 * cc + 1, site, mn)] = im;
89  }
90 
91  void set_ri(const int cc, const int site, const int mn,
92  const double re, const double im)
93  {
94  field[myindex(2 * cc, site, mn)] = re;
95  field[myindex(2 * cc + 1, site, mn)] = im;
96  }
97 
98  Mat_SU_N mat(const int site, const int mn = 0) const
99  {
100  Mat_SU_N Tmp(m_Nc);
101 
102  for (int cc = 0; cc < m_Nc * m_Nc; ++cc) {
103  Tmp.set(cc, field[myindex(2 * cc, site, mn)],
104  field[myindex(2 * cc + 1, site, mn)]);
105  }
106  return Tmp;
107  }
108 
109  Mat_SU_N mat_dag(const int site, const int mn = 0) const
110  {
111  Mat_SU_N Tmp(m_Nc);
112 
113  for (int cc = 0; cc < m_Nc * m_Nc; ++cc) {
114  Tmp.set(cc, field[myindex(2 * cc, site, mn)],
115  field[myindex(2 * cc + 1, site, mn)]);
116  }
117  return Tmp.dag();
118  }
119 
120  void mat(Mat_SU_N& Tmp, const int site, const int mn = 0) const
121  {
122  for (int cc = 0; cc < m_Nc * m_Nc; ++cc) {
123  Tmp.set(cc, field[myindex(2 * cc, site, mn)],
124  field[myindex(2 * cc + 1, site, mn)]);
125  }
126  }
127 
128  void mat_dag(Mat_SU_N& Tmp, const int site, const int mn = 0) const
129  {
130  for (int c1 = 0; c1 < m_Nc; ++c1) {
131  for (int c2 = 0; c2 < m_Nc; ++c2) {
132  Tmp.set(c1 + m_Nc * c2, field[myindex(2 * (c2 + m_Nc * c1), site, mn)],
133  -field[myindex(2 * (c2 + m_Nc * c1) + 1, site, mn)]);
134  }
135  }
136  }
137 
138  void set_mat(const int site, const int mn, const Mat_SU_N& U)
139  {
140  for (int cc = 0; cc < m_Nc * m_Nc; ++cc) {
141  field[myindex(2 * cc, site, mn)] = U.r(cc);
142  field[myindex(2 * cc + 1, site, mn)] = U.i(cc);
143  }
144  }
145 
146  void add_mat(const int site, const int mn, const Mat_SU_N& U)
147  {
148  for (int cc = 0; cc < m_Nc * m_Nc; ++cc) {
149  field[myindex(2 * cc, site, mn)] += U.r(cc);
150  field[myindex(2 * cc + 1, site, mn)] += U.i(cc);
151  }
152  }
153 
154  void add_mat(const int site, const int mn, const Mat_SU_N& U, double prf)
155  {
156  for (int cc = 0; cc < m_Nc * m_Nc; ++cc) {
157  field[myindex(2 * cc, site, mn)] += prf * U.r(cc);
158  field[myindex(2 * cc + 1, site, mn)] += prf * U.i(cc);
159  }
160  }
161 
162  void xI()
163  {
164  for (int i = 0; i < field.size(); i += 2) {
165  double real = field[i];
166  field[i] = -field[i + 1];
167  field[i + 1] = real;
168  }
169  }
170 
171  void mult_Field_Gnn(int ex, const Field_G&, int ex1,
172  const Field_G&, int ex2);
173 
174  void mult_Field_Gnd(int ex, const Field_G&, int ex1,
175  const Field_G&, int ex2);
176 
177  void mult_Field_Gdn(int ex, const Field_G&, int ex1,
178  const Field_G&, int ex2);
179 
180  void mult_Field_Gdd(int ex, const Field_G&, int ex1,
181  const Field_G&, int ex2);
182 
183  void multadd_Field_Gnn(int ex, const Field_G&, int ex1,
184  const Field_G&, int ex2, double);
185 
186  void multadd_Field_Gnd(int ex, const Field_G&, int ex1,
187  const Field_G&, int ex2, double);
188 
189  void multadd_Field_Gdn(int ex, const Field_G&, int ex1,
190  const Field_G&, int ex2, double);
191 
192  void multadd_Field_Gdd(int ex, const Field_G&, int ex1,
193  const Field_G&, int ex2, double);
194 
196  void ah_Field_G(int ex);
197 
199  void at_Field_G(int ex);
200 
201  Field_G& operator-();
202  Field_G& operator=(const double&);
203  Field_G& operator+=(const Field_G&);
204  Field_G& operator-=(const Field_G&);
205  Field_G& operator*=(const double&);
206  Field_G& operator*=(const dcomplex&);
207  Field_G& operator/=(const double&);
208  Field_G& operator/=(const dcomplex&);
209 };
210 
212 {
213  field = -field;
214  return *this;
215 }
216 
217 
218 inline Field_G& Field_G::operator=(const double& r)
219 {
220  field = r;
221  return *this;
222 }
223 
224 
226 {
227  field += rhs.field;
228  return *this;
229 }
230 
231 
233 {
234  field -= rhs.field;
235  return *this;
236 }
237 
238 
239 inline Field_G& Field_G::operator*=(const double& rhs)
240 {
241  field *= rhs;
242  return *this;
243 }
244 
245 
246 inline Field_G& Field_G::operator/=(const double& rhs)
247 {
248  field /= rhs;
249  return *this;
250 }
251 #endif