16 #ifdef USE_PARAMETERS_FACTORY 
   28   bool init = Projection::Factory::Register(
"Stout_SU3", create_object);
 
   40 #ifdef USE_PARAMETERS_FACTORY 
   55   const string str_vlevel = params.
get_string(
"verbose_level");
 
   95   int Nvol = Uorg.
nvol();
 
   97   assert(Cst.
nex() == Nex);
 
   98   assert(Cst.
nvol() == Nvol);
 
   99   assert(U.
nex() == Nex);
 
  100   assert(U.
nvol() == Nvol);
 
  102   int NinG = Uorg.
nin();
 
  109   dcomplex f0, f1, f2, qt;
 
  111   for (
int mu = 0; mu < Nex; ++mu) {
 
  112     for (
int site = 0; site < Nvol; ++site) {
 
  113       Uorg.
mat(ut, site, mu);
 
  114       Cst.
mat(ct, site, mu);
 
  117       iQ2.mult_nn(iQ1, iQ1);
 
  120       double norm = iQ1.norm2();
 
  121       if (norm > 1.0e-10) {
 
  125         for (
int cc = 0; cc < 
NC * 
NC; ++cc) {
 
  126           qt = f0 * cmplx(iQ0.r(cc), iQ0.i(cc))
 
  127                + f1 *cmplx(iQ1.i(cc), -iQ1.r(cc))
 
  128                - f2 *cmplx(iQ2.r(cc), iQ2.i(cc));
 
  129           e_iQ.
setr(cc, real(qt));
 
  130           e_iQ.
seti(cc, imag(qt));
 
  157   int Nvol = iQ.
nvol();
 
  165   dcomplex f0, f1, f2, qt;
 
  167   for (
int mu = 0; mu < Nex; ++mu) {
 
  168     for (
int site = 0; site < Nvol; ++site) {
 
  169       iQ1 = iQ.
mat(site, mu);
 
  173       double norm = iQ1.
norm2();
 
  174       if (norm > 1.0e-10) {
 
  178         for (
int cc = 0; cc < 
NC * 
NC; ++cc) {
 
  179           qt = f0 * cmplx(iQ0.r(cc), iQ0.i(cc))
 
  180                + f1 *cmplx(iQ1.i(cc), -iQ1.r(cc))
 
  181                - f2 *cmplx(iQ2.r(cc), iQ2.i(cc));
 
  182           e_iQ.
set_ri(cc, site, mu, real(qt), imag(qt));
 
  209                                            double alpha, 
const Field_G& Sigmap,
 
  222   assert(Xi.
nvol() == Nvol);
 
  223   assert(iTheta.
nvol() == Nvol);
 
  224   assert(Sigmap.
nvol() == Nvol);
 
  225   assert(Cst.
nvol() == Nvol);
 
  226   assert(Uorg.
nvol() == Nvol);
 
  227   assert(iTheta.
nex() == Nex);
 
  228   assert(Sigmap.
nex() == Nex);
 
  229   assert(Cst.
nex() == Nex);
 
  230   assert(Uorg.
nex() == Nex);
 
  240   double   u, w, u2, w2, cos_w, xi0, xi1, fden;
 
  241   dcomplex f0, f1, f2, h0, h1, h2, e2iu, emiu, qt;
 
  242   dcomplex r01, r11, r21, r02, r12, r22, tr1, tr2;
 
  243   dcomplex b10, b11, b12, b20, b21, b22;
 
  245   for (
int mu = 0; mu < Nex; ++mu) {
 
  246     for (
int site = 0; site < Nvol; ++site) {
 
  248       Cst.
mat(C_tmp, site, mu);
 
  250       Uorg.
mat(U_tmp, site, mu);
 
  252       Sigmap.
mat(Sigmap_tmp, site, mu);
 
  257       iQ2.mult_nn(iQ1, iQ1);
 
  258       iQ3.mult_nn(iQ1, iQ2);
 
  261       double norm = iQ1.norm2();
 
  262       if (norm > 1.0e-10) {
 
  266         for (
int cc = 0; cc < 
NC * 
NC; ++cc) {
 
  267           qt = f0 * cmplx(iQ0.r(cc), iQ0.i(cc))
 
  268                + f1 *cmplx(iQ1.i(cc), -iQ1.r(cc))
 
  269                - f2 *cmplx(iQ2.r(cc), iQ2.i(cc));
 
  270           e_iQ.
set(cc, real(qt), imag(qt));
 
  279         emiu = cmplx(cos(u), -sin(u));
 
  280         e2iu = cmplx(cos(2.0 * u), sin(2.0 * u));
 
  282         r01 = cmplx(2.0 * u, 2.0 * (u2 - w2)) * e2iu
 
  283               + emiu *cmplx(16.0 * u * cos_w + 2.0 * u * (3.0 * u2 + w2) * xi0,
 
  284                             -8.0 * u2 * cos_w + 2.0 * (9.0 * u2 + w2) * xi0);
 
  286         r11 = cmplx(2.0, 4.0 * u) * e2iu
 
  287               + emiu *cmplx(-2.0 * cos_w + (3.0 * u2 - w2) * xi0,
 
  288                             2.0 * u * cos_w + 6.0 * u * xi0);
 
  290         r21 = cmplx(0.0, 2.0) * e2iu
 
  291               + emiu *cmplx(-3.0 * u * xi0, cos_w - 3.0 * xi0);
 
  293         r02 = cmplx(-2.0, 0.0) * e2iu
 
  294               + emiu *cmplx(-8.0 * u2 * xi0,
 
  295                             2.0 * u * (cos_w + xi0 + 3.0 * u2 * xi1));
 
  297         r12 = emiu * cmplx(2.0 * u * xi0,
 
  298                            -cos_w - xi0 + 3.0 * u2 * xi1);
 
  300         r22 = emiu * cmplx(xi0, -3.0 * u * xi1);
 
  302         fden = 1.0 / (2 * (9.0 * u2 - w2) * (9.0 * u2 - w2));
 
  304         b10 = cmplx(2.0 * u, 0.0) * r01 + cmplx(3.0 * u2 - w2, 0.0) * r02
 
  305               - cmplx(30.0 * u2 + 2.0 * w2, 0.0) * f0;
 
  307         b11 = cmplx(2.0 * u, 0.0) * r11 + cmplx(3.0 * u2 - w2, 0.0) * r12
 
  308               - cmplx(30.0 * u2 + 2.0 * w2, 0.0) * f1;
 
  310         b12 = cmplx(2.0 * u, 0.0) * r21 + cmplx(3.0 * u2 - w2, 0.0) * r22
 
  311               - cmplx(30.0 * u2 + 2.0 * w2, 0.0) * f2;
 
  313         b20 = r01 - cmplx(3.0 * u, 0.0) * r02 - cmplx(24.0 * u, 0.0) * f0;
 
  315         b21 = r11 - cmplx(3.0 * u, 0.0) * r12 - cmplx(24.0 * u, 0.0) * f1;
 
  317         b22 = r21 - cmplx(3.0 * u, 0.0) * r22 - cmplx(24.0 * u, 0.0) * f2;
 
  319         b10 *= cmplx(fden, 0.0);
 
  320         b11 *= cmplx(fden, 0.0);
 
  321         b12 *= cmplx(fden, 0.0);
 
  322         b20 *= cmplx(fden, 0.0);
 
  323         b21 *= cmplx(fden, 0.0);
 
  324         b22 *= cmplx(fden, 0.0);
 
  326         for (
int cc = 0; cc < NC * 
NC; ++cc) {
 
  327           qt = b10 * cmplx(iQ0.r(cc), iQ0.i(cc))
 
  328                + b11 *cmplx(iQ1.i(cc), -iQ1.r(cc))
 
  329                - b12 *cmplx(iQ2.r(cc), iQ2.i(cc));
 
  330           B1.set(cc, real(qt), imag(qt));
 
  331           qt = b20 * cmplx(iQ0.r(cc), iQ0.i(cc))
 
  332                + b21 *cmplx(iQ1.i(cc), -iQ1.r(cc))
 
  333                - b22 *cmplx(iQ2.r(cc), iQ2.i(cc));
 
  334           B2.
set(cc, real(qt), imag(qt));
 
  337         USigmap.mult_nn(U_tmp, Sigmap_tmp);
 
  339         tmp1.mult_nn(USigmap, B1);
 
  341         tr1 = cmplx(tmp1.r(0) + tmp1.r(4) + tmp1.r(8),
 
  342                     tmp1.i(0) + tmp1.i(4) + tmp1.i(8));
 
  343         tr2 = cmplx(tmp2.
r(0) + tmp2.
r(4) + tmp2.
r(8),
 
  344                     tmp2.
i(0) + tmp2.
i(4) + tmp2.
i(8));
 
  346         iQUS.mult_nn(iQ1, USigmap);
 
  347         iUSQ.mult_nn(USigmap, iQ1);
 
  349         for (
int cc = 0; cc < NC * 
NC; ++cc) {
 
  350           qt = tr1 * cmplx(iQ1.i(cc), -iQ1.r(cc))
 
  351                - tr2 *cmplx(iQ2.r(cc), iQ2.i(cc))
 
  352                + f1  *cmplx(USigmap.r(cc), USigmap.i(cc))
 
  353                + f2  *cmplx(iQUS.i(cc), -iQUS.r(cc))
 
  354                + f2  *cmplx(iUSQ.i(cc), -iUSQ.r(cc));
 
  355           iGamma.
set(cc, -imag(qt), real(qt));
 
  365       iTheta_tmp.
mult_nn(iGamma, U_tmp);
 
  367       iTheta.
set_mat(site, mu, iTheta_tmp);
 
  369       Xi_tmp.mult_nn(Sigmap_tmp, e_iQ);
 
  370       Xi_tmp.multadd_dn(C_tmp, iGamma);
 
  390                                   const double& u, 
const double& w)
 
  392   dcomplex h0, h1, h2, e2iu, emiu, ixi0, qt;
 
  393   double   xi0, u2, w2, cos_w, fden;
 
  401   double cos_u = cos(u);
 
  402   double sin_u = sin(u);
 
  403   emiu = cmplx(cos_u, -sin_u);
 
  404   e2iu = cmplx(cos_u * cos_u - sin_u * sin_u, 2.0 * sin_u * cos_u);
 
  406   h0 = e2iu * cmplx(u2 - w2, 0.0)
 
  407        + emiu *cmplx(8.0 * u2 * cos_w, 2.0 * u * (3.0 * u2 + w2) * xi0);
 
  408   h1 = cmplx(2 * u, 0.0) * e2iu
 
  409        - emiu      *cmplx(2.0 * u * cos_w, -(3.0 * u2 - w2) * xi0);
 
  410   h2 = e2iu - emiu *cmplx(cos_w, 3.0 * u * xi0);
 
  412   fden = 1.0 / (9.0 * u2 - w2);
 
  423   double c0, c1, c0max, theta;
 
  425   c0 = -(iQ3.
i(0, 0) + iQ3.
i(1, 1) + iQ3.
i(2, 2)) / 3.0;
 
  426   c1 = -0.5 * (iQ2.
r(0, 0) + iQ2.
r(1, 1) + iQ2.
r(2, 2));
 
  427   double c13r = sqrt(c1 / 3.0);
 
  428   c0max = 2.0 * c13r * c13r * c13r;
 
  430   theta = acos(c0 / c0max);
 
  431   u     = c13r * cos(theta / 3.0);
 
  432   w     = sqrt(c1) * sin(theta / 3.0);
 
  441   double xi0 = sin(w) / w;
 
  443   if (w < epsilon_criterion) {
 
  456   double xi1 = cos(w) / (w * w) - sin(w) / (w * w * w);
 
  458   if (w < epsilon_criterion) {
 
  473   int Nvol = iQ.
nvol();
 
  479   for (
int ex = 0; ex < Nex; ++ex) {
 
  480     for (
int site = 0; site < Nvol; ++site) {
 
  483       h1 = iQ.
mat(site, ex);
 
  485       for (
int iprec = 0; iprec < Nprec; ++iprec) {
 
  486         double exf = 1.0 / (Nprec - iprec);
 
void Register_string(const string &, const string &)
 
static double epsilon_criterion()
 
void seti(int c, const double &im)
 
void setr(int c, const double &re)
 
void general(const char *format,...)
 
Parameters_Projection_Stout_SU3()
 
void force_recursive(Field_G &Xi, Field_G &iTheta, double alpha, const Field_G &Sigmap, const Field_G &C, const Field_G &U)
determination of fields for force calculation 
 
void set_uw(double &u, double &w, const Mat_SU_N &iQ1, const Mat_SU_N &iQ2)
 
Mat_SU_N & at()
antihermitian traceless 
 
double func_xi0(double w)
 
void project(Field_G &U, double alpha, const Field_G &C, const Field_G &Uorg)
projection U = P[alpha, C, Uorg] 
 
double func_xi1(double w)
 
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)
 
base class for projection operator into gauge group. 
 
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 bool Register(const std::string &realm, const creator_callback &cb)
 
static const std::string class_name
 
static double get_time()
obtain a wall-clock time. 
 
void set(int c, double re, const double &im)
 
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)