17 #ifdef USE_FACTORY_AUTOREGISTER
19 bool init = Projection_Stout_SU3::register_factory();
110 const int Nex = Uorg.
nex();
111 const int Nvol = Uorg.
nvol();
112 const int NinG = Uorg.
nin();
114 assert(Cst.
nex() == Nex);
115 assert(Cst.
nvol() == Nvol);
116 assert(U.
nex() == Nex);
117 assert(U.
nvol() == Nvol);
122 int ith, nth, is, ns;
123 set_threadtask(ith, nth, is, ns, Nvol);
125 for (
int mu = 0; mu < Nex; ++mu) {
126 for (
int site = is; site < ns; ++site) {
128 Uorg.
mat(ut, site, mu);
131 Cst.
mat(ct, site, mu);
145 double norm = iQ1.
norm2();
146 if (norm > 1.0e-10) {
153 for (
int cc = 0; cc <
NC *
NC; ++cc) {
154 dcomplex qt = f0 * cmplx(iQ0.
r(cc), iQ0.
i(cc))
155 + f1 * cmplx(iQ1.
i(cc), -iQ1.
r(cc))
156 - f2 * cmplx(iQ2.
r(cc), iQ2.
i(cc));
157 e_iQ.
set_r(cc, real(qt));
158 e_iQ.
set_i(cc, imag(qt));
166 ut2.mult_nn(e_iQ, ut);
184 const int Nvol = iQ.
nvol();
185 const int Nex = iQ.
nex();
191 int ith, nth, is, ns;
192 set_threadtask(ith, nth, is, ns, Nvol);
194 for (
int mu = 0; mu < Nex; ++mu) {
195 for (
int site = is; site < ns; ++site) {
200 double norm = iQ1.
norm2();
201 if (norm > 1.0e-10) {
208 for (
int cc = 0; cc <
NC *
NC; ++cc) {
209 dcomplex qt = f0 * cmplx(iQ0.
r(cc), iQ0.
i(cc))
210 + f1 * cmplx(iQ1.i(cc), -iQ1.r(cc))
211 - f2 * cmplx(iQ2.r(cc), iQ2.i(cc));
212 e_iQ.
set_ri(cc, site, mu, real(qt), imag(qt));
253 const int Nex = Xi.
nex();
255 assert(Xi.
nvol() == Nvol);
256 assert(iTheta.
nvol() == Nvol);
257 assert(Sigmap.
nvol() == Nvol);
258 assert(Cst.
nvol() == Nvol);
259 assert(Uorg.
nvol() == Nvol);
260 assert(iTheta.
nex() == Nex);
261 assert(Sigmap.
nex() == Nex);
262 assert(Cst.
nex() == Nex);
263 assert(Uorg.
nex() == Nex);
268 int ith, nth, is, ns;
269 set_threadtask(ith, nth, is, ns, Nvol);
271 for (
int mu = 0; mu < Nex; ++mu) {
272 for (
int site = is; site < ns; ++site) {
275 Cst.
mat(C_tmp, site, mu);
279 Uorg.
mat(U_tmp, site, mu);
283 Sigmap.
mat(Sigmap_tmp, site, mu);
299 double norm = iQ1.
norm2();
300 if (norm > 1.0e-10) {
307 for (
int cc = 0; cc <
NC *
NC; ++cc) {
308 dcomplex qt = f0 * cmplx(iQ0.
r(cc), iQ0.
i(cc))
309 + f1 * cmplx(iQ1.
i(cc), -iQ1.
r(cc))
310 - f2 * cmplx(iQ2.
r(cc), iQ2.
i(cc));
311 e_iQ.set(cc, real(qt), imag(qt));
318 double cos_w = cos(w);
320 dcomplex emiu = cmplx(cos(u), -sin(u));
321 dcomplex e2iu = cmplx(cos(2.0 * u), sin(2.0 * u));
323 dcomplex r01 = cmplx(2.0 * u, 2.0 * (u2 - w2)) * e2iu
324 + emiu * cmplx(16.0 * u * cos_w + 2.0 * u * (3.0 * u2 + w2) * xi0,
325 -8.0 * u2 * cos_w + 2.0 * (9.0 * u2 + w2) * xi0);
327 dcomplex r11 = cmplx(2.0, 4.0 * u) * e2iu
328 + emiu * cmplx(-2.0 * cos_w + (3.0 * u2 - w2) * xi0,
329 2.0 * u * cos_w + 6.0 * u * xi0);
331 dcomplex r21 = cmplx(0.0, 2.0) * e2iu
332 + emiu * cmplx(-3.0 * u * xi0, cos_w - 3.0 * xi0);
334 dcomplex r02 = cmplx(-2.0, 0.0) * e2iu
335 + emiu * cmplx(-8.0 * u2 * xi0,
336 2.0 * u * (cos_w + xi0 + 3.0 * u2 * xi1));
338 dcomplex r12 = emiu * cmplx(2.0 * u * xi0,
339 -cos_w - xi0 + 3.0 * u2 * xi1);
341 dcomplex r22 = emiu * cmplx(xi0, -3.0 * u * xi1);
343 double fden = 1.0 / (2 * (9.0 * u2 - w2) * (9.0 * u2 - w2));
345 dcomplex b10 = cmplx(2.0 * u, 0.0) * r01 + cmplx(3.0 * u2 - w2, 0.0) * r02
346 - cmplx(30.0 * u2 + 2.0 * w2, 0.0) * f0;
347 dcomplex b11 = cmplx(2.0 * u, 0.0) * r11 + cmplx(3.0 * u2 - w2, 0.0) * r12
348 - cmplx(30.0 * u2 + 2.0 * w2, 0.0) * f1;
349 dcomplex b12 = cmplx(2.0 * u, 0.0) * r21 + cmplx(3.0 * u2 - w2, 0.0) * r22
350 - cmplx(30.0 * u2 + 2.0 * w2, 0.0) * f2;
352 dcomplex b20 = r01 - cmplx(3.0 * u, 0.0) * r02 - cmplx(24.0 * u, 0.0) * f0;
353 dcomplex b21 = r11 - cmplx(3.0 * u, 0.0) * r12 - cmplx(24.0 * u, 0.0) * f1;
354 dcomplex b22 = r21 - cmplx(3.0 * u, 0.0) * r22 - cmplx(24.0 * u, 0.0) * f2;
356 b10 *= cmplx(fden, 0.0);
357 b11 *= cmplx(fden, 0.0);
358 b12 *= cmplx(fden, 0.0);
359 b20 *= cmplx(fden, 0.0);
360 b21 *= cmplx(fden, 0.0);
361 b22 *= cmplx(fden, 0.0);
364 for (
int cc = 0; cc <
NC *
NC; ++cc) {
365 dcomplex qt1 = b10 * cmplx(iQ0.
r(cc), iQ0.
i(cc))
366 + b11 * cmplx(iQ1.
i(cc), -iQ1.
r(cc))
367 - b12 * cmplx(iQ2.
r(cc), iQ2.
i(cc));
368 B1.set(cc, real(qt1), imag(qt1));
370 dcomplex qt2 = b20 * cmplx(iQ0.
r(cc), iQ0.
i(cc))
371 + b21 * cmplx(iQ1.
i(cc), -iQ1.
r(cc))
372 - b22 * cmplx(iQ2.
r(cc), iQ2.
i(cc));
373 B2.
set(cc, real(qt2), imag(qt2));
377 USigmap.
mult_nn(U_tmp, Sigmap_tmp);
385 dcomplex tr1 = cmplx(tmp1.
r(0) + tmp1.
r(4) + tmp1.
r(8),
386 tmp1.
i(0) + tmp1.
i(4) + tmp1.
i(8));
387 dcomplex tr2 = cmplx(tmp2.
r(0) + tmp2.
r(4) + tmp2.
r(8),
388 tmp2.
i(0) + tmp2.
i(4) + tmp2.
i(8));
396 for (
int cc = 0; cc <
NC *
NC; ++cc) {
397 dcomplex qt = tr1 * cmplx(iQ1.
i(cc), -iQ1.
r(cc))
398 - tr2 * cmplx(iQ2.
r(cc), iQ2.
i(cc))
399 + f1 * cmplx(USigmap.
r(cc), USigmap.
i(cc))
400 + f2 * cmplx(iQUS.
i(cc), -iQUS.
r(cc))
401 + f2 * cmplx(iUSQ.
i(cc), -iUSQ.
r(cc));
402 iGamma.
set(cc, -imag(qt), real(qt));
414 iTheta_tmp.
mult_nn(iGamma, U_tmp);
417 iTheta.
set_mat(site, mu, iTheta_tmp);
420 Xi_tmp.
mult_nn(Sigmap_tmp, e_iQ);
439 const double& u,
const double& w)
442 const double u2 = u * u;
443 const double w2 = w * w;
444 const double cos_w = cos(w);
446 const double cos_u = cos(u);
447 const double sin_u = sin(u);
449 const dcomplex emiu = cmplx(cos_u, -sin_u);
450 const dcomplex e2iu = cmplx(cos_u * cos_u - sin_u * sin_u,
451 2.0 * sin_u * cos_u);
453 const dcomplex h0 = e2iu * cmplx(u2 - w2, 0.0)
454 + emiu * cmplx(8.0 * u2 * cos_w,
455 2.0 * u * (3.0 * u2 + w2) * xi0);
456 const dcomplex h1 = e2iu * cmplx(2 * u, 0.0)
457 - emiu * cmplx(2.0 * u * cos_w,
458 -(3.0 * u2 - w2) * xi0);
459 const dcomplex h2 = e2iu - emiu * cmplx(cos_w, 3.0 * u * xi0);
461 const double fden = 1.0 / (9.0 * u2 - w2);
473 const double c0 = -(iQ3.
i(0, 0) + iQ3.
i(1, 1) + iQ3.
i(2, 2)) / 3.0;
474 const double c1 = -0.5 * (iQ2.
r(0, 0) + iQ2.
r(1, 1) + iQ2.
r(2, 2));
475 const double c13r = sqrt(c1 / 3.0);
476 const double c0max = 2.0 * c13r * c13r * c13r;
478 const double theta = acos(c0 / c0max);
481 u = c13r * cos(theta / 3.0);
482 w = sqrt(c1) * sin(theta / 3.0);
501 const double w2 = w * w;
502 const static double c0 = -1.0 / 3.0;
503 const static double c1 = 1.0 / 30.0;
504 const static double c2 = -1.0 / 840.0;
505 const static double c3 = 1.0 / 45360.0;
506 const static double c4 = -1.0 / 3991680.0;
508 return c0 + w2 * (c1 + w2 * (c2 + w2 * (c3 + w2 * c4)));
510 return (w * cos(w) - sin(w)) / (w * w * w);
522 const int Nprec = 32;
524 const int Nvol = iQ.
nvol();
525 const int Nex = iQ.
nex();
527 int ith, nth, is, ns;
528 set_threadtask(ith, nth, is, ns, Nvol);
530 for (
int ex = 0; ex < Nex; ++ex) {
531 for (
int site = is; site < ns; ++site) {
540 for (
int iprec = 0; iprec < Nprec; ++iprec) {
541 double exf = 1.0 / (Nprec - iprec);