Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
field_F_1spinor.h
Go to the documentation of this file.
1 
15 #ifndef FIELD_F_1sp_INCLUDED
16 #define FIELD_F_1sp_INCLUDED
17 
18 #include "commonParameters.h"
19 #include "communicator.h"
20 #include "field.h"
21 #include "vec_SU_N.h"
22 using namespace SU_N;
23 
25 
31 class Field_F_1spinor : public Field {
32  private:
33  int m_Nc; // num of the color elements
34  int m_Nc2; // num of the double color elements
35  int m_Nvol; // lattice volume
36  int m_Nex; // num of the extra indices
37 
38  int myindex(const int c2, const int site, const int ex)
39  const
40  {
41  return Field::myindex(c2, site, ex);
42  }
43 
44  public:
45  Field_F_1spinor(const int Nvol = CommonParameters::Nvol(), const int Nex = 1) :
46  Field(),
47  m_Nc(CommonParameters::Nc()),
48  m_Nvol(Nvol),
49  m_Nex(Nex)
50  {
51  m_Nc2 = 2 * m_Nc;
52  reset(m_Nc2, m_Nvol, m_Nex);
53  }
54 
55  Field_F_1spinor(const Field& x) :
56  Field(x),
57  m_Nc(CommonParameters::Nc()),
58  m_Nc2(2 * m_Nc),
59  m_Nvol(x.nvol()),
60  m_Nex(x.nex())
61  {
62  }
63 
64  double cmp_r(const int cc, const int site, const int e = 0)
65  const
66  {
67  return field[myindex(2 * cc, site, e)];
68  }
69 
70  double cmp_i(const int cc, const int site, const int e = 0)
71  const
72  {
73  return field[myindex(2 * cc + 1, site, e)];
74  }
75 
76  void set_r(const int cc, const int site, const int e,
77  const double re)
78  {
79  field[myindex(2 * cc, site, e)] = re;
80  }
81 
82  void set_i(const int cc, const int site, const int e,
83  const double im)
84  {
85  field[myindex(2 * cc + 1, site, e)] = im;
86  }
87 
88  void set_ri(const int cc, const int site, const int e,
89  const double re, const double im)
90  {
91  field[myindex(2 * cc, site, e)] = re;
92  field[myindex(2 * cc + 1, site, e)] = im;
93  }
94 
95  Vec_SU_N vec(const int site, const int e = 0) const
96  {
97  Vec_SU_N Tmp;
98 
99  for (int cc = 0; cc < m_Nc; ++cc) {
100  Tmp.set(cc, field[myindex(2 * cc, site, e)],
101  field[myindex(2 * cc + 1, site, e)]);
102  }
103  return Tmp;
104  }
105 
106  void set_vec(const int site, const int e, const Vec_SU_N& F)
107  {
108  for (int cc = 0; cc < m_Nc; ++cc) {
109  field[myindex(2 * cc, site, e)] = F.r(cc);
110  field[myindex(2 * cc + 1, site, e)] = F.i(cc);
111  }
112  }
113 
114  void add_vec(const int site, const int e, const Vec_SU_N& F)
115  {
116  for (int cc = 0; cc < m_Nc; ++cc) {
117  field[myindex(2 * cc, site, e)] += F.r(cc);
118  field[myindex(2 * cc + 1, site, e)] += F.i(cc);
119  }
120  }
121 
122  void clear_vec(const int site, const int e)
123  {
124  for (int cc = 0; cc < m_Nc2; ++cc) {
125  field[myindex(cc, site, e)] = 0.0;
126  }
127  }
128 
129  double operator*(const Field_F_1spinor&);
130 
131  template<typename T>
132  Field_F_1spinor& operator=(const T& rhs)
133  {
134  *this = rhs.eval();
135  return *this;
136  }
137 
138  template<typename T>
140  {
141  *this += rhs.eval();
142  return *this;
143  }
144 
145  template<typename T>
147  {
148  *this -= rhs.eval();
149  return *this;
150  }
151 
152  /*
153  */
154 
156  Field_F_1spinor& operator=(const double&);
159  Field_F_1spinor& operator*=(const double&);
160  Field_F_1spinor& operator*=(const dcomplex&);
161  Field_F_1spinor& operator/=(const double&);
162  Field_F_1spinor& operator/=(const dcomplex&);
163 };
164 
166 {
167  field = r;
168  return *this;
169 }
170 
171 
173 {
174  field = -field;
175  return *this;
176 }
177 
178 
180 {
181  field += rhs.field;
182  return *this;
183 }
184 
185 
187 {
188  field -= rhs.field;
189  return *this;
190 }
191 
192 
194 {
195  field *= rhs;
196  return *this;
197 }
198 
199 
201 {
202  field /= rhs;
203  return *this;
204 }
205 
206 
208 {
209  double a = (field * rhs.field).sum();
210  double b = Communicator::reduce_sum(a);
211 
212  return b;
213 }
214 #endif