16 #ifdef USE_PARAMETERS_FACTORY
28 bool init = GaugeFixing::Factory::Register(
"Landau", create_object);
47 #ifdef USE_PARAMETERS_FACTORY
60 const string str_vlevel = params.
get_string(
"verbose_level");
65 int Niter, Nnaive, Nmeas, Nreset;
69 err += params.
fetch_int(
"maximum_number_of_iteration", Niter);
70 err += params.
fetch_int(
"number_of_naive_iteration", Nnaive);
71 err += params.
fetch_int(
"interval_of_measurement", Nmeas);
72 err += params.
fetch_int(
"iteration_to_reset", Nreset);
73 err += params.
fetch_double(
"convergence_criterion_squared", Enorm);
74 err += params.
fetch_double(
"overrelaxation_parameter", wp);
77 vout.
crucial(
m_vl,
"GaugeFixing_Landau: fetch error, input parameter not found.\n");
88 const int Nmeas,
const int Nreset,
89 const double Enorm,
const double wp)
110 vout.
crucial(
m_vl,
"GaugeFixing_Landau: parameter range check failed.\n");
127 int Nvol = Uorg.
nvol();
128 int Nex = Uorg.
nex();
130 int Nvol2 = Nvol / 2;
131 Field_G Ue(Nvol2, Nex), Uo(Nvol2, Nex);
133 Field_G Ge(Nvol2, 1), Go(Nvol2, 1);
141 for (
int iter = 0; iter <
m_Niter; ++iter) {
161 if (((iter % m_Nreset) == 0) && (iter > 0)) {
183 int Nvol2 = Ue.
nvol();
186 Field_G Weo(Nvol2, 1), Geo(Nvol2, 1);
192 for (
int ieo = 0; ieo < 2; ++ieo) {
197 double wp_sbt = 1.0 - wp;
198 for (
int site = 0; site < Nvol2; ++site) {
199 ut = Geo.
mat(site, 0);
213 int Nvol = Geo.
nvol();
219 for (
int ex = 0; ex < Nex; ++ex) {
220 for (
int site = 0; site < Nvol; ++site) {
236 int Nvol2 = Geo.
nvol();
242 Field_G Ut(Nvol2, 1), Gt(Nvol2, 1);
246 for (
int mu = 0; mu < Ndim; ++mu) {
247 Ut.mult_Field_Gnn(0, Geo, 0, Ue, mu);
251 Ut.mult_Field_Gnd(0, Uo, mu, Gt, 0);
255 for (
int mu = 0; mu < Ndim; ++mu) {
256 Ut.mult_Field_Gnn(0, Geo, 0, Uo, mu);
260 Ut.mult_Field_Gnd(0, Ue, mu, Gt, 0);
273 int Nvol2 = Ue.
nvol();
282 for (
int ieo = 0; ieo < 2; ++ieo) {
284 double tsg = DLT.
norm2();
287 sg = sg / (Nex * Nc * 2 * Nvol2 * NPE);
289 for (
int mu = 0; mu < Nex; ++mu) {
290 for (
int site = 0; site < Nvol2; ++site) {
291 ut = Ue.
mat(site, mu);
293 ut = Uo.
mat(site, mu);
298 Fval = Fval / (Nex * 2 * Nvol2 * NPE);
306 int Nvol2 = Ue.
nvol();
312 Field_G Ut1(Nvol2, 1), Ut2(Nvol2, 1);
318 for (
int mu = 0; mu < Ndim; ++mu) {
320 Ut1.setpart_ex(0, Uo, mu);
325 for (
int mu = 0; mu < Ndim; ++mu) {
327 Ut1.setpart_ex(0, Ue, mu);
333 for (
int site = 0; site < Nvol2; ++site) {
334 u_tmp = DLT.
mat(site, 0);
346 int Nvol2 = Ue.
nvol();
350 assert(Weo.
nex() == 1);
354 Field_G Ut1(Nvol2, 1), Ut2(Nvol2, 1);
360 for (
int mu = 0; mu < Ndim; ++mu) {
362 Ut1.setpart_ex(0, Uo, mu);
363 shift.forward_h(Ut2, Ut1, mu, 0);
364 for (
int site = 0; site < Nvol2; ++site) {
369 }
else if (Ieo == 1) {
370 for (
int mu = 0; mu < Ndim; ++mu) {
372 Ut1.setpart_ex(0, Ue, mu);
373 shift.forward_h(Ut2, Ut1, mu, 1);
374 for (
int site = 0; site < Nvol2; ++site) {
392 int Nvol2 = G0.
nvol();
400 for (
int site = 0; site < Nvol2; ++site) {
404 for (
int imt = 0; imt < Nmt; ++imt) {
416 int Nvol2 = W.
nvol();
418 Mat_SU_N gt(Nc), wt(Nc), gt2(Nc), wt2(Nc);
420 for (
int site = 0; site < Nvol2; ++site) {
429 double fn1 = (wt.r(0) + wt.r(4)) * (wt.r(0) + wt.r(4))
430 + (wt.i(0) - wt.i(4)) * (wt.i(0) - wt.i(4));
431 double fn2 = (wt.r(1) - wt.r(3)) * (wt.r(1) - wt.r(3))
432 + (wt.i(1) + wt.i(3)) * (wt.i(1) + wt.i(3));
433 double fn = 1.0 / sqrt(fn1 + fn2);
435 gt.set(0, fn * (wt.r(0) + wt.r(4)), fn * (-wt.i(0) + wt.i(4)));
436 gt.set(1, fn * (-wt.r(1) + wt.r(3)), fn * (-wt.i(1) - wt.i(3)));
437 gt.set(3, fn * (wt.r(1) - wt.r(3)), fn * (-wt.i(1) - wt.i(3)));
438 gt.set(4, fn * (wt.r(0) + wt.r(4)), fn * (wt.i(0) - wt.i(4)));
442 gt2 = G.
mat(site, 0);
453 int Nvol2 = W.
nvol();
455 Mat_SU_N gt(Nc), wt(Nc), gt2(Nc), wt2(Nc);
457 for (
int site = 0; site < Nvol2; ++site) {
466 double fn1 = (wt.r(8) + wt.r(0)) * (wt.r(8) + wt.r(0))
467 + (wt.i(8) - wt.i(0)) * (wt.i(8) - wt.i(0));
468 double fn2 = (wt.r(2) - wt.r(6)) * (wt.r(2) - wt.r(6))
469 + (wt.i(2) + wt.i(6)) * (wt.i(2) + wt.i(6));
470 double fn = 1.0 / sqrt(fn1 + fn2);
472 gt.set(0, fn * (wt.r(8) + wt.r(0)), fn * (wt.i(8) - wt.i(0)));
473 gt.set(2, fn * (wt.r(6) - wt.r(2)), fn * (-wt.i(6) - wt.i(2)));
474 gt.set(6, fn * (-wt.r(6) + wt.r(2)), fn * (-wt.i(6) - wt.i(2)));
475 gt.set(8, fn * (wt.r(8) + wt.r(0)), fn * (-wt.i(8) + wt.i(0)));
479 gt2 = G.
mat(site, 0);
490 int Nvol2 = W.
nvol();
492 Mat_SU_N gt(Nc), wt(Nc), gt2(Nc), wt2(Nc);
494 for (
int site = 0; site < Nvol2; ++site) {
503 double fn1 = (wt.r(4) + wt.r(8)) * (wt.r(4) + wt.r(8))
504 + (wt.i(4) - wt.i(8)) * (wt.i(4) - wt.i(8));
505 double fn2 = (wt.r(7) - wt.r(5)) * (wt.r(7) - wt.r(5))
506 + (wt.i(7) + wt.i(5)) * (wt.i(7) + wt.i(5));
507 double fn = 1.0 / sqrt(fn1 + fn2);
509 gt.set(4, fn * (wt.r(4) + wt.r(8)), fn * (-wt.i(4) + wt.i(8)));
510 gt.set(5, fn * (-wt.r(5) + wt.r(7)), fn * (-wt.i(5) - wt.i(7)));
511 gt.set(7, fn * (wt.r(5) - wt.r(7)), fn * (-wt.i(5) - wt.i(7)));
512 gt.set(8, fn * (wt.r(4) + wt.r(8)), fn * (wt.i(4) - wt.i(8)));
516 gt2 = G.
mat(site, 0);