Bridge++  Ver. 1.3.x
polyakovLoop.cpp
Go to the documentation of this file.
1 
14 #include "polyakovLoop.h"
15 
16 #ifdef USE_PARAMETERS_FACTORY
17 #include "parameters_factory.h"
18 #endif
19 
20 
21 //- parameter entries
22 namespace {
23  void append_entry(Parameters& param)
24  {
25  param.Register_int("spatial_correlator_size", 0);
26  param.Register_int("number_of_correlator_type", 0);
27 
28  param.Register_string("verbose_level", "NULL");
29  }
30 
31 
32 #ifdef USE_PARAMETERS_FACTORY
33  bool init_param = ParametersFactory::Register("PolyakovLoop", append_entry);
34 #endif
35 }
36 //- end
37 
38 //- parameters class
40 //- end
41 
42 const std::string PolyakovLoop::class_name = "PolyakovLoop";
43 
44 //====================================================================
46 {
47  const string str_vlevel = params.get_string("verbose_level");
48 
49  m_vl = vout.set_verbose_level(str_vlevel);
50 
51  //- fetch and check input parameters
52  int Nspc_size, Ntype;
53 
54  int err = 0;
55  err += params.fetch_int("spatial_correlator_size", Nspc_size);
56  err += params.fetch_int("number_of_correlator_type", Ntype);
57 
58  if (err) {
59  vout.crucial(m_vl, "%s: fetch error, input parameter not found.\n", class_name.c_str());
60  exit(EXIT_FAILURE);
61  }
62 
63 
64  set_parameters(Nspc_size, Ntype);
65 }
66 
67 
68 //====================================================================
69 void PolyakovLoop::set_parameters(int Nspc_size, int Ntype)
70 {
71  //- print input parameters
72  vout.general(m_vl, "Polyakov loop measurement:\n");
73  vout.general(m_vl, " Nspc_size = %d\n", Nspc_size);
74  vout.general(m_vl, " Ntype = %d\n", Ntype);
75 
76  //- range check
77  int err = 0;
78  err += ParameterCheck::non_negative(Nspc_size);
79  err += ParameterCheck::non_negative(Ntype);
80 
83  if (Ntype > 6) ++err;
84 
85  if (err) {
86  vout.crucial(m_vl, "%s: parameter range check failed.\n", class_name.c_str());
87  exit(EXIT_FAILURE);
88  }
89 
90  //- store values
91  m_Nspc_size = Nspc_size;
92  m_Ntype = Ntype;
93 
94 
95  //- post-process
99  m_Nt_ext = 1;
101 
104  m_Nmax[0] = Nspc_size;
105  m_Nmax[1] = Nspc_size;
106  m_Nmax[2] = Nspc_size / 2;
107  m_Nmax[3] = Nspc_size;
108  m_Nmax[4] = Nspc_size / 2;
109  m_Nmax[5] = Nspc_size / 2;
110 }
111 
112 
113 //====================================================================
115 {
116  int Ndim = CommonParameters::Ndim();
117 
118  assert(Ndim == 4);
119 
120  m_Ntype_max = 6;
121  int Ndim_spc = Ndim - 1;
122 
123  m_Nunit.resize(m_Ntype_max);
124  m_Nmax.resize(m_Ntype_max);
125 
126  for (int i = 0; i < m_Ntype_max; ++i) {
127  m_Nunit[i].resize(Ndim_spc);
128  }
129 
130  // The following setting explicitly depends on the definition
131  // of unit vectors.
132  assert(m_Ntype_max >= 6);
133 
134  m_Nunit[0][0] = 1;
135  m_Nunit[0][1] = 0;
136  m_Nunit[0][2] = 0;
137 
138  m_Nunit[1][0] = 1;
139  m_Nunit[1][1] = 1;
140  m_Nunit[1][2] = 0;
141 
142  m_Nunit[2][0] = 2;
143  m_Nunit[2][1] = 1;
144  m_Nunit[2][2] = 0;
145 
146  m_Nunit[3][0] = 1;
147  m_Nunit[3][1] = 1;
148  m_Nunit[3][2] = 1;
149 
150  m_Nunit[4][0] = 2;
151  m_Nunit[4][1] = 1;
152  m_Nunit[4][2] = 1;
153 
154  m_Nunit[5][0] = 2;
155  m_Nunit[5][1] = 2;
156  m_Nunit[5][2] = 1;
157 }
158 
159 
160 //====================================================================
162 {
163  int Ndim = CommonParameters::Ndim();
164  int Nx = CommonParameters::Nx();
165  int Ny = CommonParameters::Ny();
166  int Nz = CommonParameters::Nz();
167  int Nc = CommonParameters::Nc();
168  int Npet = Communicator::npe(Ndim - 1);
169  int Lvol_spc = CommonParameters::Lvol() / CommonParameters::Lt();
170  int Nvol_spc = Nx * Ny * Nz;
171 
172  Field_G P(Nvol_spc, 1);
173 
174  calc_ploop(P, U);
175 
176  Mat_SU_N utmp(Nc);
177  double re_tr = 0.0;
178  double im_tr = 0.0;
179  for (int site = 0; site < Nvol_spc; ++site) {
180  P.mat(utmp, site, 0);
181 
182  re_tr += ReTr(utmp);
183  im_tr += ImTr(utmp);
184  }
185  re_tr /= (double(Nc));
186  im_tr /= (double(Nc));
187 
188  double re_ploop = Communicator::reduce_sum(re_tr);
189  double im_ploop = Communicator::reduce_sum(im_tr);
190 
191  re_ploop /= double(Lvol_spc * Npet);
192  im_ploop /= double(Lvol_spc * Npet);
193 
194  vout.detailed(m_vl, "Polyakov loop = %e %e\n", re_ploop, im_ploop);
195 
196  // dcomplex ploop = dcomplex(re_ploop,im_ploop);
197  dcomplex ploop = cmplx(re_ploop, im_ploop);
198 
199  return ploop;
200 }
201 
202 
203 //====================================================================
205 {
206  int Ndim = CommonParameters::Ndim();
207  // int Ndim_spc = Ndim - 1;
208 
209  int Nx = CommonParameters::Nx();
210  int Ny = CommonParameters::Ny();
211  int Nz = CommonParameters::Nz();
212  int Nt = CommonParameters::Nt();
213  int Nc = CommonParameters::Nc();
214 
215  int Nvol = U.nvol();
216 
217  assert(Nvol == Nx * Ny * Nz * Nt);
218 
219  int Nvol_spc = P.nvol();
220  assert(Nvol_spc == Nx * Ny * Nz);
221 
222  Index_lex index;
223  Index_lex index_spc(Nx, Ny, Nz, 1);
224 
225  Field_G Ut(Nvol, 1);
226  Mat_SU_N utmp1(Nc), utmp2(Nc), utmp3(Nc);
227 
228  Ut.setpart_ex(0, U, Ndim - 1);
229 
230  //- Definition of local Polyakov loops
231  int t = 0;
232  for (int z = 0; z < Nz; ++z) {
233  for (int y = 0; y < Ny; ++y) {
234  for (int x = 0; x < Nx; ++x) {
235  int site = index.site(x, y, z, t);
236  int site2 = index_spc.site(x, y, z, 0);
237  Ut.mat(utmp1, site, 0);
238  P.set_mat(site2, 0, utmp1);
239  }
240  }
241  }
242 
243  for (int t = 1; t < Nt; ++t) {
244  for (int z = 0; z < Nz; ++z) {
245  for (int y = 0; y < Ny; ++y) {
246  for (int x = 0; x < Nx; ++x) {
247  int site = index.site(x, y, z, t);
248  int site2 = index_spc.site(x, y, z, 0);
249  Ut.mat(utmp1, site, 0);
250  P.mat(utmp2, site2, 0);
251  utmp3.mult_nn(utmp2, utmp1);
252  P.set_mat(site2, 0, utmp3);
253  }
254  }
255  }
256  }
257 
258  //- global Polyakov loops
259  int Npet = Communicator::npe(Ndim - 1);
260 
261  if (Npet > 1) {
262  Field_G Pcp1(Nvol_spc, 1), Pcp2(Nvol_spc, 1);
263  int size_cp = P.nin() * Nvol_spc;
264 
265  for (int ipet = 1; ipet < Npet; ++ipet) {
266  if (ipet == 1) {
267  Pcp1.setpart_ex(0, P, 0);
268  } else {
269  Pcp1.setpart_ex(0, Pcp2, 0);
270  }
271 
272  Communicator::exchange(size_cp, Pcp2.ptr(0), Pcp1.ptr(0), Ndim - 1, 1, 0);
273 
274  mult_Field_Gnn(Pcp1, 0, P, 0, Pcp2, 0);
275  P.setpart_ex(0, Pcp1, 0);
276  }
277  }
278 }
279 
280 
281 //====================================================================
282 //============================================================END=====
BridgeIO vout
Definition: bridgeIO.cpp:278
virtual void set_parameters(const Parameters &params)
setting parameters: only for Polyakov loop correlators.
void detailed(const char *format,...)
Definition: bridgeIO.cpp:82
static int npe(const int dir)
logical grid extent
void Register_string(const string &, const string &)
Definition: parameters.cpp:351
const double * ptr(const int jin, const int site, const int jex) const
Definition: field.h:133
int site(const int &x, const int &y, const int &z, const int &t) const
Definition: index_lex.h:53
void general(const char *format,...)
Definition: bridgeIO.cpp:65
void Register_int(const string &, const int)
Definition: parameters.cpp:330
int nvol() const
Definition: field.h:116
Class for parameters.
Definition: parameters.h:38
static int Lvol()
int nin() const
Definition: field.h:115
std::vector< int > m_Nmax
Definition: polyakovLoop.h:70
SU(N) gauge field.
Definition: field_G.h:38
int m_Nx_ext
size of extended gauge config.
Definition: polyakovLoop.h:62
Bridge::VerboseLevel m_vl
Definition: polyakovLoop.h:53
void mult_Field_Gnn(Field_G &w, const int ex, const Field_G &u1, const int ex1, const Field_G &u2, const int ex2)
double ImTr(const Mat_SU_N &m)
Definition: mat_SU_N.h:500
static int exchange(int count, double *recv_buf, double *send_buf, int idir, int ipm, int tag)
receive array of double from upstream specified by idir and ipm, and send array to downstream...
Lexical site index.
Definition: index_lex.h:34
int m_Nvol_ext
volume of extended gauge config.
Definition: polyakovLoop.h:66
void crucial(const char *format,...)
Definition: bridgeIO.cpp:48
int m_Ntype_max
internal data members
Definition: polyakovLoop.h:61
void init()
initial setup independent of parameters.
static bool Register(const std::string &realm, const creator_callback &cb)
static const std::string class_name
Definition: polyakovLoop.h:50
int m_Nspc_size
parameters set by user
Definition: polyakovLoop.h:57
int non_negative(const int v)
Definition: checker.cpp:21
static int reduce_sum(int count, double *recv_buf, double *send_buf, int pattern=0)
make a global sum of an array of double over the communicator. pattern specifies the dimensions to be...
dcomplex measure_ploop(Field_G &U)
Polyakov loop measurement.
int m_Nt_ext
size of extended gauge config.
Definition: polyakovLoop.h:65
int m_Ntype
number of measured loop-type
Definition: polyakovLoop.h:58
void setpart_ex(int ex, const Field &w, int exw)
Definition: field.h:177
void calc_ploop(Field_G &P, Field_G &U)
Polyakov loop measurement.
string get_string(const string &key) const
Definition: parameters.cpp:87
void set_mat(const int site, const int mn, const Mat_SU_N &U)
Definition: field_G.h:159
std::vector< unitvec > m_Nunit
Definition: polyakovLoop.h:69
int m_Ny_ext
size of extended gauge config.
Definition: polyakovLoop.h:63
Mat_SU_N mat(const int site, const int mn=0) const
Definition: field_G.h:113
int fetch_int(const string &key, int &val) const
Definition: parameters.cpp:141
int m_Nz_ext
size of extended gauge config.
Definition: polyakovLoop.h:64
void mult_nn(const Mat_SU_N &u1, const Mat_SU_N &u2)
Definition: mat_SU_N.h:163
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:28
double ReTr(const Mat_SU_N &m)
Definition: mat_SU_N.h:488