Bridge++  Ver. 1.2.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 using std::valarray;
21 
22 //- parameter entries
23 namespace {
24  void append_entry(Parameters& param)
25  {
26  param.Register_int("spatial_correlator_size", 0);
27  param.Register_int("number_of_correlator_type", 0);
28 
29  param.Register_string("verbose_level", "NULL");
30  }
31 
32 
33 #ifdef USE_PARAMETERS_FACTORY
34  bool init_param = ParametersFactory::Register("PolyakovLoop", append_entry);
35 #endif
36 }
37 //- end
38 
39 //- parameters class
41 //- end
42 
43 const std::string PolyakovLoop::class_name = "PolyakovLoop";
44 
45 //====================================================================
47 {
48  const string str_vlevel = params.get_string("verbose_level");
49 
50  m_vl = vout.set_verbose_level(str_vlevel);
51 
52  //- fetch and check input parameters
53  int Nspc_size, Ntype;
54 
55  int err = 0;
56  err += params.fetch_int("spatial_correlator_size", Nspc_size);
57  err += params.fetch_int("number_of_correlator_type", Ntype);
58 
59  if (err) {
60  vout.crucial(m_vl, "%s: fetch error, input parameter not found.\n", class_name.c_str());
61  abort();
62  }
63 
64 
65  set_parameters(Nspc_size, Ntype);
66 }
67 
68 
69 //====================================================================
70 void PolyakovLoop::set_parameters(int Nspc_size, int Ntype)
71 {
72  //- print input parameters
73  vout.general(m_vl, "Polyakov loop measurement:\n");
74  vout.general(m_vl, " Nspc_size = %d\n", Nspc_size);
75  vout.general(m_vl, " Ntype = %d\n", Ntype);
76 
77  //- range check
78  int err = 0;
79  err += ParameterCheck::non_negative(Nspc_size);
80  err += ParameterCheck::non_negative(Ntype);
81 
84  if (Ntype > 6) ++err;
85 
86  if (err) {
87  vout.crucial(m_vl, "%s: parameter range check failed.\n", class_name.c_str());
88  abort();
89  }
90 
91  //- store values
92  m_Nspc_size = Nspc_size;
93  m_Ntype = Ntype;
94 
95 
96  //- post-process
100  m_Nt_ext = 1;
102 
105  m_Nmax[0] = Nspc_size;
106  m_Nmax[1] = Nspc_size;
107  m_Nmax[2] = Nspc_size / 2;
108  m_Nmax[3] = Nspc_size;
109  m_Nmax[4] = Nspc_size / 2;
110  m_Nmax[5] = Nspc_size / 2;
111 }
112 
113 
114 //====================================================================
116 {
117  int Ndim = CommonParameters::Ndim();
118 
119  assert(Ndim == 4);
120 
121  m_Ntype_max = 6;
122  int Ndim_spc = Ndim - 1;
123 
124  m_Nunit.resize(m_Ntype_max);
125  m_Nmax.resize(m_Ntype_max);
126 
127  for (int i = 0; i < m_Ntype_max; ++i) {
128  m_Nunit[i].resize(Ndim_spc);
129  }
130 
131  // The following setting explicitly depends on the definition
132  // of unit vectors.
133  assert(m_Ntype_max >= 6);
134 
135  m_Nunit[0][0] = 1;
136  m_Nunit[0][1] = 0;
137  m_Nunit[0][2] = 0;
138 
139  m_Nunit[1][0] = 1;
140  m_Nunit[1][1] = 1;
141  m_Nunit[1][2] = 0;
142 
143  m_Nunit[2][0] = 2;
144  m_Nunit[2][1] = 1;
145  m_Nunit[2][2] = 0;
146 
147  m_Nunit[3][0] = 1;
148  m_Nunit[3][1] = 1;
149  m_Nunit[3][2] = 1;
150 
151  m_Nunit[4][0] = 2;
152  m_Nunit[4][1] = 1;
153  m_Nunit[4][2] = 1;
154 
155  m_Nunit[5][0] = 2;
156  m_Nunit[5][1] = 2;
157  m_Nunit[5][2] = 1;
158 }
159 
160 
161 //====================================================================
163 {
164  int Ndim = CommonParameters::Ndim();
165  int Nx = CommonParameters::Nx();
166  int Ny = CommonParameters::Ny();
167  int Nz = CommonParameters::Nz();
168  int Nc = CommonParameters::Nc();
169  int Npet = Communicator::npe(Ndim - 1);
170  int Lvol_spc = CommonParameters::Lvol() / CommonParameters::Lt();
171  int Nvol_spc = Nx * Ny * Nz;
172 
173  Field_G P(Nvol_spc, 1);
174 
175  calc_ploop(P, U);
176 
177  Mat_SU_N utmp(Nc);
178  double re_tr = 0.0;
179  double im_tr = 0.0;
180  for (int site = 0; site < Nvol_spc; ++site) {
181  P.mat(utmp, site, 0);
182 
183  re_tr += ReTr(utmp);
184  im_tr += ImTr(utmp);
185  }
186  re_tr /= (double(Nc));
187  im_tr /= (double(Nc));
188 
189  double re_ploop = Communicator::reduce_sum(re_tr);
190  double im_ploop = Communicator::reduce_sum(im_tr);
191 
192  re_ploop /= double(Lvol_spc * Npet);
193  im_ploop /= double(Lvol_spc * Npet);
194 
195  vout.detailed(m_vl, "Polyakov loop = %e %e\n", re_ploop, im_ploop);
196 
197  // dcomplex ploop = dcomplex(re_ploop,im_ploop);
198  dcomplex ploop = cmplx(re_ploop, im_ploop);
199 
200  return ploop;
201 }
202 
203 
204 //====================================================================
206 {
207  int Ndim = CommonParameters::Ndim();
208  // int Ndim_spc = Ndim - 1;
209 
210  int Nx = CommonParameters::Nx();
211  int Ny = CommonParameters::Ny();
212  int Nz = CommonParameters::Nz();
213  int Nt = CommonParameters::Nt();
214  int Nc = CommonParameters::Nc();
215 
216  int Nvol = U.nvol();
217 
218  assert(Nvol == Nx * Ny * Nz * Nt);
219 
220  int Nvol_spc = P.nvol();
221  assert(Nvol_spc == Nx * Ny * Nz);
222 
223  Index_lex index;
224  Index_lex index_spc(Nx, Ny, Nz, 1);
225 
226  Field_G Ut(Nvol, 1);
227  Mat_SU_N utmp1(Nc), utmp2(Nc), utmp3(Nc);
228 
229  Ut.setpart_ex(0, U, Ndim - 1);
230 
231  //- Definition of local Polyakov loops
232  int t = 0;
233  for (int z = 0; z < Nz; ++z) {
234  for (int y = 0; y < Ny; ++y) {
235  for (int x = 0; x < Nx; ++x) {
236  int site = index.site(x, y, z, t);
237  int site2 = index_spc.site(x, y, z, 0);
238  Ut.mat(utmp1, site, 0);
239  P.set_mat(site2, 0, utmp1);
240  }
241  }
242  }
243 
244  for (int t = 1; t < Nt; ++t) {
245  for (int z = 0; z < Nz; ++z) {
246  for (int y = 0; y < Ny; ++y) {
247  for (int x = 0; x < Nx; ++x) {
248  int site = index.site(x, y, z, t);
249  int site2 = index_spc.site(x, y, z, 0);
250  Ut.mat(utmp1, site, 0);
251  P.mat(utmp2, site2, 0);
252  utmp3.mult_nn(utmp2, utmp1);
253  P.set_mat(site2, 0, utmp3);
254  }
255  }
256  }
257  }
258 
259  //- global Polyakov loops
260  int Npet = Communicator::npe(Ndim - 1);
261 
262  if (Npet > 1) {
263  Field_G Pcp1(Nvol_spc, 1), Pcp2(Nvol_spc, 1);
264  int size_cp = P.nin() * Nvol_spc;
265 
266  for (int ipet = 1; ipet < Npet; ++ipet) {
267  if (ipet == 1) {
268  Pcp1.setpart_ex(0, P, 0);
269  } else {
270  Pcp1.setpart_ex(0, Pcp2, 0);
271  }
272 
273  Communicator::exchange(size_cp, Pcp2.ptr(0), Pcp1.ptr(0), Ndim - 1, 1, 0);
274 
275  mult_Field_Gnn(Pcp1, 0, P, 0, Pcp2, 0);
276  P.setpart_ex(0, Pcp1, 0);
277  }
278  }
279 }
280 
281 
282 //====================================================================
283 //============================================================END=====
BridgeIO vout
Definition: bridgeIO.cpp:207
virtual void set_parameters(const Parameters &params)
setting parameters: only for Polyakov loop correlators.
void detailed(const char *format,...)
Definition: bridgeIO.cpp:50
static int npe(const int dir)
logical grid extent
void Register_string(const string &, const string &)
Definition: parameters.cpp:352
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:38
void Register_int(const string &, const int)
Definition: parameters.cpp:331
double * ptr(const int jin, const int site, const int jex)
Definition: field.h:118
int nvol() const
Definition: field.h:101
Class for parameters.
Definition: parameters.h:40
static int Lvol()
int nin() const
Definition: field.h:100
SU(N) gauge field.
Definition: field_G.h:36
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:26
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
std::valarray< int > m_Nmax
Definition: polyakovLoop.h:70
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:150
void calc_ploop(Field_G &P, Field_G &U)
Polyakov loop measurement.
string get_string(const string &key) const
Definition: parameters.cpp:85
void set_mat(const int site, const int mn, const Mat_SU_N &U)
Definition: field_G.h:156
std::valarray< 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:110
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:191
double ReTr(const Mat_SU_N &m)
Definition: mat_SU_N.h:488