Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
fopr_Domainwall.cpp
Go to the documentation of this file.
1 
14 #include "fopr_Domainwall.h"
15 
16 #ifdef USE_PARAMETERS_FACTORY
17 #include "parameters_factory.h"
18 #endif
19 
20 using std::valarray;
21 using std::string;
22 
23 //- parameter entries
24 namespace {
25  void append_entry(Parameters& param)
26  {
27  param.Register_string("gamma_matrix_type", "NULL");
28  param.Register_double("quark_mass", 0.0);
29  param.Register_double("domain_wall_height", 0.0);
30  param.Register_int("extent_of_5th_dimension", 0);
31  param.Register_int_vector("boundary_condition", std::valarray<int>());
32 
33  param.Register_string("verbose_level", "NULL");
34  }
35 
36 
37 #ifdef USE_PARAMETERS_FACTORY
38  bool init_param = ParametersFactory::Register("Fopr.Domainwall", append_entry);
39 #endif
40 }
41 //- end
42 
43 //- parameters class
45 //- end
46 
47 //====================================================================
49 {
50  const string str_vlevel = params.get_string("verbose_level");
51 
52  m_vl = vout.set_verbose_level(str_vlevel);
53 
54  //- fetch and check input parameters
55  string str_gmset_type;
56  double mq, M0;
57  int Ns;
58  valarray<int> bc;
59 
60  int err = 0;
61  int err_optional = 0;
62  err_optional += params.fetch_string("gamma_matrix_type", str_gmset_type);
63  err += params.fetch_double("quark_mass", mq);
64  err += params.fetch_double("domain_wall_height", M0);
65  err += params.fetch_int("extent_of_5th_dimension", Ns);
66  err += params.fetch_int_vector("boundary_condition", bc);
67 
68  if (err) {
69  vout.crucial(m_vl, "Fopr_Domainwall: fetch error, input parameter not found.\n");
70  abort();
71  }
72 
73 
74  set_parameters(mq, M0, Ns, bc);
75 }
76 
77 
78 //====================================================================
79 void Fopr_Domainwall::set_parameters(const double mq, const double M0,
80  const int Ns, const valarray<int> bc)
81 {
82  int Ndim = CommonParameters::Ndim();
83 
84  //- print input parameters
85  vout.general(m_vl, "Parameters of domain-wall fermion operator:\n");
86  vout.general(m_vl, " mq = %8.4f\n", mq);
87  vout.general(m_vl, " M0 = %8.4f\n", M0);
88  vout.general(m_vl, " Ns = %4d\n", Ns);
89  for (int mu = 0; mu < Ndim; ++mu) {
90  vout.general(m_vl, " boundary[%d] = %2d\n", mu, bc[mu]);
91  }
92 
93  //- range check
94  int err = 0;
95  err += ParameterCheck::non_zero(mq);
96  err += ParameterCheck::non_zero(M0);
97  err += ParameterCheck::non_zero(Ns);
98 
99  if (err) {
100  vout.crucial(m_vl, "Fopr_Domainwall: parameter range check failed.\n");
101  abort();
102  }
103 
104  assert(bc.size() == Ndim);
105 
106  //- store values
107  m_mq = mq;
108  m_M0 = M0;
109  m_Ns = Ns;
110 
111  m_boundary.resize(Ndim);
112  for (int mu = 0; mu < Ndim; ++mu) {
113  m_boundary[mu] = bc[mu];
114  }
115 
116  //- propagate parameters
117  double kappa = 1.0 / (8.0 - 2.0 * m_M0);
119 }
120 
121 
122 //====================================================================
124 {
125  return H(H(w));
126 }
127 
128 
129 //====================================================================
131 {
132  Field v(w);
133 
134  if (ipm == 1) {
135  v += m_fopr_w->mult_gm5(w);
136  } else if (ipm == -1) {
137  v -= m_fopr_w->mult_gm5(w);
138  } else {
139  vout.crucial(m_vl, "Fopr_Domainwall: illegal chirality = %d.\n", ipm);
140  abort();
141  }
142 
143  v *= 0.5;
144 
145  return v;
146 }
147 
148 
149 //====================================================================
151 {
152  return H(mult_gm5R(w));
153 }
154 
155 
156 //====================================================================
158 {
159  return mult_gm5R(D(w));
160 }
161 
162 
163 //====================================================================
165 {
166  int Nc = CommonParameters::Nc();
167  int Nd = CommonParameters::Nd();
168  int Nvol = CommonParameters::Nvol();
169  int NinF = 2 * Nc * Nd;
170 
171  assert(w.nin() == NinF);
172  assert(w.nvol() == Nvol);
173  assert(w.nex() == m_Ns);
174 
175  Field v(NinF, Nvol, m_Ns);
176  Field w4(NinF, Nvol, 1), v4(NinF, Nvol, 1);
177 
178  for (int is = 0; is < m_Ns; ++is) {
179  w4.setpart_ex(0, w, is);
180  v4 = m_fopr_w->mult_gm5(w4);
181  v.setpart_ex(m_Ns - 1 - is, v4, 0);
182  }
183 
184  return v;
185 }
186 
187 
188 //====================================================================
190 {
191  int Nc = CommonParameters::Nc();
192  int Nd = CommonParameters::Nd();
193  int Nvol = CommonParameters::Nvol();
194  int NinF = 2 * Nc * Nd;
195 
196  assert(w.nin() == NinF);
197  assert(w.nvol() == Nvol);
198  assert(w.nex() == m_Ns);
199 
200  Field v(NinF, Nvol, m_Ns);
201  Field w4(NinF, Nvol, 1), w4_up(NinF, Nvol, 1), w4_dn(NinF, Nvol, 1);
202  Field v4(NinF, Nvol, 1);
203 
204  for (int is = 0; is < m_Ns; ++is) {
205  w4.setpart_ex(0, w, is);
206  m_fopr_w->set_mode("D");
207  v4 = m_fopr_w->mult(w4);
209 
210  int is_up = (is + 1) % m_Ns;
211  double Fup = -0.5;
212  if (is == m_Ns - 1) Fup = m_mq / 2.0;
213  w4_up.setpart_ex(0, w, is_up);
214  w4_up -= m_fopr_w->mult_gm5(w4_up);
215  w4.addpart_ex(0, w4_up, 0, Fup);
216 
217  int is_dn = (is - 1 + m_Ns) % m_Ns;
218  double Fdn = -0.5;
219  if (is == 0) Fdn = m_mq / 2.0;
220  w4_dn.setpart_ex(0, w, is_dn);
221  w4_dn += m_fopr_w->mult_gm5(w4_dn);
222  w4.addpart_ex(0, w4_dn, 0, Fdn);
223 
224  v.setpart_ex(is, v4, 0);
225  v.addpart_ex(is, w4, 0);
226  }
227 
228  return v;
229 }
230 
231 
232 //====================================================================
233 //============================================================END=====