Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
gaugeFixing_Coulomb.cpp
Go to the documentation of this file.
1 
14 #include "gaugeFixing_Coulomb.h"
15 
16 #ifdef USE_PARAMETERS_FACTORY
17 #include "parameters_factory.h"
18 #endif
19 
20 using std::valarray;
21 
22 #ifdef USE_FACTORY
23 namespace {
24  GaugeFixing *create_object(RandomNumbers *rand)
25  {
26  return new GaugeFixing_Coulomb(rand);
27  }
28 
29 
30  bool init = GaugeFixing::Factory::Register("Coulomb", create_object);
31 }
32 #endif
33 
34 //- parameter entry
35 namespace {
36  void append_entry(Parameters& param)
37  {
38  param.Register_int("maximum_number_of_iteration", 0);
39  param.Register_int("number_of_naive_iteration", 0);
40  param.Register_int("interval_of_measurement", 0);
41  param.Register_int("iteration_to_reset", 0);
42  param.Register_double("convergence_criterion_squared", 0.0);
43  param.Register_double("overrelaxation_parameter", 0.0);
44 
45  param.Register_string("verbose_level", "NULL");
46  }
47 
48 
49 #ifdef USE_PARAMETERS_FACTORY
50  bool init_param = ParametersFactory::Register("GaugeFixing.Coulomb", append_entry);
51 #endif
52 }
53 //- end
54 
55 //- parameters class
57 //- end
58 
59 //====================================================================
61 {
62  const string str_vlevel = params.get_string("verbose_level");
63 
64  m_vl = vout.set_verbose_level(str_vlevel);
65 
66  //- fetch and check input parameters
67  int Niter, Nnaive, Nmeas, Nreset;
68  double Enorm, wp;
69 
70  int err = 0;
71  err += params.fetch_int("maximum_number_of_iteration", Niter);
72  err += params.fetch_int("number_of_naive_iteration", Nnaive);
73  err += params.fetch_int("interval_of_measurement", Nmeas);
74  err += params.fetch_int("iteration_to_reset", Nreset);
75  err += params.fetch_double("convergence_criterion_squared", Enorm);
76  err += params.fetch_double("overrelaxation_parameter", wp);
77 
78  if (err) {
79  vout.crucial(m_vl, "GaugeFixing_Coulomb: fetch error, input parameter not found.\n");
80  abort();
81  }
82 
83 
84  set_parameters(Niter, Nnaive, Nmeas, Nreset, Enorm, wp);
85 }
86 
87 
88 //====================================================================
89 void GaugeFixing_Coulomb::set_parameters(const int Niter, const int Nnaive,
90  const int Nmeas, const int Nreset,
91  const double Enorm, const double wp)
92 {
93  //- print input parameters
94  vout.general(m_vl, "Coulomb gauge fixing:\n");
95  vout.general(m_vl, " Niter = %d\n", Niter);
96  vout.general(m_vl, " Nnaive = %d\n", Nnaive);
97  vout.general(m_vl, " Nmeas = %d\n", Nmeas);
98  vout.general(m_vl, " Nreset = %d\n", Nreset);
99  vout.general(m_vl, " Enorm = %12.4e\n", Enorm);
100  vout.general(m_vl, " wp = %8.4f\n", wp);
101 
102  //- range check
103  int err = 0;
104  err += ParameterCheck::non_negative(Niter);
105  err += ParameterCheck::non_negative(Nnaive);
106  err += ParameterCheck::non_negative(Nmeas);
107  err += ParameterCheck::non_negative(Nreset);
108  err += ParameterCheck::square_non_zero(Enorm);
109  err += ParameterCheck::non_zero(wp);
110 
111  if (err) {
112  vout.crucial(m_vl, "GaugeFixing_Coulomb: parameter range check failed.\n");
113  abort();
114  }
115 
116  //- store values
117  m_Niter = Niter;
118  m_Nnaive = Nnaive;
119  m_Nmeas = Nmeas;
120  m_Nreset = Nreset;
121  m_Enorm = Enorm;
122  m_wp = wp;
123 }
124 
125 
126 //====================================================================
127 void GaugeFixing_Coulomb::fix(Field_G& Ufix, const Field_G& Uorg)
128 {
129  int Nvol = Uorg.nvol();
130  int Nex = Uorg.nex();
131  int Lt = CommonParameters::Lt();
132 
133  int Nvol2 = Nvol / 2;
134  Field_G Ue(Nvol2, Nex), Uo(Nvol2, Nex);
135 
136  Field_G Ge(Nvol2, 1), Go(Nvol2, 1);
137 
138  m_index.convertField(Ue, Uorg, 0);
139  m_index.convertField(Uo, Uorg, 1);
140 
141  int Nconv = -1;
142 
143  valarray<double> sg(Lt);
144  valarray<double> Fval(Lt);
145 
146  // gauge fixing iteration
147  for (int iter = 0; iter < m_Niter; ++iter) {
148  if ((iter % m_Nmeas) == 0) {
149  calc_SG(sg, Fval, Ue, Uo);
150 
151  double sg_max = 0.0;
152  vout.paranoiac(m_vl, " iter = %6d:\n", iter);
153  for (int t = 0; t < Lt; ++t) {
154  vout.paranoiac(m_vl, " t = %4d sg = %16.8e Fval = %16.8e\n",
155  t, sg[t], Fval[t]);
156  if (sg[t] > sg_max) sg_max = sg[t];
157  }
158 
159  if (sg_max < m_Enorm) {
160  Nconv = iter;
161  vout.general(m_vl, "converged at iter = %d\n", Nconv);
162  break;
163  }
164  }
165 
166  double wp2 = m_wp;
167  if ((iter % m_Nreset) < m_Nnaive) wp2 = 1.0;
168  gfix_step(sg, Ue, Uo, wp2);
169 
170  if (((iter % m_Nreset) == 0) && (iter > 0)) {
171  // random gauge transformation
172  vout.general(m_vl, " random gauge transformation performed.\n");
173  set_randomGaugeTrans(sg, Ge);
174  gauge_trans_eo(Ue, Uo, Ge, 0);
175  set_randomGaugeTrans(sg, Go);
176  gauge_trans_eo(Ue, Uo, Go, 1);
177  }
178  }
179 
180  m_index.reverseField(Ufix, Ue, 0);
181  m_index.reverseField(Ufix, Uo, 1);
182 }
183 
184 
185 //====================================================================
186 void GaugeFixing_Coulomb::gfix_step(valarray<double>& sg,
187  Field_G& Ue, Field_G& Uo, double wp)
188 {
189  int Nc = CommonParameters::Nc();
190  int Nvol2 = Ue.nvol();
191  int Nex = Ue.nex();
192 
193  Field_G Weo(Nvol2, 1), Geo(Nvol2, 1);
194  Mat_SU_N ut(Nc), uwp(Nc);
195 
196  uwp.unit();
197  uwp *= (1.0 - wp);
198 
199  for (int ieo = 0; ieo < 2; ++ieo) {
200  calc_W(Weo, Ue, Uo, ieo);
201  maxTr(Geo, Weo);
202  Geo *= wp;
203 
204  //double wp_sbt = 1.0-wp;
205  for (int site = 0; site < Nvol2; ++site) {
206  ut = Geo.mat(site, 0);
207  ut += uwp;
208  ut.reunit();
209  Geo.set_mat(site, 0, ut);
210  }
211 
212  gauge_trans_eo(Ue, Uo, Geo, ieo);
213  }
214 }
215 
216 
217 //====================================================================
219  Field_G& Geo)
220 {
221  int Lt = CommonParameters::Lt();
222  int Nt = CommonParameters::Nt();
223  int Nz = CommonParameters::Nz();
224  int Ny = CommonParameters::Ny();
225  int Nx2 = CommonParameters::Nx() / 2;
226  int Nc = CommonParameters::Nc();
227  int ipet = Communicator::ipe(3);
228 
229  int Nvol = Geo.nvol();
230 
231  assert(Geo.nex() == 1);
232  assert(sg.size() == Lt);
233 
234  Mat_SU_N gt(Nc);
235 
236  for (int t = 0; t < Nt; ++t) {
237  int tg = t + ipet * Nt;
238 
239  if (sg[tg] > m_Enorm) {
240  for (int z = 0; z < Nz; ++z) {
241  for (int y = 0; y < Ny; ++y) {
242  for (int x = 0; x < Nx2; ++x) {
243  int site = m_index.siteh(x, y, z, t);
244  gt.set_random(m_rand);
245  Geo.set_mat(site, 0, gt);
246  }
247  }
248  }
249  } else {
250  gt.unit();
251  for (int z = 0; z < Nz; ++z) {
252  for (int y = 0; y < Ny; ++y) {
253  for (int x = 0; x < Nx2; ++x) {
254  int site = m_index.siteh(x, y, z, t);
255  Geo.set_mat(site, 0, gt);
256  }
257  }
258  }
259  }
260  }
261 }
262 
263 
264 //====================================================================
266  Field_G& Geo, int Ieo)
267 {
268  // Ieo = 0: gauge transformation on even sites.
269  // Ieo = 1: on odd sites.
270 
271  int Nvol2 = Geo.nvol();
272  int Nex = Geo.nex();
273  int Ndim = CommonParameters::Ndim();
274 
276 
277  Field_G Ut(Nvol2, 1), Gt(Nvol2, 1);
278  Field_G Ut2(Nvol2, 1);
279 
280  if (Ieo == 0) {
281  for (int mu = 0; mu < Ndim; ++mu) {
282  Ut.mult_Field_Gnn(0, Geo, 0, Ue, mu);
283  Ue.setpart_ex(mu, Ut, 0);
284 
285  shift.backward_h(Gt, Geo, mu, 1);
286  Ut.mult_Field_Gnd(0, Uo, mu, Gt, 0);
287  Uo.setpart_ex(mu, Ut, 0);
288  }
289  } else {
290  for (int mu = 0; mu < Ndim; ++mu) {
291  Ut.mult_Field_Gnn(0, Geo, 0, Uo, mu);
292  Uo.setpart_ex(mu, Ut, 0);
293 
294  shift.backward_h(Gt, Geo, mu, 0);
295  Ut.mult_Field_Gnd(0, Ue, mu, Gt, 0);
296  Ue.setpart_ex(mu, Ut, 0);
297  }
298  }
299 }
300 
301 
302 //====================================================================
303 void GaugeFixing_Coulomb::calc_SG(valarray<double>& sg,
304  valarray<double>& Fval,
305  Field_G& Ue, Field_G& Uo)
306 {
307  int Nc = CommonParameters::Nc();
308  int Lt = CommonParameters::Lt();
309  int Nt = CommonParameters::Nt();
310  int Nz = CommonParameters::Nz();
311  int Ny = CommonParameters::Ny();
312  int Nx2 = CommonParameters::Nx() / 2;
313  int Nvol2 = Nx2 * Ny * Nz * Nt;
314  int Ndim = CommonParameters::Ndim();
315  int NPE = CommonParameters::NPE();
316 
317  assert(Ue.nex() == Ndim);
318  assert(Ue.nvol() == Nvol2);
319  assert(Uo.nex() == Ndim);
320  assert(Uo.nvol() == Nvol2);
321 
322  valarray<double> sg_local(Nt);
323  valarray<double> Fval_local(Nt);
324  Field_G DLT(Nvol2, 1);
325  Mat_SU_N ut(Nc);
326 
327  sg = 0.0;
328  Fval = 0.0;
329  sg_local = 0.0;
330  Fval_local = 0.0;
331 
332  for (int ieo = 0; ieo < 2; ++ieo) {
333  calc_DLT(DLT, Ue, Uo, ieo);
334 
335  for (int t = 0; t < Nt; ++t) {
336  for (int z = 0; z < Nz; ++z) {
337  for (int y = 0; y < Ny; ++y) {
338  for (int x = 0; x < Nx2; ++x) {
339  int site = m_index.siteh(x, y, z, t);
340  ut = DLT.mat(site, 0);
341  sg_local[t] += ut.norm2();
342  }
343  }
344  }
345  }
346  }
347 
348  sum_global_t(sg, sg_local);
349  for (int t = 0; t < Lt; ++t) {
350  sg[t] = sg[t] / (Ndim * Nc * (2 * Nvol2 * NPE) / Lt);
351  }
352 
353  for (int mu = 0; mu < Ndim - 1; ++mu) {
354  for (int t = 0; t < Nt; ++t) {
355  for (int z = 0; z < Nz; ++z) {
356  for (int y = 0; y < Ny; ++y) {
357  for (int x = 0; x < Nx2; ++x) {
358  int site = m_index.siteh(x, y, z, t);
359  ut = Ue.mat(site, mu);
360  Fval_local[t] += ReTr(ut);
361  ut = Uo.mat(site, mu);
362  Fval_local[t] += ReTr(ut);
363  }
364  }
365  }
366  }
367  }
368 
369  sum_global_t(Fval, Fval_local);
370  for (int t = 0; t < Lt; ++t) {
371  Fval[t] = Fval[t] / (Ndim * (2 * Nvol2 * NPE) / Lt);
372  }
373 }
374 
375 
376 //====================================================================
377 void GaugeFixing_Coulomb::sum_global_t(valarray<double>& val_global,
378  valarray<double>& val_local)
379 {
380  int Lt = CommonParameters::Lt();
381  int Nt = CommonParameters::Nt();
382  int ipet = Communicator::ipe(3);
383 
384  assert(val_global.size() == Lt);
385  assert(val_local.size() == Nt);
386 
387  for (int t = 0; t < Lt; ++t) {
388  val_global[t] = 0.0;
389  }
390 
391  for (int tl = 0; tl < Nt; ++tl) {
392  val_global[tl + ipet * Nt] = val_local[tl];
393  }
394 
395  for (int t = 0; t < Lt; ++t) {
396  double val = val_global[t];
397  val_global[t] = Communicator::reduce_sum(val);
398  }
399 }
400 
401 
402 //====================================================================
404  Field_G& Ue, Field_G& Uo, int Ieo)
405 {
406  int Nvol2 = Ue.nvol();
407  int Nc = CommonParameters::Nc();
408  int Ndim = CommonParameters::Ndim();
409 
411 
412  Field_G Ut1(Nvol2, 1), Ut2(Nvol2, 1);
413  Mat_SU_N u_tmp(Nc);
414 
415  DLT = 0.0;
416 
417  if (Ieo == 0) { // on even sites
418  for (int mu = 0; mu < Ndim - 1; ++mu) {
419  DLT.addpart_ex(0, Ue, mu, -1.0);
420  Ut1.setpart_ex(0, Uo, mu);
421  shift.forward_h(Ut2, Ut1, mu, 0);
422  DLT.addpart_ex(0, Ut2, 0);
423  }
424  } else { // on odd sites
425  for (int mu = 0; mu < Ndim - 1; ++mu) {
426  DLT.addpart_ex(0, Uo, mu, -1.0);
427  Ut1.setpart_ex(0, Ue, mu);
428  shift.forward_h(Ut2, Ut1, mu, 1);
429  DLT.addpart_ex(0, Ut2, 0);
430  }
431  }
432 
433  for (int site = 0; site < Nvol2; ++site) {
434  u_tmp = DLT.mat(site, 0);
435  u_tmp.at();
436  u_tmp *= 2.0;
437  DLT.set_mat(site, 0, u_tmp);
438  }
439 }
440 
441 
442 //====================================================================
444  Field_G& Ue, Field_G& Uo, int Ieo)
445 {
446  int Nvol2 = Ue.nvol();
447  int Nc = CommonParameters::Nc();
448  int Ndim = CommonParameters::Ndim();
449 
450  assert(Weo.nex() == 1);
451 
453 
454  Field_G Ut1(Nvol2, 1), Ut2(Nvol2, 1);
455  Mat_SU_N u_tmp(Nc);
456 
457  Weo = 0.0;
458 
459  if (Ieo == 0) { // on even sites
460  for (int mu = 0; mu < Ndim - 1; ++mu) {
461  Weo.addpart_ex(0, Ue, mu);
462  Ut1.setpart_ex(0, Uo, mu);
463  shift.forward_h(Ut2, Ut1, mu, 0);
464  for (int site = 0; site < Nvol2; ++site) {
465  u_tmp = Ut2.mat_dag(site, 0);
466  Weo.add_mat(site, 0, u_tmp);
467  }
468  }
469  } else if (Ieo == 1) { // on odd sites
470  for (int mu = 0; mu < Ndim - 1; ++mu) {
471  Weo.addpart_ex(0, Uo, mu);
472  Ut1.setpart_ex(0, Ue, mu);
473  shift.forward_h(Ut2, Ut1, mu, 1);
474  for (int site = 0; site < Nvol2; ++site) {
475  u_tmp = Ut2.mat_dag(site, 0);
476  Weo.add_mat(site, 0, u_tmp);
477  }
478  }
479  } else {
480  vout.crucial(m_vl, "gaugeFixing_Coulomb: Wrong ieo.\n");
481  abort();
482  }
483 }
484 
485 
486 //====================================================================
488 {
489  // Present implementation only applys to SU(3) case.
490 
491  int Nc = CommonParameters::Nc();
492  int Nvol2 = G0.nvol();
493 
494  int Nmt = 1;
495 
496  Mat_SU_N unity(Nc);
497 
498  unity.unit();
499 
500  for (int site = 0; site < Nvol2; ++site) {
501  G0.set_mat(site, 0, unity);
502  }
503 
504  for (int imt = 0; imt < Nmt; ++imt) {
505  maxTr1(G0, W);
506  maxTr2(G0, W);
507  maxTr3(G0, W);
508  }
509 }
510 
511 
512 //====================================================================
514 {
515  int Nc = CommonParameters::Nc();
516  int Nvol2 = W.nvol();
517 
518  Mat_SU_N gt(Nc), wt(Nc), gt2(Nc), wt2(Nc);
519 
520  for (int site = 0; site < Nvol2; ++site) {
521  wt = W.mat(site, 0);
522 
523  gt.set(2, 0.0, 0.0);
524  gt.set(5, 0.0, 0.0);
525  gt.set(6, 0.0, 0.0);
526  gt.set(7, 0.0, 0.0);
527  gt.set(8, 1.0, 0.0);
528 
529  double fn1 = (wt.r(0) + wt.r(4)) * (wt.r(0) + wt.r(4))
530  + (wt.i(0) - wt.i(4)) * (wt.i(0) - wt.i(4));
531  double fn2 = (wt.r(1) - wt.r(3)) * (wt.r(1) - wt.r(3))
532  + (wt.i(1) + wt.i(3)) * (wt.i(1) + wt.i(3));
533  double fn = 1.0 / sqrt(fn1 + fn2);
534 
535  gt.set(0, fn * (wt.r(0) + wt.r(4)), fn * (-wt.i(0) + wt.i(4)));
536  gt.set(1, fn * (-wt.r(1) + wt.r(3)), fn * (-wt.i(1) - wt.i(3)));
537  gt.set(3, fn * (wt.r(1) - wt.r(3)), fn * (-wt.i(1) - wt.i(3)));
538  gt.set(4, fn * (wt.r(0) + wt.r(4)), fn * (wt.i(0) - wt.i(4)));
539 
540  wt2 = gt * wt;
541  W.set_mat(site, 0, wt2);
542  gt2 = G.mat(site, 0);
543  wt2 = gt * gt2;
544  G.set_mat(site, 0, wt2);
545  }
546 }
547 
548 
549 //====================================================================
551 {
552  int Nc = CommonParameters::Nc();
553  int Nvol2 = W.nvol();
554 
555  Mat_SU_N gt(Nc), wt(Nc), gt2(Nc), wt2(Nc);
556 
557  for (int site = 0; site < Nvol2; ++site) {
558  wt = W.mat(site, 0);
559 
560  gt.set(1, 0.0, 0.0);
561  gt.set(3, 0.0, 0.0);
562  gt.set(4, 1.0, 0.0);
563  gt.set(5, 0.0, 0.0);
564  gt.set(7, 0.0, 0.0);
565 
566  double fn1 = (wt.r(8) + wt.r(0)) * (wt.r(8) + wt.r(0))
567  + (wt.i(8) - wt.i(0)) * (wt.i(8) - wt.i(0));
568  double fn2 = (wt.r(2) - wt.r(6)) * (wt.r(2) - wt.r(6))
569  + (wt.i(2) + wt.i(6)) * (wt.i(2) + wt.i(6));
570  double fn = 1.0 / sqrt(fn1 + fn2);
571 
572  gt.set(0, fn * (wt.r(8) + wt.r(0)), fn * (wt.i(8) - wt.i(0)));
573  gt.set(2, fn * (wt.r(6) - wt.r(2)), fn * (-wt.i(6) - wt.i(2)));
574  gt.set(6, fn * (-wt.r(6) + wt.r(2)), fn * (-wt.i(6) - wt.i(2)));
575  gt.set(8, fn * (wt.r(8) + wt.r(0)), fn * (-wt.i(8) + wt.i(0)));
576 
577  wt2 = gt * wt;
578  W.set_mat(site, 0, wt2);
579  gt2 = G.mat(site, 0);
580  wt2 = gt * gt2;
581  G.set_mat(site, 0, wt2);
582  }
583 }
584 
585 
586 //====================================================================
588 {
589  int Nc = CommonParameters::Nc();
590  int Nvol2 = W.nvol();
591 
592  Mat_SU_N gt(Nc), wt(Nc), gt2(Nc), wt2(Nc);
593 
594  for (int site = 0; site < Nvol2; ++site) {
595  wt = W.mat(site, 0);
596 
597  gt.set(0, 1.0, 0.0);
598  gt.set(1, 0.0, 0.0);
599  gt.set(2, 0.0, 0.0);
600  gt.set(3, 0.0, 0.0);
601  gt.set(6, 0.0, 0.0);
602 
603  double fn1 = (wt.r(4) + wt.r(8)) * (wt.r(4) + wt.r(8))
604  + (wt.i(4) - wt.i(8)) * (wt.i(4) - wt.i(8));
605  double fn2 = (wt.r(7) - wt.r(5)) * (wt.r(7) - wt.r(5))
606  + (wt.i(7) + wt.i(5)) * (wt.i(7) + wt.i(5));
607  double fn = 1.0 / sqrt(fn1 + fn2);
608 
609  gt.set(4, fn * (wt.r(4) + wt.r(8)), fn * (-wt.i(4) + wt.i(8)));
610  gt.set(5, fn * (-wt.r(5) + wt.r(7)), fn * (-wt.i(5) - wt.i(7)));
611  gt.set(7, fn * (wt.r(5) - wt.r(7)), fn * (-wt.i(5) - wt.i(7)));
612  gt.set(8, fn * (wt.r(4) + wt.r(8)), fn * (wt.i(4) - wt.i(8)));
613 
614  wt2 = gt * wt;
615  W.set_mat(site, 0, wt2);
616  gt2 = G.mat(site, 0);
617  wt2 = gt * gt2;
618  G.set_mat(site, 0, wt2);
619  }
620 }
621 
622 
623 //====================================================================
624 //============================================================END=====