21 #if defined USE_GROUP_SU3 
   22 #include "field_G_imp_SU3.inc" 
   23 #elif defined USE_GROUP_SU2 
   24 #include "field_G_imp_SU2.inc" 
   25 #elif defined USE_GROUP_SU_N 
   26 #include "field_G_imp_SU_N.inc" 
   50   int is = 
nvol() * ith / nth;
 
   51   int ns = 
nvol() * (ith + 1) / nth - is;
 
   53   for (
int mu = 0; mu < 
nex(); ++mu) {
 
   54     for (
int site = is; site < is + ns; ++site) {
 
   68   for (
int mu = 0; mu < 
m_Nex; ++mu) {
 
   69     for (
int site = 0; site < 
m_Nvol; ++site) {
 
   70       this->
mat(ut, site, mu);
 
   88   int is = 
nvol() * ith / nth;
 
   89   int ns = 
nvol() * (ith + 1) / nth - is;
 
   91   for (
int mu = 0; mu < 
nex(); ++mu) {
 
   92     for (
int site = is; site < is + ns; ++site) {
 
  106   assert(ex < w.
nex());
 
  107   assert(ex1 < u1.
nex());
 
  108   assert(ex2 < u2.
nex());
 
  117   int is = w.
nvol() * ith / nth;
 
  118   int ns = w.
nvol() * (ith + 1) / nth - is;
 
  120   double *g  = w.
ptr(0, is, ex);
 
  121   double *g1 = 
const_cast<Field_G *
>(&u1)->ptr(0, is, ex1);
 
  122   double *g2 = 
const_cast<Field_G *
>(&u2)->ptr(0, is, ex2);
 
  124   const int Nc  = w.
nc();
 
  125   const int Nc2 = 2 * Nc;
 
  126   const int Ndf = Nc2 * Nc;
 
  128   for (
int site = 0; site < ns; ++site) {
 
  131     for (
int ic2 = 0; ic2 < Nc; ++ic2) {
 
  132       for (
int ic1 = 0; ic1 < Nc; ++ic1) {
 
  133         int jg2 = ic2 * 2 + ig;
 
  134         int jg1 = ic1 * Nc2 + ig;
 
  135         g[2 * ic2 + Nc2 * ic1 + ig]     = mult_Gnn_r(&g1[jg1], &g2[jg2], Nc);
 
  136         g[2 * ic2 + 1 + Nc2 * ic1 + ig] = mult_Gnn_i(&g1[jg1], &g2[jg2], Nc);
 
  148   assert(ex < w.
nex());
 
  149   assert(ex1 < u1.
nex());
 
  150   assert(ex2 < u2.
nex());
 
  159   int is = w.
nvol() * ith / nth;
 
  160   int ns = w.
nvol() * (ith + 1) / nth - is;
 
  162   double *g  = w.
ptr(0, is, ex);
 
  163   double *g1 = 
const_cast<Field_G *
>(&u1)->ptr(0, is, ex1);
 
  164   double *g2 = 
const_cast<Field_G *
>(&u2)->ptr(0, is, ex2);
 
  166   const int Nc  = w.
nc();
 
  167   const int Nc2 = 2 * Nc;
 
  168   const int Ndf = Nc2 * Nc;
 
  170   for (
int site = 0; site < ns; ++site) {
 
  173     for (
int ic2 = 0; ic2 < Nc; ++ic2) {
 
  174       for (
int ic1 = 0; ic1 < Nc; ++ic1) {
 
  175         int jg2 = ic2 * 2 + ig;
 
  176         int jg1 = ic1 * 2 + ig;
 
  177         g[2 * ic2 + Nc2 * ic1 + ig]     = mult_Gdn_r(&g1[jg1], &g2[jg2], Nc);
 
  178         g[2 * ic2 + 1 + Nc2 * ic1 + ig] = mult_Gdn_i(&g1[jg1], &g2[jg2], Nc);
 
  190   assert(ex < w.
nex());
 
  191   assert(ex1 < u1.
nex());
 
  192   assert(ex2 < u2.
nex());
 
  201   int is = w.
nvol() * ith / nth;
 
  202   int ns = w.
nvol() * (ith + 1) / nth - is;
 
  204   double *g  = w.
ptr(0, is, ex);
 
  205   double *g1 = 
const_cast<Field_G *
>(&u1)->ptr(0, is, ex1);
 
  206   double *g2 = 
const_cast<Field_G *
>(&u2)->ptr(0, is, ex2);
 
  208   const int Nc  = w.
nc();
 
  209   const int Nc2 = 2 * Nc;
 
  210   const int Ndf = Nc2 * Nc;
 
  212   for (
int site = 0; site < ns; ++site) {
 
  215     for (
int ic2 = 0; ic2 < Nc; ++ic2) {
 
  216       for (
int ic1 = 0; ic1 < Nc; ++ic1) {
 
  217         int jg2 = ic2 * Nc2 + ig;
 
  218         int jg1 = ic1 * Nc2 + ig;
 
  219         g[2 * ic2 + Nc2 * ic1 + ig]     = mult_Gnd_r(&g1[jg1], &g2[jg2], Nc);
 
  220         g[2 * ic2 + 1 + Nc2 * ic1 + ig] = mult_Gnd_i(&g1[jg1], &g2[jg2], Nc);
 
  232   assert(ex < w.
nex());
 
  233   assert(ex1 < u1.
nex());
 
  234   assert(ex2 < u2.
nex());
 
  243   int is = w.
nvol() * ith / nth;
 
  244   int ns = w.
nvol() * (ith + 1) / nth - is;
 
  246   double *g  = w.
ptr(0, is, ex);
 
  247   double *g1 = 
const_cast<Field_G *
>(&u1)->ptr(0, is, ex1);
 
  248   double *g2 = 
const_cast<Field_G *
>(&u2)->ptr(0, is, ex2);
 
  250   const int Nc  = w.
nc();
 
  251   const int Nc2 = 2 * Nc;
 
  252   const int Ndf = Nc2 * Nc;
 
  254   for (
int site = 0; site < ns; ++site) {
 
  257     for (
int ic2 = 0; ic2 < Nc; ++ic2) {
 
  258       for (
int ic1 = 0; ic1 < Nc; ++ic1) {
 
  259         int jg2 = ic2 * Nc2 + ig;
 
  260         int jg1 = ic1 * 2 + ig;
 
  261         g[2 * ic2 + Nc2 * ic1 + ig]     = mult_Gdd_r(&g1[jg1], &g2[jg2], Nc);
 
  262         g[2 * ic2 + 1 + Nc2 * ic1 + ig] = mult_Gdd_i(&g1[jg1], &g2[jg2], Nc);
 
  275   assert(ex < w.
nex());
 
  276   assert(ex1 < u1.
nex());
 
  277   assert(ex2 < u2.
nex());
 
  286   int is = w.
nvol() * ith / nth;
 
  287   int ns = w.
nvol() * (ith + 1) / nth - is;
 
  289   double *g  = w.
ptr(0, is, ex);
 
  290   double *g1 = 
const_cast<Field_G *
>(&u1)->ptr(0, is, ex1);
 
  291   double *g2 = 
const_cast<Field_G *
>(&u2)->ptr(0, is, ex2);
 
  293   const int Nc  = w.
nc();
 
  294   const int Nc2 = 2 * Nc;
 
  295   const int Ndf = Nc2 * Nc;
 
  297   for (
int site = 0; site < ns; ++site) {
 
  300     for (
int ic2 = 0; ic2 < Nc; ++ic2) {
 
  301       for (
int ic1 = 0; ic1 < Nc; ++ic1) {
 
  302         int jg2 = ic2 * 2 + ig;
 
  303         int jg1 = ic1 * Nc2 + ig;
 
  304         g[2 * ic2 + Nc2 * ic1 + ig] +=
 
  305           ff * mult_Gnn_r(&g1[jg1], &g2[jg2], Nc);
 
  306         g[2 * ic2 + 1 + Nc2 * ic1 + ig] +=
 
  307           ff * mult_Gnn_i(&g1[jg1], &g2[jg2], Nc);
 
  320   assert(ex < w.
nex());
 
  321   assert(ex1 < u1.
nex());
 
  322   assert(ex2 < u2.
nex());
 
  331   int is = w.
nvol() * ith / nth;
 
  332   int ns = w.
nvol() * (ith + 1) / nth - is;
 
  334   double *g  = w.
ptr(0, is, ex);
 
  335   double *g1 = 
const_cast<Field_G *
>(&u1)->ptr(0, is, ex1);
 
  336   double *g2 = 
const_cast<Field_G *
>(&u2)->ptr(0, is, ex2);
 
  338   const int Nc  = w.
nc();
 
  339   const int Nc2 = 2 * Nc;
 
  340   const int Ndf = Nc2 * Nc;
 
  342   for (
int site = 0; site < ns; ++site) {
 
  345     for (
int ic2 = 0; ic2 < Nc; ++ic2) {
 
  346       for (
int ic1 = 0; ic1 < Nc; ++ic1) {
 
  347         int jg2 = ic2 * 2 + ig;
 
  348         int jg1 = ic1 * 2 + ig;
 
  349         g[2 * ic2 + Nc2 * ic1 + ig] +=
 
  350           ff * mult_Gdn_r(&g1[jg1], &g2[jg2], Nc);
 
  351         g[2 * ic2 + 1 + Nc2 * ic1 + ig] +=
 
  352           ff * mult_Gdn_i(&g1[jg1], &g2[jg2], Nc);
 
  365   assert(ex < w.
nex());
 
  366   assert(ex1 < u1.
nex());
 
  367   assert(ex2 < u2.
nex());
 
  376   int is = w.
nvol() * ith / nth;
 
  377   int ns = w.
nvol() * (ith + 1) / nth - is;
 
  379   double *g  = w.
ptr(0, is, ex);
 
  380   double *g1 = 
const_cast<Field_G *
>(&u1)->ptr(0, is, ex1);
 
  381   double *g2 = 
const_cast<Field_G *
>(&u2)->ptr(0, is, ex2);
 
  383   const int Nc  = w.
nc();
 
  384   const int Nc2 = 2 * Nc;
 
  385   const int Ndf = Nc2 * Nc;
 
  387   for (
int site = 0; site < ns; ++site) {
 
  390     for (
int ic2 = 0; ic2 < Nc; ++ic2) {
 
  391       for (
int ic1 = 0; ic1 < Nc; ++ic1) {
 
  392         int jg2 = ic2 * Nc2 + ig;
 
  393         int jg1 = ic1 * Nc2 + ig;
 
  394         g[2 * ic2 + Nc2 * ic1 + ig] +=
 
  395           ff * mult_Gnd_r(&g1[jg1], &g2[jg2], Nc);
 
  396         g[2 * ic2 + 1 + Nc2 * ic1 + ig]
 
  397           += ff * mult_Gnd_i(&g1[jg1], &g2[jg2], Nc);
 
  410   assert(ex < w.
nex());
 
  411   assert(ex1 < u1.
nex());
 
  412   assert(ex2 < u2.
nex());
 
  421   int is = w.
nvol() * ith / nth;
 
  422   int ns = w.
nvol() * (ith + 1) / nth - is;
 
  424   double *g  = w.
ptr(0, is, ex);
 
  425   double *g1 = 
const_cast<Field_G *
>(&u1)->ptr(0, is, ex1);
 
  426   double *g2 = 
const_cast<Field_G *
>(&u2)->ptr(0, is, ex2);
 
  428   const int Nc  = w.
nc();
 
  429   const int Nc2 = 2 * Nc;
 
  430   const int Ndf = Nc2 * Nc;
 
  432   for (
int site = 0; site < ns; ++site) {
 
  435     for (
int ic2 = 0; ic2 < Nc; ++ic2) {
 
  436       for (
int ic1 = 0; ic1 < Nc; ++ic1) {
 
  437         int jg2 = ic2 * Nc2 + ig;
 
  438         int jg1 = ic1 * 2 + ig;
 
  439         g[2 * ic2 + Nc2 * ic1 + ig] +=
 
  440           ff * mult_Gdd_r(&g1[jg1], &g2[jg2], Nc);
 
  441         g[2 * ic2 + 1 + Nc2 * ic1 + ig] +=
 
  442           ff * mult_Gdd_i(&g1[jg1], &g2[jg2], Nc);
 
  452   assert(ex < w.
nex());
 
  459   int is = w.
nvol() * ith / nth;
 
  460   int ns = w.
nvol() * (ith + 1) / nth - is;
 
  462   double *g = w.
ptr(0, is, ex);
 
  464   const int Nc  = w.
nc();
 
  465   const int Ndf = 2 * Nc * Nc;
 
  467   for (
int site = 0; site < ns; ++site) {
 
  470     for (
int a = 0; a < Nc; ++a) {
 
  471       for (
int b = a + 1; b < Nc; ++b) {
 
  472         double re = g[2 * (Nc * a + b) + ig] - g[2 * (Nc * b + a) + ig];
 
  473         double im = g[2 * (Nc * a + b) + 1 + ig] + g[2 * (Nc * b + a) + 1 + ig];
 
  475         g[2 * (Nc * a + b) + ig]     = 0.5 * re;
 
  476         g[2 * (Nc * a + b) + 1 + ig] = 0.5 * im;
 
  478         g[2 * (Nc * b + a) + ig]     = -0.5 * re;
 
  479         g[2 * (Nc * b + a) + 1 + ig] = 0.5 * im;
 
  483     for (
int cc = 0; cc < Nc; ++cc) {
 
  484       tr += g[2 * (Nc * cc + cc) + 1 + ig];
 
  487     for (
int cc = 0; cc < Nc; ++cc) {
 
  488       g[2 * (Nc * cc + cc) + ig]      = 0.0;
 
  489       g[2 * (Nc * cc + cc) + 1 + ig] -= tr;
 
  498   assert(ex < w.
nex());
 
  505   int is = w.
nvol() * ith / nth;
 
  506   int ns = w.
nvol() * (ith + 1) / nth - is;
 
  508   double *g = w.
ptr(0, is, ex);
 
  510   const int Nc  = w.
nc();
 
  511   const int Ndf = 2 * Nc * Nc;
 
  513   for (
int site = 0; site < ns; ++site) {
 
  516     for (
int a = 0; a < Nc; ++a) {
 
  517       for (
int b = a; b < Nc; ++b) {
 
  518         double re = g[2 * (Nc * a + b) + ig] - g[2 * (Nc * b + a) + ig];
 
  519         double im = g[2 * (Nc * a + b) + 1 + ig] + g[2 * (Nc * b + a) + 1 + ig];
 
  521         g[2 * (Nc * a + b) + ig]     = 0.5 * re;
 
  522         g[2 * (Nc * a + b) + 1 + ig] = 0.5 * im;
 
  524         g[2 * (Nc * b + a) + ig]     = -0.5 * re;
 
  525         g[2 * (Nc * b + a) + 1 + ig] = 0.5 * im;
 
void mult_Field_Gdn(Field_G &w, const int ex, const Field_G &u1, const int ex1, const Field_G &u2, const int ex2)
 
double * ptr(const int jin, const int site, const int jex)
 
void check()
check of assumptions for performance implementation. 
 
virtual void gauss_lex_global(Field &)
gaussian random number defined on global lattice. 
 
void set_random(RandomNumbers *rand)
 
void mult_Field_Gdd(Field_G &w, const int ex, const Field_G &u1, const int ex1, const Field_G &u2, const int ex2)
 
void multadd_Field_Gdd(Field_G &w, const int ex, const Field_G &u1, const int ex1, const Field_G &u2, const int ex2, const double ff)
 
void ah_Field_G(Field_G &w, const int ex)
 
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_Field_Gnn(Field_G &w, const int ex, const Field_G &u1, const int ex1, const Field_G &u2, const int ex2)
 
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 at_Field_G(Field_G &w, const int ex)
 
Base class of random number generators. 
 
void multadd_Field_Gnn(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_mat(const int site, const int mn, const Mat_SU_N &U)
 
Mat_SU_N mat(const int site, const int mn=0) const