Go to the documentation of this file.
15 #ifdef USE_FACTORY_AUTOREGISTER
17 bool init = Fopr_Clover_SF::register_factory();
25 inline double mult_uv_r(
const double *g,
const double *w)
27 return g[0] * w[0] - g[1] * w[1]
28 + g[2] * w[2] - g[3] * w[3]
29 + g[4] * w[4] - g[5] * w[5];
33 inline double mult_uv_i(
const double *g,
const double *w)
35 return g[0] * w[1] + g[1] * w[0]
36 + g[2] * w[3] + g[3] * w[2]
37 + g[4] * w[5] + g[5] * w[4];
66 vout.
crucial(
"%s: only Dirac repr. is available.\n");
116 vout.
crucial(
"%s: only Dirac repr. is accepted/\n");
225 std::vector<double> phi, phipr;
228 int err_optional = 0;
249 const std::vector<int> bc,
250 const std::vector<double> phi,
251 const std::vector<double> phipr)
270 const std::vector<int> bc,
271 const std::vector<double> phi,
272 const std::vector<double> phipr)
276 assert(bc.size() ==
m_Ndim);
288 for (
int i = 0; i < 3; ++i) {
300 for (
int mu = 0; mu <
m_Ndim; ++mu) {
353 if (ith == 0)
m_mode = mode;
364 }
else if (
m_mode ==
"DdagD") {
366 }
else if (
m_mode ==
"Ddag") {
368 }
else if (
m_mode ==
"H") {
383 }
else if (
m_mode ==
"DdagD") {
385 }
else if (
m_mode ==
"Ddag") {
387 }
else if (
m_mode ==
"H") {
399 const std::string mode)
403 }
else if (mode ==
"DdagD") {
405 }
else if (mode ==
"Ddag") {
407 }
else if (mode ==
"H") {
419 const std::string mode)
423 }
else if (mode ==
"DdagD") {
425 }
else if (mode ==
"Ddag") {
427 }
else if (mode ==
"H") {
440 assert(f.
nex() == 1);
452 assert(f.
nex() == 1);
463 assert(f.
nex() == 1);
473 assert(f.
nex() == 1);
490 const int mu,
const int nu)
510 assert(w.
nex() == 1);
512 const int Nvc = 2 *
m_Nc;
517 const int id3 = Nvc * 2;
518 const int id4 = Nvc * 3;
520 const double *w2 = w.
ptr(0);
521 double *v2 = v.
ptr(0);
533 int ith, nth, is, ns;
534 set_threadtask(ith, nth, is, ns,
m_Nvol);
536 for (
int site = is; site < ns; ++site) {
537 int iv = Nvc *
m_Nd * site;
540 for (
int ic = 0; ic <
m_Nc; ++ic) {
542 int ic_i = 2 * ic + 1;
543 int ic_g = ic * Nvc + ig;
546 v2[ic_r + id1 + iv] -= mult_uv_i(&Bx[ic_g], &w2[id2 + iv]);
547 v2[ic_i + id1 + iv] += mult_uv_r(&Bx[ic_g], &w2[id2 + iv]);
548 v2[ic_r + id2 + iv] -= mult_uv_i(&Bx[ic_g], &w2[id1 + iv]);
549 v2[ic_i + id2 + iv] += mult_uv_r(&Bx[ic_g], &w2[id1 + iv]);
551 v2[ic_r + id3 + iv] -= mult_uv_i(&Bx[ic_g], &w2[id4 + iv]);
552 v2[ic_i + id3 + iv] += mult_uv_r(&Bx[ic_g], &w2[id4 + iv]);
553 v2[ic_r + id4 + iv] -= mult_uv_i(&Bx[ic_g], &w2[id3 + iv]);
554 v2[ic_i + id4 + iv] += mult_uv_r(&Bx[ic_g], &w2[id3 + iv]);
557 v2[ic_r + id1 + iv] += mult_uv_r(&By[ic_g], &w2[id2 + iv]);
558 v2[ic_i + id1 + iv] += mult_uv_i(&By[ic_g], &w2[id2 + iv]);
559 v2[ic_r + id2 + iv] -= mult_uv_r(&By[ic_g], &w2[id1 + iv]);
560 v2[ic_i + id2 + iv] -= mult_uv_i(&By[ic_g], &w2[id1 + iv]);
562 v2[ic_r + id3 + iv] += mult_uv_r(&By[ic_g], &w2[id4 + iv]);
563 v2[ic_i + id3 + iv] += mult_uv_i(&By[ic_g], &w2[id4 + iv]);
564 v2[ic_r + id4 + iv] -= mult_uv_r(&By[ic_g], &w2[id3 + iv]);
565 v2[ic_i + id4 + iv] -= mult_uv_i(&By[ic_g], &w2[id3 + iv]);
568 v2[ic_r + id1 + iv] -= mult_uv_i(&Bz[ic_g], &w2[id1 + iv]);
569 v2[ic_i + id1 + iv] += mult_uv_r(&Bz[ic_g], &w2[id1 + iv]);
570 v2[ic_r + id2 + iv] += mult_uv_i(&Bz[ic_g], &w2[id2 + iv]);
571 v2[ic_i + id2 + iv] -= mult_uv_r(&Bz[ic_g], &w2[id2 + iv]);
573 v2[ic_r + id3 + iv] -= mult_uv_i(&Bz[ic_g], &w2[id3 + iv]);
574 v2[ic_i + id3 + iv] += mult_uv_r(&Bz[ic_g], &w2[id3 + iv]);
575 v2[ic_r + id4 + iv] += mult_uv_i(&Bz[ic_g], &w2[id4 + iv]);
576 v2[ic_i + id4 + iv] -= mult_uv_r(&Bz[ic_g], &w2[id4 + iv]);
579 v2[ic_r + id1 + iv] += mult_uv_i(&Ex[ic_g], &w2[id4 + iv]);
580 v2[ic_i + id1 + iv] -= mult_uv_r(&Ex[ic_g], &w2[id4 + iv]);
581 v2[ic_r + id2 + iv] += mult_uv_i(&Ex[ic_g], &w2[id3 + iv]);
582 v2[ic_i + id2 + iv] -= mult_uv_r(&Ex[ic_g], &w2[id3 + iv]);
584 v2[ic_r + id3 + iv] += mult_uv_i(&Ex[ic_g], &w2[id2 + iv]);
585 v2[ic_i + id3 + iv] -= mult_uv_r(&Ex[ic_g], &w2[id2 + iv]);
586 v2[ic_r + id4 + iv] += mult_uv_i(&Ex[ic_g], &w2[id1 + iv]);
587 v2[ic_i + id4 + iv] -= mult_uv_r(&Ex[ic_g], &w2[id1 + iv]);
590 v2[ic_r + id1 + iv] -= mult_uv_r(&Ey[ic_g], &w2[id4 + iv]);
591 v2[ic_i + id1 + iv] -= mult_uv_i(&Ey[ic_g], &w2[id4 + iv]);
592 v2[ic_r + id2 + iv] += mult_uv_r(&Ey[ic_g], &w2[id3 + iv]);
593 v2[ic_i + id2 + iv] += mult_uv_i(&Ey[ic_g], &w2[id3 + iv]);
595 v2[ic_r + id3 + iv] -= mult_uv_r(&Ey[ic_g], &w2[id2 + iv]);
596 v2[ic_i + id3 + iv] -= mult_uv_i(&Ey[ic_g], &w2[id2 + iv]);
597 v2[ic_r + id4 + iv] += mult_uv_r(&Ey[ic_g], &w2[id1 + iv]);
598 v2[ic_i + id4 + iv] += mult_uv_i(&Ey[ic_g], &w2[id1 + iv]);
601 v2[ic_r + id1 + iv] += mult_uv_i(&Ez[ic_g], &w2[id3 + iv]);
602 v2[ic_i + id1 + iv] -= mult_uv_r(&Ez[ic_g], &w2[id3 + iv]);
603 v2[ic_r + id2 + iv] -= mult_uv_i(&Ez[ic_g], &w2[id4 + iv]);
604 v2[ic_i + id2 + iv] += mult_uv_r(&Ez[ic_g], &w2[id4 + iv]);
606 v2[ic_r + id3 + iv] += mult_uv_i(&Ez[ic_g], &w2[id1 + iv]);
607 v2[ic_i + id3 + iv] -= mult_uv_r(&Ez[ic_g], &w2[id1 + iv]);
608 v2[ic_r + id4 + iv] -= mult_uv_i(&Ez[ic_g], &w2[id2 + iv]);
609 v2[ic_i + id4 + iv] += mult_uv_r(&Ez[ic_g], &w2[id2 + iv]);
641 const int mu,
const int nu)
676 const double gflop = 0.0;
Set of Gamma Matrices: basis class.
void set_parameters_impl(const Parameters ¶ms)
void set_parameters(const Parameters ¶ms)
sets parameters by a Parameter object: to be implemented in a subclass.
void mult_dag(Field &v, const Field &f)
hermitian conjugate of mult.
void H(Field &, const Field &)
void mult_Field_Gdn(Field_G &W, const int ex, const Field_G &U1, const int ex1, const Field_G &U2, const int ex2)
void set_string(const string &key, const string &value)
void set_parameters(const Parameters ¶ms)
void forward(Field &, const Field &, const int mu)
void mult_csw(Field &, const Field &)
void set_parameters(const Parameters ¶ms)
sets parameters by a Parameter object: to be implemented in a subclass.
void set(const int jin, const int site, const int jex, double v)
void set_double(const string &key, const double value)
std::vector< GammaMatrix > m_SG
void init(const Parameters ¶ms)
void set_config(Field *U)
sets the gauge configuration.
void get_parameters(Parameters ¶ms) const
gets parameters by a Parameter object: to be implemented in a subclass.
void mult_isigma(Field_F &, const Field_F &, const int mu, const int nu)
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
void set_config(Field *U)
setup configuration (Note that this method is not multi-threaded).
void set_double_vector(const string &key, const vector< double > &value)
void upper(Field_G &, const Field_G &, const int, const int)
static const std::string class_name
void DdagD(Field &, const Field &)
void set_boundary_zero(Field_G &u)
Fopr_Wilson_SF * m_fopr_w
int sg_index(const int mu, const int nu)
void ah_Field_G(Field_G &W, const int ex)
void mult_gm5(Field &v, const Field &w)
multiplies gamma_5 matrix.
void mult_iGM(Field_F &y, const GammaMatrix &gm, const Field_F &x)
gamma matrix multiplication (i is multiplied)
int fetch_int_vector(const string &key, vector< int > &value) const
void set_mode(const std::string mode)
setting the mode of multiplication if necessary. Default implementation here is just to avoid irrelev...
void mult(Field &v, const Field &f)
multiplies fermion operator to a given field.
std::vector< int > m_boundary
void D(Field &, const Field &)
void reset(const int Nin, const int Nvol, const int Nex, const element_type cmpl=Element_type::COMPLEX)
void set_int_vector(const string &key, const vector< int > &value)
Methods to shift a field in the lexical site index.
void multadd_Field_Gnd(Field_G &W, const int ex, const Field_G &U1, const int ex1, const Field_G &U2, const int ex2, const double ff)
void set_fieldstrength(Field_G &, const int, const int)
void D(Field &, const Field &)
const double * ptr(const int jin, const int site, const int jex) const
static Bridge::VerboseLevel Vlevel()
void lower(Field_G &, const Field_G &, const int, const int)
void Ddag(Field &, const Field &)
static VerboseLevel set_verbose_level(const std::string &str)
std::vector< GammaMatrix > m_GM
double flop_count()
this returns the number of floating point number operations.
void scal(Field &x, const double a)
scal(x, a): x = a * x
int fetch_string(const string &key, string &value) const
Bridge::VerboseLevel m_vl
Wilson-type fermion field.
int fetch_double(const string &key, double &value) const
GammaMatrix get_GM(GMspecies spec)
std::vector< double > m_phipr
SF boundary condition at t = Nt.
void crucial(const char *format,...)
void mult_csw_dirac(Field &, const Field &)
std::vector< double > m_phi
SF boundary condition at t = 0.
Container of Field-type object.
static int get_thread_id()
returns thread id.
int fetch_double_vector(const string &key, vector< double > &value) const
void general(const char *format,...)
void multadd_Field_Gdn(Field_G &W, const int ex, const Field_G &U1, const int ex1, const Field_G &U2, const int ex2, const double ff)
void mult_Field_Gnd(Field_G &W, const int ex, const Field_G &U1, const int ex1, const Field_G &U2, const int ex2)
Wilson fermion operator with SF BC.
static void assert_single_thread(const std::string &class_name)
assert currently running on single thread.
static std::string get_verbose_level(const VerboseLevel vl)