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