16 #ifdef USE_PARAMETERS_FACTORY
28 bool init = Projection::Factory::Register(
"Stout_SU3", create_object);
40 #ifdef USE_PARAMETERS_FACTORY
53 const string str_vlevel = params.
get_string(
"verbose_level");
93 int Nvol = Uorg.
nvol();
95 assert(Cst.
nex() == Nex);
96 assert(Cst.
nvol() == Nvol);
97 assert(U.
nex() == Nex);
98 assert(U.
nvol() == Nvol);
100 int NinG = Uorg.
nin();
107 dcomplex f0, f1, f2, qt;
109 for (
int mu = 0; mu < Nex; ++mu) {
110 for (
int site = 0; site < Nvol; ++site) {
111 Uorg.
mat(ut, site, mu);
112 Cst.
mat(ct, site, mu);
115 iQ2.mult_nn(iQ1, iQ1);
118 double norm = iQ1.norm2();
119 if (norm > 1.0e-10) {
123 for (
int cc = 0; cc <
NC *
NC; ++cc) {
124 qt = f0 * cmplx(iQ0.r(cc), iQ0.i(cc))
125 + f1 * cmplx(iQ1.i(cc), -iQ1.r(cc))
126 - f2 * cmplx(iQ2.r(cc), iQ2.i(cc));
127 e_iQ.
setr(cc, real(qt));
128 e_iQ.
seti(cc, imag(qt));
155 int Nvol = iQ.
nvol();
163 dcomplex f0, f1, f2, qt;
165 for (
int mu = 0; mu < Nex; ++mu) {
166 for (
int site = 0; site < Nvol; ++site) {
167 iQ1 = iQ.
mat(site, mu);
171 double norm = iQ1.
norm2();
172 if (norm > 1.0e-10) {
176 for (
int cc = 0; cc <
NC *
NC; ++cc) {
177 qt = f0 * cmplx(iQ0.r(cc), iQ0.i(cc))
178 + f1 * cmplx(iQ1.i(cc), -iQ1.r(cc))
179 - f2 * cmplx(iQ2.r(cc), iQ2.i(cc));
180 e_iQ.
set_ri(cc, site, mu, real(qt), imag(qt));
207 double alpha,
const Field_G& Sigmap,
217 int NinG = 2 *
NC *
NC;
220 assert(Xi.
nvol() == Nvol);
221 assert(iTheta.
nvol() == Nvol);
222 assert(Sigmap.
nvol() == Nvol);
223 assert(Cst.
nvol() == Nvol);
224 assert(Uorg.
nvol() == Nvol);
225 assert(iTheta.
nex() == Nex);
226 assert(Sigmap.
nex() == Nex);
227 assert(Cst.
nex() == Nex);
228 assert(Uorg.
nex() == Nex);
230 Mat_SU_N C_tmp(NC), U_tmp(NC), Sigmap_tmp(NC);
231 Mat_SU_N iQ0(NC), iQ1(NC), iQ2(NC), iQ3(NC), e_iQ(NC);
233 Mat_SU_N USigmap(NC), iQUS(NC), iUSQ(NC), iGamma(NC);
234 Mat_SU_N Xi_tmp(NC), iTheta_tmp(NC);
238 double u, w, u2, w2, cos_w, xi0, xi1, fden;
239 dcomplex f0, f1, f2, h0, h1, h2, e2iu, emiu, qt;
240 dcomplex r01, r11, r21, r02, r12, r22, tr1, tr2;
241 dcomplex b10, b11, b12, b20, b21, b22;
243 for (
int mu = 0; mu < Nex; ++mu) {
244 for (
int site = 0; site < Nvol; ++site) {
246 Cst.
mat(C_tmp, site, mu);
248 Uorg.
mat(U_tmp, site, mu);
250 Sigmap.
mat(Sigmap_tmp, site, mu);
255 iQ2.mult_nn(iQ1, iQ1);
256 iQ3.mult_nn(iQ1, iQ2);
259 double norm = iQ1.norm2();
260 if (norm > 1.0e-10) {
264 for (
int cc = 0; cc < NC *
NC; ++cc) {
265 qt = f0 * cmplx(iQ0.r(cc), iQ0.i(cc))
266 + f1 * cmplx(iQ1.i(cc), -iQ1.r(cc))
267 - f2 * cmplx(iQ2.r(cc), iQ2.i(cc));
268 e_iQ.
set(cc, real(qt), imag(qt));
277 emiu = cmplx(cos(u), -sin(u));
278 e2iu = cmplx(cos(2.0 * u), sin(2.0 * u));
280 r01 = cmplx(2.0 * u, 2.0 * (u2 - w2)) * e2iu
281 + emiu * cmplx(16.0 * u * cos_w + 2.0 * u * (3.0 * u2 + w2) * xi0,
282 -8.0 * u2 * cos_w + 2.0 * (9.0 * u2 + w2) * xi0);
284 r11 = cmplx(2.0, 4.0 * u) * e2iu
285 + emiu * cmplx(-2.0 * cos_w + (3.0 * u2 - w2) * xi0,
286 2.0 * u * cos_w + 6.0 * u * xi0);
288 r21 = cmplx(0.0, 2.0) * e2iu
289 + emiu * cmplx(-3.0 * u * xi0, cos_w - 3.0 * xi0);
291 r02 = cmplx(-2.0, 0.0) * e2iu
292 + emiu * cmplx(-8.0 * u2 * xi0,
293 2.0 * u * (cos_w + xi0 + 3.0 * u2 * xi1));
295 r12 = emiu * cmplx(2.0 * u * xi0,
296 -cos_w - xi0 + 3.0 * u2 * xi1);
298 r22 = emiu * cmplx(xi0, -3.0 * u * xi1);
300 fden = 1.0 / (2 * (9.0 * u2 - w2) * (9.0 * u2 - w2));
302 b10 = cmplx(2.0 * u, 0.0) * r01 + cmplx(3.0 * u2 - w2, 0.0) * r02
303 - cmplx(30.0 * u2 + 2.0 * w2, 0.0) * f0;
305 b11 = cmplx(2.0 * u, 0.0) * r11 + cmplx(3.0 * u2 - w2, 0.0) * r12
306 - cmplx(30.0 * u2 + 2.0 * w2, 0.0) * f1;
308 b12 = cmplx(2.0 * u, 0.0) * r21 + cmplx(3.0 * u2 - w2, 0.0) * r22
309 - cmplx(30.0 * u2 + 2.0 * w2, 0.0) * f2;
311 b20 = r01 - cmplx(3.0 * u, 0.0) * r02 - cmplx(24.0 * u, 0.0) * f0;
313 b21 = r11 - cmplx(3.0 * u, 0.0) * r12 - cmplx(24.0 * u, 0.0) * f1;
315 b22 = r21 - cmplx(3.0 * u, 0.0) * r22 - cmplx(24.0 * u, 0.0) * f2;
317 b10 *= cmplx(fden, 0.0);
318 b11 *= cmplx(fden, 0.0);
319 b12 *= cmplx(fden, 0.0);
320 b20 *= cmplx(fden, 0.0);
321 b21 *= cmplx(fden, 0.0);
322 b22 *= cmplx(fden, 0.0);
324 for (
int cc = 0; cc < NC *
NC; ++cc) {
325 qt = b10 * cmplx(iQ0.r(cc), iQ0.i(cc))
326 + b11 * cmplx(iQ1.i(cc), -iQ1.r(cc))
327 - b12 * cmplx(iQ2.r(cc), iQ2.i(cc));
328 B1.set(cc, real(qt), imag(qt));
329 qt = b20 * cmplx(iQ0.r(cc), iQ0.i(cc))
330 + b21 * cmplx(iQ1.i(cc), -iQ1.r(cc))
331 - b22 * cmplx(iQ2.r(cc), iQ2.i(cc));
332 B2.
set(cc, real(qt), imag(qt));
335 USigmap.mult_nn(U_tmp, Sigmap_tmp);
337 tmp1.mult_nn(USigmap, B1);
339 tr1 = cmplx(tmp1.r(0) + tmp1.r(4) + tmp1.r(8),
340 tmp1.i(0) + tmp1.i(4) + tmp1.i(8));
341 tr2 = cmplx(tmp2.
r(0) + tmp2.
r(4) + tmp2.
r(8),
342 tmp2.
i(0) + tmp2.
i(4) + tmp2.
i(8));
344 iQUS.mult_nn(iQ1, USigmap);
345 iUSQ.mult_nn(USigmap, iQ1);
347 for (
int cc = 0; cc < NC *
NC; ++cc) {
348 qt = tr1 * cmplx(iQ1.i(cc), -iQ1.r(cc))
349 - tr2 * cmplx(iQ2.r(cc), iQ2.i(cc))
350 + f1 * cmplx(USigmap.r(cc), USigmap.i(cc))
351 + f2 * cmplx(iQUS.i(cc), -iQUS.r(cc))
352 + f2 * cmplx(iUSQ.i(cc), -iUSQ.r(cc));
353 iGamma.
set(cc, -imag(qt), real(qt));
363 iTheta_tmp.
mult_nn(iGamma, U_tmp);
365 iTheta.
set_mat(site, mu, iTheta_tmp);
367 Xi_tmp.mult_nn(Sigmap_tmp, e_iQ);
368 Xi_tmp.multadd_dn(C_tmp, iGamma);
388 const double& u,
const double& w)
390 dcomplex h0, h1, h2, e2iu, emiu, ixi0, qt;
391 double c0, c1, xi0, c0max, u2, w2, cos_w, fden;
398 double cos_u = cos(u);
399 double sin_u = sin(u);
400 emiu = cmplx(cos_u, -sin_u);
401 e2iu = cmplx(cos_u * cos_u - sin_u * sin_u, 2.0 * sin_u * cos_u);
403 h0 = e2iu * cmplx(u2 - w2, 0.0)
404 + emiu * cmplx(8.0 * u2 * cos_w, 2.0 * u * (3.0 * u2 + w2) * xi0);
405 h1 = cmplx(2 * u, 0.0) * e2iu
406 - emiu * cmplx(2.0 * u * cos_w, -(3.0 * u2 - w2) * xi0);
407 h2 = e2iu - emiu * cmplx(cos_w, 3.0 * u * xi0);
409 fden = 1.0 / (9.0 * u2 - w2);
420 double c0, c1, c0max, theta;
422 c0 = -(iQ3.
i(0, 0) + iQ3.
i(1, 1) + iQ3.
i(2, 2)) / 3.0;
423 c1 = -0.5 * (iQ2.
r(0, 0) + iQ2.
r(1, 1) + iQ2.
r(2, 2));
424 double c13r = sqrt(c1 / 3.0);
425 c0max = 2.0 * c13r * c13r * c13r;
427 theta = acos(c0 / c0max);
428 u = c13r * cos(theta / 3.0);
429 w = sqrt(c1) * sin(theta / 3.0);
436 double xi0 = sin(w) / w;
438 if (w < 0.0001)
vout.
general(
m_vl,
"Projection_Stout_SU3: too small w = %18.6e\n", w);
447 double xi1 = cos(w) / (w * w) - sin(w) / (w * w * w);
449 if (w < 0.0001)
vout.
general(
m_vl,
"Projection_Stout_SU3: too small w = %18.6e\n", w);
462 int Nvol = iQ.
nvol();
468 for (
int ex = 0; ex < Nex; ++ex) {
469 for (
int site = 0; site < Nvol; ++site) {
472 h1 = iQ.
mat(site, ex);
474 for (
int iprec = 0; iprec < Nprec; ++iprec) {
475 double exf = 1.0 / (Nprec - iprec);