Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
action_G_Plaq_SF.cpp
Go to the documentation of this file.
1 
14 #include "action_G_Plaq_SF.h"
15 
16 #ifdef USE_PARAMETERS_FACTORY
17 #include "parameters_factory.h"
18 #endif
19 
20 //- parameter entries
21 namespace {
22  void append_entry(Parameters& param)
23  {
24  param.Register_double("beta", 0.0);
25 
26  param.Register_double("ct0", 0.0);
27  param.Register_double("ct1", 0.0);
28  param.Register_double("ct2", 0.0);
29 
30  param.Register_double_vector("phi", std::valarray<double>());
31  param.Register_double_vector("phipr", std::valarray<double>());
32 
33  param.Register_string("verbose_level", "NULL");
34  }
35 
36 
37 #ifdef USE_PARAMETERS_FACTORY
38  bool init_param = ParametersFactory::Register("Action.G_Plaq_SF", 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  double beta, ct0, ct1, ct2;
56  std::valarray<double> phi, phipr;
57 
58  int err = 0;
59  err += params.fetch_double("beta", beta);
60  err += params.fetch_double("ct0", ct0);
61  err += params.fetch_double("ct1", ct1);
62  err += params.fetch_double("ct2", ct2);
63  err += params.fetch_double_vector("phi", phi);
64  err += params.fetch_double_vector("phipr", phipr);
65 
66  if (err) {
67  vout.crucial(m_vl, "Action_G_Plaq_SF: fetch error, input parameter not found.\n");
68  abort();
69  }
70 
71 
72  double gg = 6.0 / beta;
73  double ct = ct0 + ct1 * gg + ct2 * gg * gg;
74 
75  set_parameters(beta, &phi[0], &phipr[0], ct);
76 }
77 
78 
79 //====================================================================
80 
89 void Action_G_Plaq_SF::set_parameters(double beta, double *phi, double *phipr, double ct)
90 {
91  //- print input parameters
92  vout.general(m_vl, "Action_G_Plaq_SF:\n");
93  vout.general(m_vl, " beta = %12.6f\n", beta);
94  vout.general(m_vl, " phi1 = %12.6f\n", phi[0]);
95  vout.general(m_vl, " phi2 = %12.6f\n", phi[1]);
96  vout.general(m_vl, " phi3 = %12.6f\n", phi[2]);
97  vout.general(m_vl, " phipr1= %12.6f\n", phipr[0]);
98  vout.general(m_vl, " phipr2= %12.6f\n", phipr[1]);
99  vout.general(m_vl, " phipr3= %12.6f\n", phipr[2]);
100  vout.general(m_vl, " ct = %12.6f\n", ct);
101 
102  //- range check
103  // NB. beta,phi,phipr,ct = 0 is allowed.
104 
105  //- store values
106  m_beta = beta;
107 
108  m_ct = ct;
109 
110  m_phi = phi;
111  m_phipr = phipr;
112 
113  //- post-process
115 
116  int Nc = CommonParameters::Nc();
117  int Nvol = CommonParameters::Nvol();
118  int Ndim = CommonParameters::Ndim();
119  int NinG = 2 * Nc * Nc;
120 
121  m_force.reset(NinG, Nvol, Ndim);
122 
123  m_status_linkv = 0;
124 }
125 
126 
127 //====================================================================
129 {
130  double H_U = calcH();
131 
132  m_status_linkv = 0;
133 
134  return H_U;
135 }
136 
137 
138 //====================================================================
139 
155 {
156  int Nc = CommonParameters::Nc();
157 
158  // double plaq = m_staple.plaquette(m_U);
159  double plaq = m_staple.plaquette_ct(*m_U, m_ct);
160 
161  // double H_U = m_beta * (1.0-plaq) * Lvol * Ndim2;
162  double H_U = -1.0 / Nc * m_beta * plaq;
163 
164  vout.general(m_vl, "H_Gplaq = %18.8f\n", H_U);
165 
166  return H_U;
167 }
168 
169 
170 //====================================================================
171 
183 {
184  if (m_status_linkv == 0) {
185  int Nin = m_U->nin();
186  int Nvol = m_U->nvol();
187  int Nex = m_U->nex();
188  int Nc = CommonParameters::Nc();
189 
190  double betaNc = m_beta / Nc;
191  Mat_SU_N ut(Nc);
192 
193  Field_G force(Nvol, Nex);
194  Field_G st(Nvol, 1);
195 
196  vout.general(m_vl, " Action_G_Plaq_SF: %s\n", m_label.c_str());
197 
198  for (int mu = 0; mu < Nex; ++mu) {
199  // m_staple.staple(st,m_U,mu);
200  m_staple.staple_ct(st, *m_U, mu, m_ct);
201  for (int site = 0; site < Nvol; ++site) {
202  ut = m_U->mat(site, mu) * st.mat_dag(site);
203  ut.at();
204  ut *= -betaNc;
205  force.set_mat(site, mu, ut);
206  }
207  }
208 
209  m_force = (Field)force;
210  ++m_status_linkv;
211 
212  double Fave, Fmax, Fdev;
213  m_force.stat(Fave, Fmax, Fdev);
214  vout.general(m_vl, " Fave = %12.6f Fmax = %10.6f Fdev = %12.6f\n",
215  Fave, Fmax, Fdev);
216 
217  return m_force;
218  } else {
219  vout.general(m_vl, " Action_G_Plaq_SF returns previous force.\n");
220  return m_force;
221  }
222 }
223 
224 
231 //====================================================================
233 {
234  int Nc = CommonParameters::Nc();
235  int Nx = CommonParameters::Nx();
236  int Ny = CommonParameters::Ny();
237  int Nz = CommonParameters::Nz();
238  int Nt = CommonParameters::Nt();
239 
240  Index_lex idx;
241  int ix;
242  Mat_SU_N Tmp(Nc);
243 
244  // if(comm->ipe(3)==0){
245  for (int t = 0; t < Nt; t++) {
246  for (int x = 0; x < Nx; x++) {
247  for (int y = 0; y < Ny; y++) {
248  for (int z = 0; z < Nz; z++) {
249  ix = idx.site(x, y, z, t);
250 
251  for (int mu = 0; mu < 4; mu++) {
252  Tmp = U->mat(ix, mu);
253  for (int c = 0; c < Nc * Nc; ++c) {
254  vout.general(m_vl, "%d %d %d %d %d %d %0.16e %0.16e\n",
255  x, y, z, t, mu, c, Tmp.r(c), Tmp.i(c));
256  }
257  }
258  }
259  }
260  }
261  }
262 }
263 
264 
265 //====================================================================
266 //============================================================END=====