Bridge++  Ver.2.1.3
forceSmear_APE.cpp
Go to the documentation of this file.
1 
12 
13 #ifdef USE_FACTORY_AUTOREGISTER
14 namespace {
15  bool init = ForceSmear_APE::register_factory();
16 }
17 #endif
18 
19 const std::string ForceSmear_APE::class_name = "ForceSmear_APE";
20 
21 //====================================================================
22 void ForceSmear_APE::init(const Parameters& params)
23 {
25 
26  std::string vlevel;
27  if (!params.fetch_string("verbose_level", vlevel)) {
28  m_vl = vout.set_verbose_level(vlevel);
29  } else {
31  }
32 
33  vout.general(m_vl, "%s: construction\n", class_name.c_str());
35 
38 
39  m_rho.resize(m_Ndim * m_Ndim);
40  for (int mu = 0; mu < m_Ndim; ++mu) {
41  for (int nu = 0; nu < m_Ndim; ++nu) {
42  m_rho[index(mu, nu)] = 0.0;
43  }
44  }
45 
46  set_parameters(params);
47 
48  m_shift = new ShiftField_lex();
49 
50  m_U.resize(m_Ndim);
51  m_iTheta.resize(m_Ndim);
52 
53  m_vt1 = new Field_G(m_Nvol, 1);
54  m_vt2 = new Field_G(m_Nvol, 1);
55  m_vt3 = new Field_G(m_Nvol, 1);
56  m_v1 = new Field_G(m_Nvol, 1);
57  m_v2 = new Field_G(m_Nvol, 1);
58 
59  m_ct1 = new Field_G(m_Nvol, 1);
60  m_ct2 = new Field_G(m_Nvol, 1);
61  m_xi = new Field_G(m_Nvol, 1);
62 
64  vout.general(m_vl, "%s: construction finished.\n",
65  class_name.c_str());
66 
67 }
68 
69 //====================================================================
71 {
72  delete m_shift;
73 
74  delete m_vt1;
75  delete m_vt2;
76  delete m_vt3;
77  delete m_v1;
78  delete m_v2;
79 
80  delete m_ct1;
81  delete m_ct2;
82  delete m_xi;
83 }
84 
85 //====================================================================
87 {
88  std::string vlevel;
89  if (!params.fetch_string("verbose_level", vlevel)) {
90  m_vl = vout.set_verbose_level(vlevel);
91  }
92 
93  //- fetch and check input parameters
94  double rho1;
95 
96  int err = 0;
97  err += params.fetch_double("rho_uniform", rho1);
98 
99  if (err) {
100  vout.crucial(m_vl, "Error at %s: input parameter not found.\n",
101  class_name.c_str());
102  exit(EXIT_FAILURE);
103  }
104 
105  set_parameters(rho1);
106 }
107 
108 
109 //====================================================================
110 void ForceSmear_APE::set_parameters(const double rho1)
111 {
112  int ith = ThreadManager::get_thread_id();
113  if (ith == 0) {
114  for (int mu = 0; mu < m_Ndim; ++mu) {
115  for (int nu = 0; nu < m_Ndim; ++nu) {
116  m_rho[index(mu, nu)] = rho1;
117  }
118  }
119  }
120 #pragma omp barrier
121 
122  vout.general(m_vl, "%s: parameters\n", class_name.c_str());
123  vout.general(m_vl, " rho = %8.4f\n", rho1);
124 
125 }
126 
127 
128 //====================================================================
129 void ForceSmear_APE::set_parameters(const std::vector<double>& rho)
130 {
131  assert(rho.size() == m_Ndim * m_Ndim);
132 
133  int ith = ThreadManager::get_thread_id();
134  if (ith == 0) {
135  for (int mu = 0; mu < m_Ndim; ++mu) {
136  for (int nu = 0; nu < m_Ndim; ++nu) {
137  m_rho[index(mu, nu)] = rho[index(mu, nu)];
138  }
139  }
140  }
141 #pragma omp barrier
142 
143  vout.general(m_vl, "%s: parameters\n", class_name.c_str());
144  for (int mu = 0; mu < m_Ndim; ++mu) {
145  vout.general(m_vl, " rho[%d] = %8.4f\n", mu, rho[mu]);
146  }
147 
148 }
149 
150 
151 //====================================================================
153 {
154  params.set_double_vector("rho", m_rho);
155 
156  params.set_string("verbose_level", vout.get_verbose_level(m_vl));
157 }
158 
159 
160 //====================================================================
162  const Field_G& Sigmap,
163  const Field_G& U)
164 {
165  const int Nc = CommonParameters::Nc();
166 
167  assert(Sigmap.nin() == (2 * Nc * Nc));
168  assert(Sigmap.nvol() == m_Nvol);
169  assert(Sigmap.nex() == m_Ndim);
170 
171  for (int mu = 0; mu < m_Ndim; ++mu) {
172  copy(m_U[mu], 0, U, mu);
173  }
174 #pragma omp barrier
175 
176  for (int mu = 0; mu < m_Ndim; ++mu) {
177  m_ct1->set(0.0);
178 #pragma omp barrier
179 
180  for (int nu = 0; nu < m_Ndim; ++nu) {
181  if (nu == mu) continue;
182  double rho = m_rho[index(mu, nu)];
183 
184  staple(*m_ct2, m_U[mu], m_U[nu], mu, nu);
185  axpy(*m_ct1, 0, rho, *m_ct2, 0);
186 #pragma omp barrier
187  }
188 
189  copy(*m_ct2, 0, Sigmap, mu);
190 #pragma omp barrier
191 
192  double alpha = m_rho[index(mu, mu)];
193 
195  alpha, *m_ct2, *m_ct1, m_U[mu]);
196  copy(Sigma, mu, *m_xi, 0);
197 #pragma omp barrier
198  }
199 
200  for (int mu = 0; mu < m_Ndim; ++mu) {
201  for (int nu = 0; nu < m_Ndim; ++nu) {
202  if (nu == mu) continue;
203  double rho = m_rho[index(mu, nu)];
204 
205  force_each(*m_ct2, m_U[mu], m_U[nu],
206  m_iTheta[mu], m_iTheta[nu], mu, nu);
207  axpy(Sigma, mu, rho, *m_ct2, 0);
208 #pragma omp barrier
209  }
210  }
211 }
212 
213 
214 //====================================================================
216  const Field_G& V_mu,
217  const Field_G& V_nu,
218  const Field_G& iTheta_mu,
219  const Field_G& iTheta_nu,
220  const int mu, const int nu)
221 {
222 #pragma omp barrier
223 
224  Sigma_mu.set(0.0);
225 #pragma omp barrier
226 
227  m_shift->backward(*m_vt1, V_nu, mu);
228  m_shift->backward(*m_vt2, V_mu, nu);
229  mult_Field_Gnd(*m_vt3, 0, *m_vt1, 0, *m_vt2, 0);
230  multadd_Field_Gnd(Sigma_mu, 0, *m_vt3, 0, iTheta_nu, 0, 1.0);
231 #pragma omp barrier
232 
233  mult_Field_Gdn(*m_vt3, 0, iTheta_mu, 0, V_nu, 0);
234  mult_Field_Gdn(*m_vt2, 0, *m_vt1, 0, *m_vt3, 0);
235  m_shift->forward(*m_vt3, *m_vt2, nu);
236  axpy(Sigma_mu, 1.0, *m_vt3);
237 #pragma omp barrier
238 
239  mult_Field_Gdn(*m_vt3, 0, V_mu, 0, iTheta_nu, 0);
240  mult_Field_Gdn(*m_vt2, 0, *m_vt1, 0, *m_vt3, 0);
241  m_shift->forward(*m_vt3, *m_vt2, nu);
242  axpy(Sigma_mu, 1.0, *m_vt3);
243 #pragma omp barrier
244 
245  m_shift->backward(*m_vt1, iTheta_nu, mu);
246  m_shift->backward(*m_vt2, V_mu, nu);
247  mult_Field_Gnd(*m_vt3, 0, *m_vt1, 0, *m_vt2, 0);
248  multadd_Field_Gnd(Sigma_mu, 0, *m_vt3, 0, V_nu, 0, 1.0);
249 #pragma omp barrier
250 
251  mult_Field_Gdd(*m_vt2, 0, *m_vt1, 0, V_mu, 0);
252  mult_Field_Gnn(*m_vt3, 0, *m_vt2, 0, V_nu, 0);
253  m_shift->forward(*m_vt2, *m_vt3, nu);
254  axpy(Sigma_mu, 1.0, *m_vt2);
255 #pragma omp barrier
256 
257  m_shift->backward(*m_vt1, V_nu, mu);
258  m_shift->backward(*m_vt2, iTheta_mu, nu);
259  mult_Field_Gnd(*m_vt3, 0, *m_vt1, 0, *m_vt2, 0);
260  multadd_Field_Gnd(Sigma_mu, 0, *m_vt3, 0, V_nu, 0, 1.0);
261 #pragma omp barrier
262 
263 }
264 
265 
266 //====================================================================
268  const Field_G& u_mu, const Field_G& u_nu,
269  const int mu, const int nu)
270 {
271  //- upper direction
272  m_shift->backward(*m_v1, u_mu, nu);
273  mult_Field_Gnn(*m_v2, 0, u_nu, 0, *m_v1, 0);
274  m_shift->backward(*m_v1, u_nu, mu);
275  mult_Field_Gnd(c, 0, *m_v2, 0, *m_v1, 0);
276 #pragma omp barrier
277 
278  //- lower direction
279  m_shift->backward(*m_v2, u_nu, mu);
280  mult_Field_Gnn(*m_v1, 0, u_mu, 0, *m_v2, 0);
281  mult_Field_Gdn(*m_v2, 0, u_nu, 0, *m_v1, 0);
282  m_shift->forward(*m_v1, *m_v2, nu);
283  axpy(c, 0, 1.0, *m_v1, 0);
284 #pragma omp barrier
285 }
286 
287 
288 //============================================================END=====
ForceSmear_APE::m_vt2
Field_G * m_vt2
Definition: forceSmear_APE.h:52
forceSmear_APE.h
mult_Field_Gdn
void mult_Field_Gdn(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:134
Parameters::set_string
void set_string(const string &key, const string &value)
Definition: parameters.cpp:39
ForceSmear_APE::m_shift
ShiftField_lex * m_shift
Definition: forceSmear_APE.h:44
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
ForceSmear_APE::m_v1
Field_G * m_v1
Definition: forceSmear_APE.h:49
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
ForceSmear_APE::m_ct2
Field_G * m_ct2
Definition: forceSmear_APE.h:56
Bridge::BridgeIO::decrease_indent
void decrease_indent()
Definition: bridgeIO.cpp:518
Bridge::BridgeIO::increase_indent
void increase_indent()
Definition: bridgeIO.cpp:508
Field::nex
int nex() const
Definition: field.h:128
ForceSmear_APE::force_each
void force_each(Field_G &, const Field_G &, const Field_G &, const Field_G &, const Field_G &, const int mu, const int nu)
Definition: forceSmear_APE.cpp:215
ForceSmear_APE::get_parameters
void get_parameters(Parameters &params) const
Definition: forceSmear_APE.cpp:152
ForceSmear_APE::m_xi
Field_G * m_xi
Definition: forceSmear_APE.h:57
CommonParameters::Nvol
static int Nvol()
Definition: commonParameters.h:109
ForceSmear_APE::m_rho
std::vector< double > m_rho
Definition: forceSmear_APE.h:39
axpy
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
Definition: field.cpp:381
Parameters::set_double_vector
void set_double_vector(const string &key, const vector< double > &value)
Definition: parameters.cpp:42
ForceSmear_APE::m_Nvol
int m_Nvol
spacetime dimension and volume
Definition: forceSmear_APE.h:38
ForceSmear_APE::tidyup
void tidyup()
Definition: forceSmear_APE.cpp:70
Field::nin
int nin() const
Definition: field.h:126
ForceSmear_APE::set_parameters
void set_parameters(const Parameters &params)
Definition: forceSmear_APE.cpp:86
AProjection::force_recursive
virtual void force_recursive(Field_G &Xi, Field_G &iTheta, const double alpha, const Field_G &Sigmap, const Field_G &C, const Field_G &U)=0
determination of fields for force calculation
copy
void copy(Field &y, const Field &x)
copy(y, x): y = x
Definition: field.cpp:213
ForceSmear_APE::index
int index(int mu, int nu)
Definition: forceSmear_APE.h:85
ForceSmear_APE::m_vl
Bridge::VerboseLevel m_vl
Definition: forceSmear_APE.h:40
CommonParameters::Nc
static int Nc()
Definition: commonParameters.h:115
ForceSmear_APE::m_v2
Field_G * m_v2
Definition: forceSmear_APE.h:50
ForceSmear_APE::m_U
std::vector< Field_G > m_U
Definition: forceSmear_APE.h:46
ForceSmear_APE::m_proj
Projection * m_proj
Definition: forceSmear_APE.h:42
ForceSmear_APE::m_ct1
Field_G * m_ct1
Definition: forceSmear_APE.h:55
ForceSmear_APE::init
void init(const Parameters &params)
Definition: forceSmear_APE.cpp:22
threadManager.h
Field::nvol
int nvol() const
Definition: field.h:127
ForceSmear_APE::m_vt1
Field_G * m_vt1
Definition: forceSmear_APE.h:51
ShiftField_lex
Methods to shift a field in the lexical site index.
Definition: shiftField_lex.h:39
multadd_Field_Gnd
void multadd_Field_Gnd(Field_G &W, const int ex, const Field_G &U1, const int ex1, const Field_G &U2, const int ex2, const double ff)
Definition: field_G_imp.cpp:335
ForceSmear_APE::force_udiv
void force_udiv(Field_G &Sigma, const Field_G &Sigma_p, const Field_G &U)
Definition: forceSmear_APE.cpp:161
CommonParameters::Vlevel
static Bridge::VerboseLevel Vlevel()
Definition: commonParameters.h:122
Bridge::BridgeIO::set_verbose_level
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:195
mult_Field_Gnn
void mult_Field_Gnn(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:95
ForceSmear_APE::m_vt3
Field_G * m_vt3
Definition: forceSmear_APE.h:53
ShiftField_lex::backward
void backward(Field &, const Field &, const int mu)
Definition: shiftField_lex.cpp:59
ForceSmear_APE::m_iTheta
std::vector< Field_G > m_iTheta
Definition: forceSmear_APE.h:47
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
Parameters::fetch_string
int fetch_string(const string &key, string &value) const
Definition: parameters.cpp:378
Parameters::fetch_double
int fetch_double(const string &key, double &value) const
Definition: parameters.cpp:327
ForceSmear_APE::staple
void staple(Field_G &, const Field_G &, const Field_G &, const int mu, const int nu)
Definition: forceSmear_APE.cpp:267
Bridge::BridgeIO::crucial
void crucial(const char *format,...)
Definition: bridgeIO.cpp:242
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
Bridge::BridgeIO::general
void general(const char *format,...)
Definition: bridgeIO.cpp:262
ForceSmear_APE::m_Ndim
int m_Ndim
Definition: forceSmear_APE.h:38
mult_Field_Gnd
void mult_Field_Gnd(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:173
ForceSmear_APE::class_name
static const std::string class_name
Definition: forceSmear_APE.h:34
ThreadManager::assert_single_thread
static void assert_single_thread(const std::string &class_name)
assert currently running on single thread.
Definition: threadManager.cpp:372
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