16 #ifdef USE_FACTORY_AUTOREGISTER
18 bool init = Projection_Stout_SU3::register_factory();
27 const string str_vlevel = params.
get_string(
"verbose_level");
72 const int Nex = Uorg.
nex();
73 const int Nvol = Uorg.
nvol();
74 const int NinG = Uorg.
nin();
76 assert(Cst.
nex() == Nex);
77 assert(Cst.
nvol() == Nvol);
78 assert(U.
nex() == Nex);
79 assert(U.
nvol() == Nvol);
84 for (
int mu = 0; mu < Nex; ++mu) {
85 for (
int site = 0; site < Nvol; ++site) {
87 Uorg.
mat(ut, site, mu);
90 Cst.
mat(ct, site, mu);
104 double norm = iQ1.
norm2();
105 if (norm > 1.0e-10) {
112 for (
int cc = 0; cc <
NC *
NC; ++cc) {
113 dcomplex qt = f0 * cmplx(iQ0.r(cc), iQ0.i(cc))
114 + f1 * cmplx(iQ1.
i(cc), -iQ1.
r(cc))
115 - f2 * cmplx(iQ2.
r(cc), iQ2.
i(cc));
116 e_iQ.
set_r(cc, real(qt));
117 e_iQ.
set_i(cc, imag(qt));
145 const int Nvol = iQ.
nvol();
146 const int Nex = iQ.
nex();
152 for (
int mu = 0; mu < Nex; ++mu) {
153 for (
int site = 0; site < Nvol; ++site) {
158 double norm = iQ1.
norm2();
159 if (norm > 1.0e-10) {
166 for (
int cc = 0; cc <
NC *
NC; ++cc) {
167 dcomplex qt = f0 * cmplx(iQ0.
r(cc), iQ0.
i(cc))
168 + f1 * cmplx(iQ1.i(cc), -iQ1.r(cc))
169 - f2 * cmplx(iQ2.r(cc), iQ2.i(cc));
170 e_iQ.
set_ri(cc, site, mu, real(qt), imag(qt));
197 const double alpha,
const Field_G& Sigmap,
207 const int Nex = Xi.
nex();
209 assert(Xi.
nvol() == Nvol);
210 assert(iTheta.
nvol() == Nvol);
211 assert(Sigmap.
nvol() == Nvol);
212 assert(Cst.
nvol() == Nvol);
213 assert(Uorg.
nvol() == Nvol);
214 assert(iTheta.
nex() == Nex);
215 assert(Sigmap.
nex() == Nex);
216 assert(Cst.
nex() == Nex);
217 assert(Uorg.
nex() == Nex);
222 for (
int mu = 0; mu < Nex; ++mu) {
223 for (
int site = 0; site < Nvol; ++site) {
226 Cst.
mat(C_tmp, site, mu);
230 Uorg.
mat(U_tmp, site, mu);
234 Sigmap.
mat(Sigmap_tmp, site, mu);
250 double norm = iQ1.
norm2();
251 if (norm > 1.0e-10) {
258 for (
int cc = 0; cc <
NC *
NC; ++cc) {
259 dcomplex qt = f0 * cmplx(iQ0.r(cc), iQ0.i(cc))
260 + f1 * cmplx(iQ1.
i(cc), -iQ1.
r(cc))
261 - f2 * cmplx(iQ2.
r(cc), iQ2.
i(cc));
262 e_iQ.set(cc, real(qt), imag(qt));
269 double cos_w = cos(w);
271 dcomplex emiu = cmplx(cos(u), -sin(u));
272 dcomplex e2iu = cmplx(cos(2.0 * u), sin(2.0 * u));
274 dcomplex r01 = cmplx(2.0 * u, 2.0 * (u2 - w2)) * e2iu
275 + emiu * cmplx(16.0 * u * cos_w + 2.0 * u * (3.0 * u2 + w2) * xi0,
276 -8.0 * u2 * cos_w + 2.0 * (9.0 * u2 + w2) * xi0);
278 dcomplex r11 = cmplx(2.0, 4.0 * u) * e2iu
279 + emiu * cmplx(-2.0 * cos_w + (3.0 * u2 - w2) * xi0,
280 2.0 * u * cos_w + 6.0 * u * xi0);
282 dcomplex r21 = cmplx(0.0, 2.0) * e2iu
283 + emiu * cmplx(-3.0 * u * xi0, cos_w - 3.0 * xi0);
285 dcomplex r02 = cmplx(-2.0, 0.0) * e2iu
286 + emiu * cmplx(-8.0 * u2 * xi0,
287 2.0 * u * (cos_w + xi0 + 3.0 * u2 * xi1));
289 dcomplex r12 = emiu * cmplx(2.0 * u * xi0,
290 -cos_w - xi0 + 3.0 * u2 * xi1);
292 dcomplex r22 = emiu * cmplx(xi0, -3.0 * u * xi1);
294 double fden = 1.0 / (2 * (9.0 * u2 - w2) * (9.0 * u2 - w2));
296 dcomplex b10 = cmplx(2.0 * u, 0.0) * r01 + cmplx(3.0 * u2 - w2, 0.0) * r02
297 - cmplx(30.0 * u2 + 2.0 * w2, 0.0) * f0;
298 dcomplex b11 = cmplx(2.0 * u, 0.0) * r11 + cmplx(3.0 * u2 - w2, 0.0) * r12
299 - cmplx(30.0 * u2 + 2.0 * w2, 0.0) * f1;
300 dcomplex b12 = cmplx(2.0 * u, 0.0) * r21 + cmplx(3.0 * u2 - w2, 0.0) * r22
301 - cmplx(30.0 * u2 + 2.0 * w2, 0.0) * f2;
303 dcomplex b20 = r01 - cmplx(3.0 * u, 0.0) * r02 - cmplx(24.0 * u, 0.0) * f0;
304 dcomplex b21 = r11 - cmplx(3.0 * u, 0.0) * r12 - cmplx(24.0 * u, 0.0) * f1;
305 dcomplex b22 = r21 - cmplx(3.0 * u, 0.0) * r22 - cmplx(24.0 * u, 0.0) * f2;
307 b10 *= cmplx(fden, 0.0);
308 b11 *= cmplx(fden, 0.0);
309 b12 *= cmplx(fden, 0.0);
310 b20 *= cmplx(fden, 0.0);
311 b21 *= cmplx(fden, 0.0);
312 b22 *= cmplx(fden, 0.0);
315 for (
int cc = 0; cc < NC *
NC; ++cc) {
316 dcomplex qt1 = b10 * cmplx(iQ0.r(cc), iQ0.i(cc))
317 + b11 * cmplx(iQ1.
i(cc), -iQ1.
r(cc))
318 - b12 * cmplx(iQ2.
r(cc), iQ2.
i(cc));
319 B1.set(cc, real(qt1), imag(qt1));
321 dcomplex qt2 = b20 * cmplx(iQ0.r(cc), iQ0.i(cc))
322 + b21 * cmplx(iQ1.
i(cc), -iQ1.
r(cc))
323 - b22 * cmplx(iQ2.
r(cc), iQ2.
i(cc));
324 B2.
set(cc, real(qt2), imag(qt2));
328 USigmap.
mult_nn(U_tmp, Sigmap_tmp);
336 dcomplex tr1 = cmplx(tmp1.
r(0) + tmp1.
r(4) + tmp1.
r(8),
337 tmp1.
i(0) + tmp1.
i(4) + tmp1.
i(8));
338 dcomplex tr2 = cmplx(tmp2.
r(0) + tmp2.
r(4) + tmp2.
r(8),
339 tmp2.
i(0) + tmp2.
i(4) + tmp2.
i(8));
342 iQUS.mult_nn(iQ1, USigmap);
347 for (
int cc = 0; cc < NC *
NC; ++cc) {
348 dcomplex 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));
365 iTheta_tmp.
mult_nn(iGamma, U_tmp);
368 iTheta.
set_mat(site, mu, iTheta_tmp);
371 Xi_tmp.
mult_nn(Sigmap_tmp, e_iQ);
393 const double& u,
const double& w)
396 const double u2 = u * u;
397 const double w2 = w * w;
398 const double cos_w = cos(w);
400 const double cos_u = cos(u);
401 const double sin_u = sin(u);
403 const dcomplex emiu = cmplx(cos_u, -sin_u);
404 const dcomplex e2iu = cmplx(cos_u * cos_u - sin_u * sin_u, 2.0 * sin_u * cos_u);
406 const dcomplex h0 = e2iu * cmplx(u2 - w2, 0.0)
407 + emiu * cmplx(8.0 * u2 * cos_w, 2.0 * u * (3.0 * u2 + w2) * xi0);
408 const dcomplex h1 = cmplx(2 * u, 0.0) * e2iu
409 - emiu * cmplx(2.0 * u * cos_w, -(3.0 * u2 - w2) * xi0);
410 const dcomplex h2 = e2iu - emiu * cmplx(cos_w, 3.0 * u * xi0);
412 const double fden = 1.0 / (9.0 * u2 - w2);
425 const double c0 = -(iQ3.
i(0, 0) + iQ3.
i(1, 1) + iQ3.
i(2, 2)) / 3.0;
426 const double c1 = -0.5 * (iQ2.
r(0, 0) + iQ2.
r(1, 1) + iQ2.
r(2, 2));
427 const double c13r = sqrt(c1 / 3.0);
428 const double c0max = 2.0 * c13r * c13r * c13r;
430 const double theta = acos(c0 / c0max);
433 u = c13r * cos(theta / 3.0);
434 w = sqrt(c1) * sin(theta / 3.0);
453 const double w2 = w * w;
454 const static double c0 = -1.0 / 3.0;
455 const static double c1 = 1.0 / 30.0;
456 const static double c2 = -1.0 / 840.0;
457 const static double c3 = 1.0 / 45360.0;
458 const static double c4 = -1.0 / 3991680.0;
460 return c0 + w2 * (c1 + w2 * (c2 + w2 * (c3 + w2 * c4)));
462 return (w * cos(w) - sin(w)) / (w * w * w);
472 const static int Nprec = 32;
474 const int Nvol = iQ.
nvol();
475 const int Nex = iQ.
nex();
477 for (
int ex = 0; ex < Nex; ++ex) {
478 for (
int site = 0; site < Nvol; ++site) {
487 for (
int iprec = 0; iprec < Nprec; ++iprec) {
488 double exf = 1.0 / (Nprec - iprec);
void force_recursive(Field_G &Xi, Field_G &iTheta, const double alpha, const Field_G &Sigmap, const Field_G &C, const Field_G &U)
determination of fields for force calculation
void set(int c, const double &re, const double &im)
void general(const char *format,...)
double func_xi1(const double w)
void set_uw(double &u, double &w, const Mat_SU_N &iQ2, const Mat_SU_N &iQ3)
Mat_SU_N & at()
antihermitian traceless
double func_xi0(const double w)
void multadd_dn(const Mat_SU_N &u1, const Mat_SU_N &u2)
void set_i(int c, const double &im)
void project(Field_G &U, const double alpha, const Field_G &C, const Field_G &Uorg)
projection U = P[alpha, C, Uorg]
void set_r(int c, const double &re)
void mult_nd(const Mat_SU_N &u1, const Mat_SU_N &u2)
void set_fj(dcomplex &f0, dcomplex &f1, dcomplex &f2, const double &u, const double &w)
void crucial(const char *format,...)
void set_parameters(const Parameters ¶m)
void exp_iQ(Field_G &e_iQ, const Field_G &iQ)
void exp_iQ_bf(Field_G &e_iQ, const Field_G &iQ)
static const std::string class_name
static double get_time()
obtain a wall-clock time.
string get_string(const string &key) const
void set_mat(const int site, const int mn, const Mat_SU_N &U)
Mat_SU_N mat(const int site, const int mn=0) const
void mult_nn(const Mat_SU_N &u1, const Mat_SU_N &u2)
static VerboseLevel set_verbose_level(const std::string &str)
Bridge::VerboseLevel m_vl
void set_ri(const int cc, const int site, const int mn, const double re, const double im)