16 #ifdef USE_PARAMETERS_FACTORY
29 bool init = Fopr::Factory_noarg::Register(
"Clover_SF", create_object);
48 #ifdef USE_PARAMETERS_FACTORY
63 const std::string str_vlevel = params.
get_string(
"verbose_level");
68 std::string str_gmset_type;
71 std::vector<double> phi, phipr;
75 err_optional += params.
fetch_string(
"gamma_matrix_type", str_gmset_type);
96 double *phi,
double *phipr)
102 for (
int mu = 0; mu <
m_Ndim; ++mu) {
115 assert(bc.size() ==
m_Ndim);
121 for (
int i = 0; i < 3; ++i) {
126 for (
int mu = 0; mu <
m_Ndim; ++mu) {
137 inline double mult_uv_r(
const double *u,
const double *v)
139 return u[0] * v[0] - u[1] * v[1]
140 + u[2] * v[2] - u[3] * v[3]
141 + u[4] * v[4] - u[5] * v[5];
145 inline double mult_uv_i(
const double *u,
const double *v)
147 return u[0] * v[1] + u[1] * v[0]
148 + u[2] * v[3] + u[3] * v[2]
149 + u[4] * v[5] + u[5] * v[4];
223 assert(f.
nex() == 1);
236 assert(f.
nex() == 1);
248 assert(f.
nex() == 1);
259 assert(f.
nex() == 1);
280 const int mu,
const int nu)
291 (this->*
m_csw)(v, w);
298 assert(w.
nex() == 1);
302 int Ndf = 2 * Nc * Nc;
311 const double *w2 = w.
ptr(0);
312 double *v2 = v.
ptr(0);
323 for (
int site = 0; site < Nvol; ++site) {
324 int iv = Nvc * Nd * site;
327 for (
int ic = 0; ic < Nc; ++ic) {
330 int icg = ic * Nvc + ig;
333 v2[icr + id1 + iv] -= mult_uv_i(&Bx[icg], &w2[id2 + iv]);
334 v2[ici + id1 + iv] += mult_uv_r(&Bx[icg], &w2[id2 + iv]);
335 v2[icr + id2 + iv] -= mult_uv_i(&Bx[icg], &w2[id1 + iv]);
336 v2[ici + id2 + iv] += mult_uv_r(&Bx[icg], &w2[id1 + iv]);
338 v2[icr + id3 + iv] -= mult_uv_i(&Bx[icg], &w2[id4 + iv]);
339 v2[ici + id3 + iv] += mult_uv_r(&Bx[icg], &w2[id4 + iv]);
340 v2[icr + id4 + iv] -= mult_uv_i(&Bx[icg], &w2[id3 + iv]);
341 v2[ici + id4 + iv] += mult_uv_r(&Bx[icg], &w2[id3 + iv]);
344 v2[icr + id1 + iv] += mult_uv_r(&By[icg], &w2[id2 + iv]);
345 v2[ici + id1 + iv] += mult_uv_i(&By[icg], &w2[id2 + iv]);
346 v2[icr + id2 + iv] -= mult_uv_r(&By[icg], &w2[id1 + iv]);
347 v2[ici + id2 + iv] -= mult_uv_i(&By[icg], &w2[id1 + iv]);
349 v2[icr + id3 + iv] += mult_uv_r(&By[icg], &w2[id4 + iv]);
350 v2[ici + id3 + iv] += mult_uv_i(&By[icg], &w2[id4 + iv]);
351 v2[icr + id4 + iv] -= mult_uv_r(&By[icg], &w2[id3 + iv]);
352 v2[ici + id4 + iv] -= mult_uv_i(&By[icg], &w2[id3 + iv]);
355 v2[icr + id1 + iv] -= mult_uv_i(&Bz[icg], &w2[id1 + iv]);
356 v2[ici + id1 + iv] += mult_uv_r(&Bz[icg], &w2[id1 + iv]);
357 v2[icr + id2 + iv] += mult_uv_i(&Bz[icg], &w2[id2 + iv]);
358 v2[ici + id2 + iv] -= mult_uv_r(&Bz[icg], &w2[id2 + iv]);
360 v2[icr + id3 + iv] -= mult_uv_i(&Bz[icg], &w2[id3 + iv]);
361 v2[ici + id3 + iv] += mult_uv_r(&Bz[icg], &w2[id3 + iv]);
362 v2[icr + id4 + iv] += mult_uv_i(&Bz[icg], &w2[id4 + iv]);
363 v2[ici + id4 + iv] -= mult_uv_r(&Bz[icg], &w2[id4 + iv]);
366 v2[icr + id1 + iv] += mult_uv_i(&Ex[icg], &w2[id2 + iv]);
367 v2[ici + id1 + iv] -= mult_uv_r(&Ex[icg], &w2[id2 + iv]);
368 v2[icr + id2 + iv] += mult_uv_i(&Ex[icg], &w2[id1 + iv]);
369 v2[ici + id2 + iv] -= mult_uv_r(&Ex[icg], &w2[id1 + iv]);
371 v2[icr + id3 + iv] -= mult_uv_i(&Ex[icg], &w2[id4 + iv]);
372 v2[ici + id3 + iv] += mult_uv_r(&Ex[icg], &w2[id4 + iv]);
373 v2[icr + id4 + iv] -= mult_uv_i(&Ex[icg], &w2[id3 + iv]);
374 v2[ici + id4 + iv] += mult_uv_r(&Ex[icg], &w2[id3 + iv]);
377 v2[icr + id1 + iv] -= mult_uv_r(&Ey[icg], &w2[id2 + iv]);
378 v2[ici + id1 + iv] -= mult_uv_i(&Ey[icg], &w2[id2 + iv]);
379 v2[icr + id2 + iv] += mult_uv_r(&Ey[icg], &w2[id1 + iv]);
380 v2[ici + id2 + iv] += mult_uv_i(&Ey[icg], &w2[id1 + iv]);
382 v2[icr + id3 + iv] += mult_uv_r(&Ey[icg], &w2[id4 + iv]);
383 v2[ici + id3 + iv] += mult_uv_i(&Ey[icg], &w2[id4 + iv]);
384 v2[icr + id4 + iv] -= mult_uv_r(&Ey[icg], &w2[id3 + iv]);
385 v2[ici + id4 + iv] -= mult_uv_i(&Ey[icg], &w2[id3 + iv]);
388 v2[icr + id1 + iv] += mult_uv_i(&Ez[icg], &w2[id1 + iv]);
389 v2[ici + id1 + iv] -= mult_uv_r(&Ez[icg], &w2[id1 + iv]);
390 v2[icr + id2 + iv] -= mult_uv_i(&Ez[icg], &w2[id2 + iv]);
391 v2[ici + id2 + iv] += mult_uv_r(&Ez[icg], &w2[id2 + iv]);
393 v2[icr + id3 + iv] -= mult_uv_i(&Ez[icg], &w2[id3 + iv]);
394 v2[ici + id3 + iv] += mult_uv_r(&Ez[icg], &w2[id3 + iv]);
395 v2[icr + id4 + iv] += mult_uv_i(&Ez[icg], &w2[id4 + iv]);
396 v2[ici + id4 + iv] -= mult_uv_r(&Ez[icg], &w2[id4 + iv]);
407 assert(w.
nex() == 1);
411 int Ndf = 2 * Nc * Nc;
420 const double *w2 = w.
ptr(0);
421 double *v2 = v.
ptr(0);
432 for (
int site = 0; site < Nvol; ++site) {
433 int iv = Nvc * Nd * site;
436 for (
int ic = 0; ic < Nc; ++ic) {
439 int icg = ic * Nvc + ig;
442 v2[icr + id1 + iv] -= mult_uv_i(&Bx[icg], &w2[id2 + iv]);
443 v2[ici + id1 + iv] += mult_uv_r(&Bx[icg], &w2[id2 + iv]);
444 v2[icr + id2 + iv] -= mult_uv_i(&Bx[icg], &w2[id1 + iv]);
445 v2[ici + id2 + iv] += mult_uv_r(&Bx[icg], &w2[id1 + iv]);
447 v2[icr + id3 + iv] -= mult_uv_i(&Bx[icg], &w2[id4 + iv]);
448 v2[ici + id3 + iv] += mult_uv_r(&Bx[icg], &w2[id4 + iv]);
449 v2[icr + id4 + iv] -= mult_uv_i(&Bx[icg], &w2[id3 + iv]);
450 v2[ici + id4 + iv] += mult_uv_r(&Bx[icg], &w2[id3 + iv]);
453 v2[icr + id1 + iv] += mult_uv_r(&By[icg], &w2[id2 + iv]);
454 v2[ici + id1 + iv] += mult_uv_i(&By[icg], &w2[id2 + iv]);
455 v2[icr + id2 + iv] -= mult_uv_r(&By[icg], &w2[id1 + iv]);
456 v2[ici + id2 + iv] -= mult_uv_i(&By[icg], &w2[id1 + iv]);
458 v2[icr + id3 + iv] += mult_uv_r(&By[icg], &w2[id4 + iv]);
459 v2[ici + id3 + iv] += mult_uv_i(&By[icg], &w2[id4 + iv]);
460 v2[icr + id4 + iv] -= mult_uv_r(&By[icg], &w2[id3 + iv]);
461 v2[ici + id4 + iv] -= mult_uv_i(&By[icg], &w2[id3 + iv]);
464 v2[icr + id1 + iv] -= mult_uv_i(&Bz[icg], &w2[id1 + iv]);
465 v2[ici + id1 + iv] += mult_uv_r(&Bz[icg], &w2[id1 + iv]);
466 v2[icr + id2 + iv] += mult_uv_i(&Bz[icg], &w2[id2 + iv]);
467 v2[ici + id2 + iv] -= mult_uv_r(&Bz[icg], &w2[id2 + iv]);
469 v2[icr + id3 + iv] -= mult_uv_i(&Bz[icg], &w2[id3 + iv]);
470 v2[ici + id3 + iv] += mult_uv_r(&Bz[icg], &w2[id3 + iv]);
471 v2[icr + id4 + iv] += mult_uv_i(&Bz[icg], &w2[id4 + iv]);
472 v2[ici + id4 + iv] -= mult_uv_r(&Bz[icg], &w2[id4 + iv]);
475 v2[icr + id1 + iv] += mult_uv_i(&Ex[icg], &w2[id4 + iv]);
476 v2[ici + id1 + iv] -= mult_uv_r(&Ex[icg], &w2[id4 + iv]);
477 v2[icr + id2 + iv] += mult_uv_i(&Ex[icg], &w2[id3 + iv]);
478 v2[ici + id2 + iv] -= mult_uv_r(&Ex[icg], &w2[id3 + iv]);
480 v2[icr + id3 + iv] += mult_uv_i(&Ex[icg], &w2[id2 + iv]);
481 v2[ici + id3 + iv] -= mult_uv_r(&Ex[icg], &w2[id2 + iv]);
482 v2[icr + id4 + iv] += mult_uv_i(&Ex[icg], &w2[id1 + iv]);
483 v2[ici + id4 + iv] -= mult_uv_r(&Ex[icg], &w2[id1 + iv]);
486 v2[icr + id1 + iv] -= mult_uv_r(&Ey[icg], &w2[id4 + iv]);
487 v2[ici + id1 + iv] -= mult_uv_i(&Ey[icg], &w2[id4 + iv]);
488 v2[icr + id2 + iv] += mult_uv_r(&Ey[icg], &w2[id3 + iv]);
489 v2[ici + id2 + iv] += mult_uv_i(&Ey[icg], &w2[id3 + iv]);
491 v2[icr + id3 + iv] -= mult_uv_r(&Ey[icg], &w2[id2 + iv]);
492 v2[ici + id3 + iv] -= mult_uv_i(&Ey[icg], &w2[id2 + iv]);
493 v2[icr + id4 + iv] += mult_uv_r(&Ey[icg], &w2[id1 + iv]);
494 v2[ici + id4 + iv] += mult_uv_i(&Ey[icg], &w2[id1 + iv]);
497 v2[icr + id1 + iv] += mult_uv_i(&Ez[icg], &w2[id3 + iv]);
498 v2[ici + id1 + iv] -= mult_uv_r(&Ez[icg], &w2[id3 + iv]);
499 v2[icr + id2 + iv] -= mult_uv_i(&Ez[icg], &w2[id4 + iv]);
500 v2[ici + id2 + iv] += mult_uv_r(&Ez[icg], &w2[id4 + iv]);
502 v2[icr + id3 + iv] += mult_uv_i(&Ez[icg], &w2[id1 + iv]);
503 v2[ici + id3 + iv] -= mult_uv_r(&Ez[icg], &w2[id1 + iv]);
504 v2[icr + id4 + iv] -= mult_uv_i(&Ez[icg], &w2[id2 + iv]);
505 v2[ici + id4 + iv] += mult_uv_r(&Ez[icg], &w2[id2 + iv]);
534 const int mu,
const int nu)
544 Field_G v(Nvol, 1), v2(Nvol, 1);
void Register_int_vector(const string &, const std::vector< int > &)
void scal(Field &x, const double a)
scal(x, a): x = a * x
std::vector< GammaMatrix > m_SG
void Register_string(const string &, const string &)
const double * ptr(const int jin, const int site, const int jex) const
void mult_csw_dirac(Field_F &, const Field_F &)
void set(const int jin, const int site, const int jex, double v)
void upper(Field_G_SF &, const Field_G &, const int, const int)
void set_parameters(const Parameters ¶ms)
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(Fopr_Clover_SF::* m_csw)(Field_F &, const Field_F &)
double m_phi[3]
SF boundary condition at t=0.
void general(const char *format,...)
GammaMatrix get_GM(GMspecies spec)
static const std::string class_name
Container of Field-type object.
void H(Field &, const Field &)
Wilson fermion operator with SF BC.
double m_phipr[3]
SF boundary condition at t=Nt.
void mult_isigma(Field_F &, const Field_F &, const int mu, const int nu)
void D(Field &, const Field &)
Wilson-type fermion field.
void ah_Field_G(Field_G &w, const int ex)
int sg_index(int mu, int nu)
void DdagD(Field &, const Field &)
Parameters_Fopr_Clover_SF()
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)
void mult_iGM(Field_F &y, const GammaMatrix &gm, const Field_F &x)
gamma matrix multiplication (i is multiplied)
Bridge::VerboseLevel m_vl
void set_fieldstrength(Field_G &, const int, const int)
int fetch_string(const string &key, string &val) const
void mult_csw(Field_F &, const Field_F &)
Set of Gamma Matrices: basis class.
std::vector< int > m_boundary
void mult_gm5(Field &v, const Field &w)
Fopr_Wilson_SF * m_fopr_w
std::vector< GammaMatrix > m_GM
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 axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
void crucial(const char *format,...)
void Ddag(Field &, const Field &)
void mult_csw_chiral(Field_F &, const Field_F &)
void D(Field &, const Field &)
static bool Register(const std::string &realm, const creator_callback &cb)
void set_boundary_zero(Field &f)
void Register_double_vector(const string &, const std::vector< double > &)
void lower(Field_G_SF &, const Field_G &, const int, const int)
int fetch_double_vector(const string &key, std::vector< double > &val) const
Field_F_SF setzero
In order to set the boundary field to zero.
void Register_double(const string &, const double)
Base class of fermion operator family.
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 init(std::string repr)
double flop_count()
this returns the number of floating point number operations.
static VerboseLevel set_verbose_level(const std::string &str)
void set_parameters(const Parameters ¶ms)
int fetch_int_vector(const string &key, std::vector< int > &val) const
void set_parameters(const Parameters ¶ms)
void forward(Field &, const Field &, const int mu)