16 #ifdef USE_PARAMETERS_FACTORY
30 bool init = GaugeFixing::Factory::Register(
"Coulomb", create_object);
49 #ifdef USE_PARAMETERS_FACTORY
62 const string str_vlevel = params.
get_string(
"verbose_level");
67 int Niter, Nnaive, Nmeas, Nreset;
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);
79 vout.
crucial(
m_vl,
"GaugeFixing_Coulomb: fetch error, input parameter not found.\n");
90 const int Nmeas,
const int Nreset,
91 const double Enorm,
const double wp)
112 vout.
crucial(
m_vl,
"GaugeFixing_Coulomb: parameter range check failed.\n");
129 int Nvol = Uorg.
nvol();
130 int Nex = Uorg.
nex();
133 int Nvol2 = Nvol / 2;
134 Field_G Ue(Nvol2, Nex), Uo(Nvol2, Nex);
136 Field_G Ge(Nvol2, 1), Go(Nvol2, 1);
143 valarray<double> sg(Lt);
144 valarray<double> Fval(Lt);
147 for (
int iter = 0; iter <
m_Niter; ++iter) {
153 for (
int t = 0; t < Lt; ++t) {
156 if (sg[t] > sg_max) sg_max = sg[t];
170 if (((iter % m_Nreset) == 0) && (iter > 0)) {
190 int Nvol2 = Ue.
nvol();
193 Field_G Weo(Nvol2, 1), Geo(Nvol2, 1);
199 for (
int ieo = 0; ieo < 2; ++ieo) {
205 for (
int site = 0; site < Nvol2; ++site) {
206 ut = Geo.
mat(site, 0);
229 int Nvol = Geo.
nvol();
231 assert(Geo.
nex() == 1);
232 assert(sg.size() == Lt);
236 for (
int t = 0; t < Nt; ++t) {
237 int tg = t + ipet * Nt;
240 for (
int z = 0; z < Nz; ++z) {
241 for (
int y = 0; y < Ny; ++y) {
242 for (
int x = 0; x < Nx2; ++x) {
251 for (
int z = 0; z < Nz; ++z) {
252 for (
int y = 0; y < Ny; ++y) {
253 for (
int x = 0; x < Nx2; ++x) {
271 int Nvol2 = Geo.
nvol();
277 Field_G Ut(Nvol2, 1), Gt(Nvol2, 1);
281 for (
int mu = 0; mu < Ndim; ++mu) {
282 Ut.mult_Field_Gnn(0, Geo, 0, Ue, mu);
286 Ut.mult_Field_Gnd(0, Uo, mu, Gt, 0);
290 for (
int mu = 0; mu < Ndim; ++mu) {
291 Ut.mult_Field_Gnn(0, Geo, 0, Uo, mu);
295 Ut.mult_Field_Gnd(0, Ue, mu, Gt, 0);
304 valarray<double>& Fval,
313 int Nvol2 = Nx2 * Ny * Nz * Nt;
317 assert(Ue.
nex() == Ndim);
318 assert(Ue.
nvol() == Nvol2);
319 assert(Uo.
nex() == Ndim);
320 assert(Uo.
nvol() == Nvol2);
322 valarray<double> sg_local(Nt);
323 valarray<double> Fval_local(Nt);
332 for (
int ieo = 0; ieo < 2; ++ieo) {
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) {
340 ut = DLT.
mat(site, 0);
341 sg_local[t] += ut.
norm2();
349 for (
int t = 0; t < Lt; ++t) {
350 sg[t] = sg[t] / (Ndim * Nc * (2 * Nvol2 * NPE) / Lt);
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) {
359 ut = Ue.
mat(site, mu);
360 Fval_local[t] +=
ReTr(ut);
361 ut = Uo.
mat(site, mu);
362 Fval_local[t] +=
ReTr(ut);
370 for (
int t = 0; t < Lt; ++t) {
371 Fval[t] = Fval[t] / (Ndim * (2 * Nvol2 * NPE) / Lt);
378 valarray<double>& val_local)
384 assert(val_global.size() == Lt);
385 assert(val_local.size() == Nt);
387 for (
int t = 0; t < Lt; ++t) {
391 for (
int tl = 0; tl < Nt; ++tl) {
392 val_global[tl + ipet * Nt] = val_local[tl];
395 for (
int t = 0; t < Lt; ++t) {
396 double val = val_global[t];
406 int Nvol2 = Ue.
nvol();
412 Field_G Ut1(Nvol2, 1), Ut2(Nvol2, 1);
418 for (
int mu = 0; mu < Ndim - 1; ++mu) {
420 Ut1.setpart_ex(0, Uo, mu);
425 for (
int mu = 0; mu < Ndim - 1; ++mu) {
427 Ut1.setpart_ex(0, Ue, mu);
433 for (
int site = 0; site < Nvol2; ++site) {
434 u_tmp = DLT.
mat(site, 0);
446 int Nvol2 = Ue.
nvol();
450 assert(Weo.
nex() == 1);
454 Field_G Ut1(Nvol2, 1), Ut2(Nvol2, 1);
460 for (
int mu = 0; mu < Ndim - 1; ++mu) {
462 Ut1.setpart_ex(0, Uo, mu);
463 shift.forward_h(Ut2, Ut1, mu, 0);
464 for (
int site = 0; site < Nvol2; ++site) {
469 }
else if (Ieo == 1) {
470 for (
int mu = 0; mu < Ndim - 1; ++mu) {
472 Ut1.setpart_ex(0, Ue, mu);
473 shift.forward_h(Ut2, Ut1, mu, 1);
474 for (
int site = 0; site < Nvol2; ++site) {
492 int Nvol2 = G0.
nvol();
500 for (
int site = 0; site < Nvol2; ++site) {
504 for (
int imt = 0; imt < Nmt; ++imt) {
516 int Nvol2 = W.
nvol();
518 Mat_SU_N gt(Nc), wt(Nc), gt2(Nc), wt2(Nc);
520 for (
int site = 0; site < Nvol2; ++site) {
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);
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)));
542 gt2 = G.
mat(site, 0);
553 int Nvol2 = W.
nvol();
555 Mat_SU_N gt(Nc), wt(Nc), gt2(Nc), wt2(Nc);
557 for (
int site = 0; site < Nvol2; ++site) {
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);
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)));
579 gt2 = G.
mat(site, 0);
590 int Nvol2 = W.
nvol();
592 Mat_SU_N gt(Nc), wt(Nc), gt2(Nc), wt2(Nc);
594 for (
int site = 0; site < Nvol2; ++site) {
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);
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)));
616 gt2 = G.
mat(site, 0);