Bridge++  Ver.2.1.3
force_F_CloverTerm.cpp
Go to the documentation of this file.
1 
12 
13 const std::string Force_F_CloverTerm::class_name = "Force_F_CloverTerm";
14 
15 //====================================================================
17 {
19 
20  std::string vlevel;
21  if (!params.fetch_string("verbose_level", vlevel)) {
22  m_vl = vout.set_verbose_level(vlevel);
23  } else {
25  }
26 
27  vout.general(m_vl, "%s: construction\n", class_name.c_str());
29 
30  std::string repr;
31  if (!params.fetch_string("gamma_matrix_type", repr)) {
32  m_repr = repr;
33  } else {
34  m_repr = "Dirac"; // default gamma-matrix type
35  vout.general(m_vl, "gamma_matrix_type is not given: defalt = %s\n",
36  m_repr.c_str());
37  }
38 
39  if ((m_repr != "Dirac") && (m_repr != "Chiral")) {
40  vout.crucial("Error at %s: unsupported gamma-matrix type: %s\n",
41  class_name.c_str(), m_repr.c_str());
42  exit(EXIT_FAILURE);
43  }
44 
46  const int Nvol = CommonParameters::Nvol();
47 
48  m_boundary.resize(m_Ndim);
49 
50  //m_fopr_csw = new Fopr_CloverTerm(m_repr);
51  m_fopr_csw = new Fopr_CloverTerm(params);
52 
53  set_parameters_impl(params);
54 
55  m_shift = new ShiftField_lex();
56  m_staple = new Staple_lex();
57 
58  m_eta = new Field_F(Nvol, 1);
59  m_zeta = new Field_F(Nvol, 1);
60 
61  m_force1 = new Field_G(Nvol, 1);
62  m_force2 = new Field_G(Nvol, m_Ndim);
63 
64  m_Cud = new Field_G(Nvol, m_Ndim * m_Ndim);
65  m_Ut1 = new Field_G(Nvol, 1);
66  m_Ut2 = new Field_G(Nvol, 1);
67  m_Unu = new Field_G(Nvol, 1);
68 
69  m_eta2 = new Field_F(Nvol, 1);
70  m_eta3 = new Field_F(Nvol, 1);
71  m_zeta_mu = new Field_F(Nvol, 1);
72 
73  m_vt1 = new Field_F(Nvol, 1);
74  m_vt2 = new Field_F(Nvol, 1);
75  m_vt3 = new Field_F(Nvol, 1);
76  m_vt4 = new Field_F(Nvol, 1);
77 
79  vout.general(m_vl, "%s: construction finished.\n",
80  class_name.c_str());
81 
82 }
83 
84 //====================================================================
85 void Force_F_CloverTerm::init(const std::string repr)
86 {
88 
90 
91  vout.general(m_vl, "%s: construction (obsolete)\n",
92  class_name.c_str());
94 
95  m_repr = repr;
96 
98  const int Nvol = CommonParameters::Nvol();
99 
100  m_boundary.resize(m_Ndim);
101 
103 
104  m_shift = new ShiftField_lex();
105  m_staple = new Staple_lex();
106 
107  m_eta = new Field_F(Nvol, 1);
108  m_zeta = new Field_F(Nvol, 1);
109 
110  m_force1 = new Field_G(Nvol, 1);
111  m_force2 = new Field_G(Nvol, m_Ndim);
112 
113  m_Cud = new Field_G(Nvol, m_Ndim * m_Ndim);
114  m_Ut1 = new Field_G(Nvol, 1);
115  m_Ut2 = new Field_G(Nvol, 1);
116  m_Unu = new Field_G(Nvol, 1);
117 
118  m_eta2 = new Field_F(Nvol, 1);
119  m_eta3 = new Field_F(Nvol, 1);
120  m_zeta_mu = new Field_F(Nvol, 1);
121 
122  m_vt1 = new Field_F(Nvol, 1);
123  m_vt2 = new Field_F(Nvol, 1);
124  m_vt3 = new Field_F(Nvol, 1);
125  m_vt4 = new Field_F(Nvol, 1);
126 
128  vout.general(m_vl, "%s: construction finished.\n",
129  class_name.c_str());
130 }
131 
132 
133 //====================================================================
135 {
137 
138  delete m_fopr_csw;
139  delete m_shift;
140  delete m_staple;
141 
142  delete m_eta;
143  delete m_zeta;
144 
145  delete m_Cud;
146  delete m_Ut1;
147  delete m_Ut2;
148  delete m_Unu;
149 
150  delete m_force1;
151  delete m_force2;
152 
153  delete m_eta2;
154  delete m_eta3;
155  delete m_zeta_mu;
156 
157  delete m_vt1;
158  delete m_vt2;
159  delete m_vt3;
160  delete m_vt4;
161 }
162 
163 //====================================================================
165 {
166  set_parameters_impl(params);
167  m_fopr_csw->set_parameters(params);
168 }
169 
170 
171 //====================================================================
173 {
174 #pragma omp barrier
175 
176  int ith = ThreadManager::get_thread_id();
177  if (ith == 0) {
178  std::string vlevel;
179  if (!params.fetch_string("verbose_level", vlevel)) {
180  m_vl = vout.set_verbose_level(vlevel);
181  }
182  }
183 #pragma omp barrier
184 
185  //- fetch and check input parameters
186  double kappa, cSW;
187  std::vector<int> bc;
188 
189  int err = 0;
190  err += params.fetch_double("hopping_parameter", kappa);
191  err += params.fetch_double("clover_coefficient", cSW);
192  err += params.fetch_int_vector("boundary_condition", bc);
193 
194  if (err) {
195  vout.crucial(m_vl, "Error at %s: input parameter not found.\n",
196  class_name.c_str());
197  exit(EXIT_FAILURE);
198  }
199 
200  set_parameters_impl(kappa, cSW, bc);
201 
202 }
203 
204 
205 //====================================================================
206 void Force_F_CloverTerm::set_parameters(const double kappa,
207  const double cSW,
208  const std::vector<int> bc)
209 {
210  set_parameters_impl(kappa, cSW, bc);
212 }
213 
214 //====================================================================
216  const double cSW,
217  const std::vector<int> bc)
218 {
219 #pragma omp barrier
220 
221  //- range check
222  assert(bc.size() == m_Ndim);
223 
224  int ith = ThreadManager::get_thread_id();
225  if (ith == 0) {
226  m_kappa = kappa;
227  m_cSW = cSW;
228  m_boundary = bc;
229  }
230 #pragma omp barrier
231 
232  //- print input parameters
233  vout.general(m_vl, "%s: parameters\n", class_name.c_str());
234  vout.general(m_vl, " kappa = %12.8f\n", m_kappa);
235  vout.general(m_vl, " cSW = %12.8f\n", m_cSW);
236  for (int mu = 0; mu < m_Ndim; ++mu) {
237  vout.general(m_vl, " boundary[%d] = %2d\n", mu, m_boundary[mu]);
238  }
239 
240 }
241 
242 //====================================================================
244 {
245  params.set_double("hopping_parameter", m_kappa);
246  params.set_double("clover_coefficient", m_cSW);
247  params.set_int_vector("boundary_condition", m_boundary);
248  params.set_string("gamma_matrix_type", m_repr);
249 
250  params.set_string("verbose_level", vout.get_verbose_level(m_vl));
251 }
252 
253 //====================================================================
255 {
256 #pragma omp barrier
257 
258  int ith = ThreadManager::get_thread_id();
259  if (ith == 0) m_U = (Field_G *)U;
260 #pragma omp barrier
261 
263  set_component();
264 }
265 
266 //====================================================================
267 // override default force_core() in base class
269 {
270  vout.crucial(m_vl, "Error at %s: force_core() is not available.\n",
271  class_name.c_str());
272  exit(EXIT_FAILURE);
273 }
274 
275 
276 //====================================================================
278 {
279  vout.crucial(m_vl, "Error at %s: force_udiv() is not available.\n",
280  class_name.c_str());
281  exit(EXIT_FAILURE);
282 }
283 
284 
285 //====================================================================
287  const Field& zeta_, const Field& eta_)
288 {
289 #pragma omp barrier
290 
291  copy(*m_eta, eta_);
292  copy(*m_zeta, zeta_);
293 #pragma omp barrier
294 
296 
297  copy(force_, *m_force2); // force_ = force;
298 
299 #pragma omp barrier
300 }
301 
302 
303 //====================================================================
305  const Field_F& zeta,
306  const Field_F& eta)
307 {
308 #pragma omp barrier
309 
310  m_force2->set(0.0);
311 #pragma omp barrier
312 
313  m_fopr_csw->mult_gm5(*m_eta2, eta);
314 
315  double fac = -m_kappa * m_cSW / 8.0;
316 
317  for (int mu = 0; mu < m_Ndim; ++mu) {
318  for (int nu = 0; nu < m_Ndim; ++nu) {
319  if (nu == mu) continue;
320 
321  m_fopr_csw->mult_isigma(*m_eta3, *m_eta2, mu, nu);
322 
323  copy(*m_Unu, 0, *m_U, nu);
324 #pragma omp barrier
325 
326  // R(1) and R(5)
327  mult_Field_Gd(*m_vt1, 0, *m_Cud, index_dir(mu, nu), *m_eta3, 0);
329  axpy(force, mu, 1.0, *m_force1, 0);
330 #pragma omp barrier
331 
332  // R(2)
333  mult_Field_Gd(*m_vt3, 0, *m_U, mu, *m_eta3, 0);
334  m_shift->backward(*m_vt2, zeta, nu);
335  m_shift->backward(*m_vt1, *m_vt3, nu);
336  m_shift->backward(*m_Ut1, *m_Unu, mu);
337  mult_Field_Gn(*m_vt3, 0, *m_Ut1, 0, *m_vt1, 0);
338  mult_Field_Gn(*m_vt4, 0, *m_U, nu, *m_vt2, 0);
340  axpy(force, mu, 1.0, *m_force1, 0);
341 #pragma omp barrier
342 
343  // R(4) and R(8)
344  m_shift->backward(*m_vt1, *m_eta3, mu);
345  m_shift->backward(*m_zeta_mu, zeta, mu);
346  mult_Field_Gn(*m_vt4, 0, *m_Cud, index_dir(mu, nu), *m_zeta_mu, 0);
348  axpy(force, mu, 1.0, *m_force1, 0);
349 #pragma omp barrier
350 
351  // R(3)
352  m_shift->backward(*m_vt1, *m_eta3, nu);
353  mult_Field_Gn(*m_vt3, 0, *m_U, nu, *m_vt1, 0);
354  m_shift->backward(*m_vt1, *m_vt3, mu);
355  mult_Field_Gn(*m_vt4, 0, *m_U, mu, *m_zeta_mu, 0);
356  m_shift->backward(*m_vt2, *m_vt4, nu);
357  mult_Field_Gn(*m_vt4, 0, *m_U, nu, *m_vt2, 0);
359  axpy(force, mu, 1.0, *m_force1, 0);
360 #pragma omp barrier
361 
362  // R(6)
363  m_shift->backward(*m_Ut1, *m_Unu, mu);
364  mult_Field_Gdd(*m_Ut2, 0, *m_Ut1, 0, *m_U, mu);
365  mult_Field_Gn(*m_vt1, 0, *m_Ut2, 0, *m_eta3, 0);
366  mult_Field_Gd(*m_vt2, 0, *m_U, nu, zeta, 0);
367  m_shift->forward(*m_vt3, *m_vt1, nu);
368  m_shift->forward(*m_vt4, *m_vt2, nu);
370  axpy(force, mu, -1.0, *m_force1, 0);
371 #pragma omp barrier
372 
373  // R(7)
374  mult_Field_Gd(*m_vt1, 0, *m_U, nu, *m_eta3, 0);
375  mult_Field_Gn(*m_vt2, 0, *m_U, mu, *m_zeta_mu, 0);
376  m_shift->backward(*m_vt3, *m_vt1, mu);
377  m_shift->forward(*m_vt1, *m_vt3, nu);
378  mult_Field_Gd(*m_vt4, 0, *m_U, nu, *m_vt2, 0);
379  m_shift->forward(*m_vt2, *m_vt4, nu);
381  axpy(force, mu, -1.0, *m_force1, 0);
382 #pragma omp barrier
383 
384  } // nu-loop
385 
386  scal(force, mu, fac);
387 #pragma omp barrier
388 
389  } // mu-loop
390 
391 }
392 
393 
394 //====================================================================
396 {
397 #pragma omp barrier
398 
399  for (int mu = 0; mu < m_Ndim; ++mu) {
400  for (int nu = 0; nu < m_Ndim; ++nu) {
401  if (nu == mu) continue;
402 
403  m_staple->upper(*m_Ut1, *m_U, mu, nu);
404  copy(*m_Cud, index_dir(mu, nu), *m_Ut1, 0);
405 #pragma omp barrier
406 
407  m_staple->lower(*m_Ut1, *m_U, mu, nu);
408  axpy(*m_Cud, index_dir(mu, nu), -1.0, *m_Ut1, 0);
409 #pragma omp barrier
410  }
411  }
412 }
413 
414 
415 //============================================================END=====
Force_F_CloverTerm::m_eta
Field_F * m_eta
Definition: force_F_CloverTerm.h:52
Force_F_CloverTerm::m_vt4
Field_F * m_vt4
Definition: force_F_CloverTerm.h:69
Org::Fopr_CloverTerm::mult_gm5
void mult_gm5(Field &v, const Field &w)
multiplies gamma_5 matrix.
Definition: fopr_CloverTerm_impl.cpp:280
Force_F_CloverTerm::m_force1
Field_G * m_force1
Definition: force_F_CloverTerm.h:55
Force_F_CloverTerm::m_vt3
Field_F * m_vt3
Definition: force_F_CloverTerm.h:68
Force_F_CloverTerm::m_vt1
Field_F * m_vt1
Definition: force_F_CloverTerm.h:66
Parameters::set_string
void set_string(const string &key, const string &value)
Definition: parameters.cpp:39
Force_F_CloverTerm::m_eta2
Field_F * m_eta2
Definition: force_F_CloverTerm.h:62
ShiftField_lex::forward
void forward(Field &, const Field &, const int mu)
Definition: shiftField_lex.cpp:79
CommonParameters::Ndim
static int Ndim()
Definition: commonParameters.h:117
Field::set
void set(const int jin, const int site, const int jex, double v)
Definition: field.h:175
Parameters
Class for parameters.
Definition: parameters.h:46
Parameters::set_double
void set_double(const string &key, const double value)
Definition: parameters.cpp:33
Force_F_CloverTerm::tidyup
void tidyup()
final clean-up.
Definition: force_F_CloverTerm.cpp:134
Bridge::BridgeIO::decrease_indent
void decrease_indent()
Definition: bridgeIO.cpp:518
Force_F_CloverTerm::m_vt2
Field_F * m_vt2
Definition: force_F_CloverTerm.h:67
Force_F_CloverTerm::m_shift
ShiftField_lex * m_shift
Field shifter.
Definition: force_F_CloverTerm.h:49
Bridge::BridgeIO::increase_indent
void increase_indent()
Definition: bridgeIO.cpp:508
Force_F_CloverTerm::m_zeta
Field_F * m_zeta
Definition: force_F_CloverTerm.h:53
Force_F_CloverTerm::m_Ut1
Field_G * m_Ut1
Definition: force_F_CloverTerm.h:58
Fopr_CloverTerm
Org::Fopr_CloverTerm Fopr_CloverTerm
Clover term operator.
Definition: fopr_CloverTerm.h:58
CommonParameters::Nvol
static int Nvol()
Definition: commonParameters.h:109
Force_F_CloverTerm::m_Unu
Field_G * m_Unu
Definition: force_F_CloverTerm.h:60
Force_F_CloverTerm::m_zeta_mu
Field_F * m_zeta_mu
Definition: force_F_CloverTerm.h:64
Staple_lex::lower
void lower(Field_G &, const Field_G &, const int mu, const int nu)
constructs lower staple in mu-nu plane.
Definition: staple_lex.cpp:283
axpy
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
Definition: field.cpp:381
mult_Field_Gd
void mult_Field_Gd(Field_F &y, const int ex, const Field_G &u, int ex1, const Field_F &x, int ex2)
Definition: field_F_imp.cpp:76
Force_F_CloverTerm::force_udiv1
void force_udiv1(Field &force, const Field &zeta, const Field &eta)
For recursive calculation of smeared force.
Definition: force_F_CloverTerm.cpp:286
Org::Fopr_CloverTerm::mult_isigma
void mult_isigma(Field_F &, const Field_F &, const int mu, const int nu)
Definition: fopr_CloverTerm_impl.cpp:296
Org::Fopr_CloverTerm::set_config
void set_config(Field *U)
sets the gauge configuration.
Definition: fopr_CloverTerm_impl.cpp:197
Org::Fopr_CloverTerm::set_parameters
void set_parameters(const Parameters &params)
sets parameters by a Parameter object: to be implemented in a subclass.
Definition: fopr_CloverTerm_impl.cpp:125
copy
void copy(Field &y, const Field &x)
copy(y, x): y = x
Definition: field.cpp:213
tensorProd_Field_F
void tensorProd_Field_F(Field_G &u, const Field_F &v1, const Field_F &v2)
Definition: tensorProd.cpp:35
Force_F_CloverTerm::set_config
void set_config(Field *U)
Setting gauge configuration.
Definition: force_F_CloverTerm.cpp:254
Force_F_CloverTerm::force_core
void force_core(Field &force, const Field &eta)
Force determination for clover fermion.
Definition: force_F_CloverTerm.cpp:268
Force_F_CloverTerm::m_repr
std::string m_repr
gamma matrix representation
Definition: force_F_CloverTerm.h:43
Force_F_CloverTerm::force_udiv
void force_udiv(Field &force, const Field &eta)
For recursive calculation of smeared force.
Definition: force_F_CloverTerm.cpp:277
Force_F_CloverTerm::set_component
void set_component()
Set building components for force calculation.
Definition: force_F_CloverTerm.cpp:395
Force_F_CloverTerm::set_parameters
void set_parameters(const Parameters &params)
Setting parameters of clover fermion force.
Definition: force_F_CloverTerm.cpp:164
Parameters::fetch_int_vector
int fetch_int_vector(const string &key, vector< int > &value) const
Definition: parameters.cpp:429
Force_F_CloverTerm::m_boundary
std::vector< int > m_boundary
boundary conditions
Definition: force_F_CloverTerm.h:40
Force_F_CloverTerm::m_kappa
double m_kappa
hopping parameter
Definition: force_F_CloverTerm.h:38
threadManager.h
Force_F_CloverTerm::index_dir
int index_dir(const int mu, const int nu)
Definition: force_F_CloverTerm.h:135
Force_F_CloverTerm::set_parameters_impl
void set_parameters_impl(const Parameters &params)
Setting parameters of clover fermion force.
Definition: force_F_CloverTerm.cpp:172
Force_F_CloverTerm::m_staple
Staple_lex * m_staple
Staple constructor.
Definition: force_F_CloverTerm.h:50
Force_F_CloverTerm::m_eta3
Field_F * m_eta3
Definition: force_F_CloverTerm.h:63
Parameters::set_int_vector
void set_int_vector(const string &key, const vector< int > &value)
Definition: parameters.cpp:45
ShiftField_lex
Methods to shift a field in the lexical site index.
Definition: shiftField_lex.h:39
Force_F_CloverTerm::force_udiv1_impl
void force_udiv1_impl(Field_G &force, const Field_F &zeta, const Field_F &eta)
Core implemetation of clover force calculation.
Definition: force_F_CloverTerm.cpp:304
Staple_lex::upper
void upper(Field_G &, const Field_G &, const int mu, const int nu)
constructs upper staple in mu-nu plane.
Definition: staple_lex.cpp:260
force_F_CloverTerm.h
Force_F_CloverTerm::m_fopr_csw
Fopr_CloverTerm * m_fopr_csw
fermion operator
Definition: force_F_CloverTerm.h:45
Force_F_CloverTerm::m_Ndim
int m_Ndim
spacetime dimension
Definition: force_F_CloverTerm.h:37
CommonParameters::Vlevel
static Bridge::VerboseLevel Vlevel()
Definition: commonParameters.h:122
Staple_lex
Staple construction.
Definition: staple_lex.h:39
AForce_F< Field >::m_U
Field_G * m_U
Gauge configuration.
Definition: aforce_F.h:42
Bridge::BridgeIO::set_verbose_level
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:195
AForce_F< Field >::init
virtual void init()
initializer.
Force_F_CloverTerm::m_force2
Field_G * m_force2
Definition: force_F_CloverTerm.h:56
ShiftField_lex::backward
void backward(Field &, const Field &, const int mu)
Definition: shiftField_lex.cpp:59
Force_F_CloverTerm::m_Ut2
Field_G * m_Ut2
Definition: force_F_CloverTerm.h:59
mult_Field_Gn
void mult_Field_Gn(Field_F &y, const int ex, const Field_G &u, int ex1, const Field_F &x, int ex2)
Definition: field_F_imp.cpp:36
mult_Field_Gdd
void mult_Field_Gdd(Field_G &W, const int ex, const Field_G &U1, const int ex1, const Field_G &U2, const int ex2)
Definition: field_G_imp.cpp:212
scal
void scal(Field &x, const double a)
scal(x, a): x = a * x
Definition: field.cpp:262
Force_F_CloverTerm::m_Cud
Field_G * m_Cud
for force calculation
Definition: force_F_CloverTerm.h:47
Parameters::fetch_string
int fetch_string(const string &key, string &value) const
Definition: parameters.cpp:378
Force_F_CloverTerm::m_vl
Bridge::VerboseLevel m_vl
verbose level
Definition: force_F_CloverTerm.h:41
Field_F
Wilson-type fermion field.
Definition: field_F.h:37
Parameters::fetch_double
int fetch_double(const string &key, double &value) const
Definition: parameters.cpp:327
Bridge::BridgeIO::crucial
void crucial(const char *format,...)
Definition: bridgeIO.cpp:242
Field
Container of Field-type object.
Definition: field.h:46
ThreadManager::get_thread_id
static int get_thread_id()
returns thread id.
Definition: threadManager.cpp:253
Field_G
SU(N) gauge field.
Definition: field_G.h:38
Force_F_CloverTerm::class_name
static const std::string class_name
Definition: force_F_CloverTerm.h:34
Bridge::BridgeIO::general
void general(const char *format,...)
Definition: bridgeIO.cpp:262
Force_F_CloverTerm::m_cSW
double m_cSW
clover coefficient
Definition: force_F_CloverTerm.h:39
ThreadManager::assert_single_thread
static void assert_single_thread(const std::string &class_name)
assert currently running on single thread.
Definition: threadManager.cpp:372
Force_F_CloverTerm::get_parameters
void get_parameters(Parameters &params) const
Getting parameters of clover fermion force.
Definition: force_F_CloverTerm.cpp:243
Bridge::vout
BridgeIO vout
Definition: bridgeIO.cpp:572
Bridge::BridgeIO::get_verbose_level
static std::string get_verbose_level(const VerboseLevel vl)
Definition: bridgeIO.cpp:216