19 #ifdef USE_PARAMETERS_FACTORY 
   25 #if defined USE_GROUP_SU3 
   26 #include "fopr_Wilson_impl_SU3.inc" 
   27 #elif defined USE_GROUP_SU2 
   28 #include "fopr_Wilson_impl_SU2.inc" 
   29 #elif defined USE_GROUP_SU_N 
   30 #include "fopr_Wilson_impl_SU_N.inc" 
   46 #ifdef USE_PARAMETERS_FACTORY 
   55 { append_entry(*
this); }
 
  128   const string str_vlevel = params.
get_string(
"verbose_level");
 
  152                                         const std::valarray<int> bc)
 
  158   for (
int mu = 0; mu < 
m_Ndim; ++mu) {
 
  164   assert(bc.size() == 
m_Ndim);
 
  169   assert(bc.size() == 
m_Ndim);
 
  170   for (
int mu = 0; mu < 
m_Ndim; ++mu) {
 
  193   params_solver->
set_string(
"solver_type", 
"CG");
 
  194   params_solver->
set_int(
"maximum_number_of_iteration", 1000);
 
  195   params_solver->
set_double(
"convergence_criterion_squared", 1.0e-30);
 
  197   params_solver->
set_string(
"verbose_level", 
"Crucial");
 
  208   for (
int ispin = 0; ispin < 
m_Nd; ++ispin) {
 
  209     for (
int icolor = 0; icolor < 
m_Nc; ++icolor) {
 
  210       int spin_color = icolor + m_Nc * ispin;
 
  212       for (
int isite = 0; isite < 
m_Nvol2; ++isite) {
 
  213         w.set_ri(icolor, ispin, isite, 0, 1, 0);
 
  221         solver->
solve(w2, w, Nconv, diff);
 
  226         solver->
solve(w2, w, Nconv, diff);
 
  233   delete params_solver;
 
  238   for (
int ics = 0; ics < m_Nc * 
m_Nd; ++ics) {
 
  239     for (
int site = 0; site < 
m_Nvol2; ++site) {
 
  240       for (
int id = 0; 
id < 
m_Nd; ++id) {
 
  241         for (
int ic = 0; ic < 
m_Nc; ++ic) {
 
  270                                       const Field& f, 
const int ieo)
 
  274   } 
else if (
m_repr == 
"Chiral") {
 
  282                                             const Field& f, 
const int ieo)
 
  286   double *
v1 = 
const_cast<Field *
>(&f)->ptr(0);
 
  287   double *
v2 = v.
ptr(0);
 
  292   } 
else if (ieo == 1) {
 
  308   int is  = m_Nvol2 * ith / nth;
 
  309   int ns  = m_Nvol2 * (ith + 1) / nth;
 
  312   for (
int site = is; site < ns; ++site) {
 
  313     for (
int icd = 0; icd < m_Nc * Nd2; ++icd) {
 
  314       int iv2 = 2 * icd + 
m_NinF * site;
 
  317       for (
int jd = 0; jd < 
m_Nd; ++jd) {
 
  319         int iv  = jcd + 
m_NinF * site;
 
  320         int ig  = jcd + 
m_NinF * (site + m_Nvol2 * icd);
 
  321         v2[iv2]     += mult_uv_r(&csw_inv[ig], &v1[iv], m_Nc);
 
  322         v2[iv2 + 1] += mult_uv_i(&csw_inv[ig], &v1[iv], m_Nc);
 
  326     for (
int icd = 0; icd < m_Nc * Nd2; ++icd) {
 
  327       int iv2 = 2 * (icd + m_Nc * Nd2) + 
m_NinF * site;
 
  330       for (
int jd = 0; jd < 
m_Nd; ++jd) {
 
  331         int jd2 = (jd + Nd2) % m_Nd;
 
  332         int iv  = Nvc * jd + 
m_NinF * site;
 
  333         int ig  = Nvc * jd2 + 
m_NinF * (site + m_Nvol2 * icd);
 
  334         v2[iv2]     += mult_uv_r(&csw_inv[ig], &v1[iv], m_Nc);
 
  335         v2[iv2 + 1] += mult_uv_i(&csw_inv[ig], &v1[iv], m_Nc);
 
  345                                              const Field& f, 
const int ieo)
 
  349   double *v1 = 
const_cast<Field *
>(&f)->ptr(0);
 
  350   double *v2 = v.
ptr(0);
 
  355   } 
else if (ieo == 1) {
 
  371   int is  = m_Nvol2 * ith / nth;
 
  372   int ns  = m_Nvol2 * (ith + 1) / nth;
 
  374   for (
int site = is; site < ns; ++site) {
 
  375     for (
int icd = 0; icd < m_Nc * m_Nd / 2; ++icd) {
 
  376       int iv2 = 2 * icd + 
m_NinF * site;
 
  380       for (
int jd = 0; jd < m_Nd / 2; ++jd) {
 
  382         int iv  = jcd + 
m_NinF * site;
 
  383         int ig  = jcd + 
m_NinF * (site + m_Nvol2 * icd);
 
  384         v2[iv2]     += mult_uv_r(&csw_inv[ig], &v1[iv], m_Nc);
 
  385         v2[iv2 + 1] += mult_uv_i(&csw_inv[ig], &v1[iv], m_Nc);
 
  389     for (
int icd = m_Nc * m_Nd / 2; icd < m_Nc * 
m_Nd; ++icd) {
 
  390       int iv2 = 2 * icd + 
m_NinF * site;
 
  394       for (
int jd = m_Nd / 2; jd < 
m_Nd; ++jd) {
 
  396         int iv  = jcd + 
m_NinF * site;
 
  397         int ig  = jcd + 
m_NinF * (site + m_Nvol2 * icd);
 
  398         v2[iv2]     += mult_uv_r(&csw_inv[ig], &v1[iv], m_Nc);
 
  399         v2[iv2 + 1] += mult_uv_i(&csw_inv[ig], &v1[iv], m_Nc);
 
  410   std::vector<double> matrix(m_Nc * m_Nc * m_Nd * m_Nd * 2);
 
  412   for (
int ispin = 0; ispin < m_Nd / 2; ++ispin) {
 
  413     for (
int icolor = 0; icolor < 
m_Nc; ++icolor) {
 
  414       int ics = icolor + ispin * 
m_Nc;
 
  415       for (
int jspin = 0; jspin < 
m_Nd; ++jspin) {
 
  416         int js2 = (jspin + m_Nd / 2) % m_Nd;
 
  417         for (
int jcolor = 0; jcolor < 
m_Nc; ++jcolor) {
 
  418           int cs1 = jcolor + m_Nc * (jspin + m_Nd * ics);
 
  419           int cs2 = jcolor + m_Nc * (jspin + m_Nd * (ics + m_Nc * m_Nd / 2));
 
  420           int cc  = jcolor + icolor * 
m_Nc;
 
  421           int ss1 = jspin + ispin * 
m_Nd;
 
  422           int ss2 = js2 + ispin * 
m_Nd;
 
  424           matrix[2 * cs1]     = 
m_T.
cmp_r(cc, site, ss1);
 
  425           matrix[2 * cs1 + 1] = 
m_T.
cmp_i(cc, site, ss1);
 
  427           matrix[2 * cs2]     = 
m_T.
cmp_r(cc, site, ss2);
 
  428           matrix[2 * cs2 + 1] = 
m_T.
cmp_i(cc, site, ss2);
 
  443   } 
else if (
m_repr == 
"Chiral") {
 
  457   double *fp = 
const_cast<Field *
>(&f)->ptr(0);
 
  458   double *vp = v.
ptr(0);
 
  459   double *tp = 
m_T.
ptr(0, m_Nvol2 * ieo, 0);
 
  463   int is  = m_Nvol2 * ith / nth;
 
  464   int ns  = m_Nvol2 * (ith + 1) / nth;
 
  468   int NinF = 2 * m_Nc * 
m_Nd;
 
  469   int NinG = 2 * m_Nc * 
m_Nc;
 
  471   for (
int site = is; site < ns; ++site) {
 
  472     for (
int id = 0; 
id < Nd2; ++id) {
 
  473       for (
int ic = 0; ic < 
m_Nc; ++ic) {
 
  474         int icd = ic + m_Nc * id;
 
  476         int iv2 = 2 * icd + NinF * site;
 
  479         for (
int jd = 0; jd < 
m_Nd; ++jd) {
 
  480           int iv = Nvc * jd + NinF * site;
 
  481           int ig = Nvc * ic + NinG * (site + 
m_Nvol * (
id * m_Nd + jd));
 
  482           vp[iv2]     += mult_uv_r(&tp[ig], &fp[iv], m_Nc);
 
  483           vp[iv2 + 1] += mult_uv_i(&tp[ig], &fp[iv], m_Nc);
 
  489         for (
int jd = 0; jd < 
m_Nd; ++jd) {
 
  490           int jd2 = (2 + jd) % m_Nd;
 
  491           int iv  = Nvc * jd + NinF * site;
 
  492           int ig  = Nvc * ic + NinG * (site + 
m_Nvol * (
id * m_Nd + jd2));
 
  493           vp[iv2]     += mult_uv_r(&tp[ig], &fp[iv], m_Nc);
 
  494           vp[iv2 + 1] += mult_uv_i(&tp[ig], &fp[iv], m_Nc);
 
  506   double *fp = 
const_cast<Field *
>(&f)->ptr(0);
 
  507   double *vp = v.
ptr(0);
 
  508   double *tp = 
m_T.
ptr(0, m_Nvol2 * ieo, 0);
 
  512   int is  = m_Nvol2 * ith / nth;
 
  513   int ns  = m_Nvol2 * (ith + 1) / nth;
 
  517   int NinF = 2 * m_Nc * 
m_Nd;
 
  518   int NinG = 2 * m_Nc * 
m_Nc;
 
  520   for (
int site = is; site < ns; ++site) {
 
  521     for (
int id = 0; 
id < Nd2; ++id) {
 
  522       for (
int ic = 0; ic < 
m_Nc; ++ic) {
 
  523         int icd = ic + m_Nc * id;
 
  525         int iv2 = 2 * icd + NinF * site;
 
  528         for (
int jd = 0; jd < Nd2; ++jd) {
 
  529           int iv = Nvc * jd + NinF * site;
 
  530           int ig = Nvc * ic + NinG * (site + 
m_Nvol * (
id * Nd2 + jd));
 
  531           vp[iv2]     += mult_uv_r(&tp[ig], &fp[iv], m_Nc);
 
  532           vp[iv2 + 1] += mult_uv_i(&tp[ig], &fp[iv], m_Nc);
 
  538         for (
int jd = 0; jd < Nd2; ++jd) {
 
  539           int iv = Nvc * (Nd2 + jd) + NinF * site;
 
  540           int ig = Nvc * ic + NinG * (site + 
m_Nvol * (m_Nd + 
id * Nd2 + jd));
 
  541           vp[iv2]     += mult_uv_r(&tp[ig], &fp[iv], m_Nc);
 
  542           vp[iv2 + 1] += mult_uv_i(&tp[ig], &fp[iv], m_Nc);
 
  553                                      const int mu, 
const int nu)
 
  565   } 
else if (
m_repr == 
"Chiral") {
 
  723                                            const int mu, 
const int nu)
 
  735   for (
int site = 0; site < 
m_Nvol; ++site) {
 
  736     w.set_mat(site, 0, Umu.mat(site) * Cup.mat_dag(site));
 
  739   for (
int site = 0; site < 
m_Nvol; ++site) {
 
  740     v2.set_mat(site, 0, Umu.mat(site) * Cdn.mat_dag(site));
 
  745   for (
int site = 0; site < 
m_Nvol; ++site) {
 
  746     v.set_mat(site, 0, Cup.mat_dag(site) * Umu.mat(site));
 
  749   for (
int site = 0; site < 
m_Nvol; ++site) {
 
  750     v2.set_mat(site, 0, Cdn.mat_dag(site) * Umu.mat(site));
 
  759   for (
int site = 0; site < 
m_Nvol; ++site) {
 
  760     Fst.
set_mat(site, 0, w.mat(site).ah());
 
  772   Field_F  sigma_inv(m_Nvol, nex_finv);
 
  773   Field_G  tr_sigma_inv(m_Nvol, 1);
 
  776     Field_F sigma_eo_inv(m_Nvol2, nex_finv);
 
  783   for (
int isite = 0; isite < 
m_Nvol; ++isite) {
 
  784     for (
int ispin = 0; ispin < 
m_Nd; ++ispin) {
 
  785       for (
int icolor = 0; icolor < 
m_Nc; ++icolor) {
 
  786         v = sigma_inv.vec(ispin, isite, icolor + m_Nc * ispin);
 
  787         for (
int jcolor = 0; jcolor < 
m_Nc; ++jcolor) {
 
  788           int cc = icolor + m_Nc * jcolor;
 
  789           tr_sigma_inv.set_r(cc, isite, 0, v.
r(jcolor));
 
  790           tr_sigma_inv.set_i(cc, isite, 0, v.
i(jcolor));
 
  807   double flop_site = 0.0;
 
  810     flop_site = 
static_cast<double>(8 * m_Nc * m_Nc * m_Nd * 
m_Nd);
 
  811   } 
else if (
m_repr == 
"Chiral") {
 
  812     flop_site = 
static_cast<double>(4 * m_Nc * m_Nc * m_Nd * 
m_Nd);
 
  815   double flop = flop_site * 
static_cast<double>(Lvol / 2);
 
void scal(Field &x, const double a)
scal(x, a): x = a * x 
 
void D_chiral(Field &v, const Field &f, const int ieo)
explicit implementation for Chiral representation (for Imp-version). 
 
void init(std::string repr)
 
double cmp_i(const int cc, const int s, const int site, const int e=0) const 
 
void detailed(const char *format,...)
 
static int get_num_threads()
returns available number of threads. 
 
void Register_string(const string &, const string &)
 
double r(const int c) const 
 
void set(const int jin, const int site, const int jex, double v)
 
Parameters_Fopr_CloverTerm_eo()
 
void general(const char *format,...)
 
GammaMatrix get_GM(GMspecies spec)
 
void set_int(const string &key, const int value)
 
double * ptr(const int jin, const int site, const int jex)
 
Container of Field-type object. 
 
void D_dirac(Field &v, const Field &f, const int ieo)
explicit implementation for Dirac representation (for Imp-version). 
 
double cmp_i(const int cc, const int site, const int mn=0) const 
 
Field_G m_T
m_T = 1 - kappa c_SW sigma F / 2 
 
void set_csw_dirac()
explicit implementation for Dirac representation (for Imp-version). 
 
std::valarray< GammaMatrix > m_SG
 
void mult_csw_inv_chiral(Field &, const Field &, const int ieo)
 
void set_parameters(const Parameters ¶ms)
 
static Parameters * New(const std::string &realm)
 
Standard Conjugate Gradient solver algorithm. 
 
int fetch_int_vector(const string &key, std::valarray< int > &val) const 
 
static int get_thread_id()
returns thread id. 
 
Wilson-type fermion field. 
 
virtual void set_parameters(const Parameters ¶ms)=0
 
void set_string(const string &key, const string &value)
 
static double epsilon_criterion2()
 
void reset(int Nvol, int Nex)
 
static const std::string class_name
 
const Field_F mult_csw_inv(const Field_F &, const int ieo)
 
void mult_iGM(Field_F &y, const GammaMatrix &gm, const Field_F &x)
gamma matrix multiplication (i is multiplied) 
 
void mult_isigma(Field_F &, const Field_F &, const int mu, const int nu)
 
double i(const int c) const 
 
void set_ri(const int cc, const int s, const int site, const int e, const double re, const double im)
 
Bridge::VerboseLevel m_vl
 
const Field D(const Field &f, const int ieo)
 
Set of Gamma Matrices: basis class. 
 
Field_G upper(const Field_G *, const int, const int)
 
void set_fieldstrength(Field_G &, const int, const int)
 
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y 
 
void crucial(const char *format,...)
 
Base class for linear solver class family. 
 
static bool Register(const std::string &realm, const creator_callback &cb)
 
void set_double(const string &key, const double value)
 
void set_mode(std::string mode)
setting the mode of multiplication if necessary. Default implementation here is just to avoid irrelev...
 
void reverseField(Field &lex, const Field &eo)
 
void forward(Field &, const Field &, const int mu)
 
const Field_G trSigmaInv(const int mu, const int nu)
 
Field_G lower(const Field_G *, const int, const int)
 
std::valarray< int > m_boundary
 
void Register_double(const string &, const double)
 
double cmp_r(const int cc, const int site, const int mn=0) const 
 
void Register_int_vector(const string &, const std::valarray< int > &)
 
void setpart_ex(int ex, const Field &w, int exw)
 
int fetch_double(const string &key, double &val) const 
 
string get_string(const string &key) const 
 
void set_mat(const int site, const int mn, const Mat_SU_N &U)
 
void set_csw_chiral()
explicit implementation for Chiral representation (for Imp-version). 
 
void mult_csw_inv_dirac(Field &, const Field &, const int ieo)
 
std::valarray< GammaMatrix > m_GM
Gamma Matrix and Sigma_{mu,nu} = -i [Gamma_mu, Gamma_nu] /2. 
 
double flop_count()
retuns number of floating point number operations. 
 
std::vector< double > csmatrix(const int &)
 
int sg_index(int mu, int nu)
 
virtual void solve(Field &solution, const Field &source, int &Nconv, double &diff)=0
 
static VerboseLevel set_verbose_level(const std::string &str)
 
void set_config(Field *Ueo)
setting pointer to the gauge configuration. 
 
double cmp_r(const int cc, const int s, const int site, const int e=0) const