43                                   const std::vector<Field_F>& sq2,
 
   44                                   const std::vector<Field_F>& sq3,
 
   45                                   const std::vector<Field_F>& sq4)
 
   49   std::vector<dcomplex> corr_global(Lt);
 
   50   GammaMatrix           gm_sink_12, gm_sink_34, gm_src_12, gm_src_34;
 
   63   meson_correlator(corr_global, gm_sink_12, gm_sink_34, gm_src_12, gm_src_34, sq1, sq2, sq3, sq4);
 
   64   double result = real(corr_global[0]);
 
   72   meson_correlator(corr_global, gm_sink_12, gm_sink_34, gm_src_12, gm_src_34, sq1, sq2, sq3, sq4);
 
   79   meson_correlator(corr_global, gm_sink_12, gm_sink_34, gm_src_12, gm_src_34, sq1, sq2, sq3, sq4);
 
   86   meson_correlator(corr_global, gm_sink_12, gm_sink_34, gm_src_12, gm_src_34, sq1, sq2, sq3, sq4);
 
   93   meson_correlator(corr_global, gm_sink_12, gm_sink_34, gm_src_12, gm_src_34, sq1, sq2, sq3, sq4);
 
  100   meson_correlator(corr_global, gm_sink_12, gm_sink_34, gm_src_12, gm_src_34, sq1, sq2, sq3, sq4);
 
  107   meson_correlator(corr_global, gm_sink_12, gm_sink_34, gm_src_12, gm_src_34, sq1, sq2, sq3, sq4);
 
  114   meson_correlator(corr_global, gm_sink_12, gm_sink_34, gm_src_12, gm_src_34, sq1, sq2, sq3, sq4);
 
  121   meson_correlator(corr_global, gm_sink_12, gm_sink_34, gm_src_12, gm_src_34, sq1, sq2, sq3, sq4);
 
  128   meson_correlator(corr_global, gm_sink_12, gm_sink_34, gm_src_12, gm_src_34, sq1, sq2, sq3, sq4);
 
  135   meson_correlator(corr_global, gm_sink_12, gm_sink_34, gm_src_12, gm_src_34, sq1, sq2, sq3, sq4);
 
  142   meson_correlator(corr_global, gm_sink_12, gm_sink_34, gm_src_12, gm_src_34, sq1, sq2, sq3, sq4);
 
  149   meson_correlator(corr_global, gm_sink_12, gm_sink_34, gm_src_12, gm_src_34, sq1, sq2, sq3, sq4);
 
  152   if (use_outputfile) {
 
  166                                        const std::vector<Field_F>& sq1,
 
  167                                        const std::vector<Field_F>& sq2,
 
  168                                        const std::vector<Field_F>& sq3,
 
  169                                        const std::vector<Field_F>& sq4)
 
  181   assert(corr_global.size() == Lt);
 
  219   std::vector<dcomplex> corr_direct_1122_global(Lt);
 
  220   std::vector<dcomplex> corr_direct_3344_global(Lt);
 
  221   std::vector<dcomplex> corr_direct_1324_global(Lt);
 
  222   std::vector<dcomplex> corr_direct_3142_global(Lt);
 
  225               gm5_gm_sink_12, gm_gm5_src_12,
 
  228               gm5_gm_sink_34, gm_gm5_src_34,
 
  231               gm5_gm_sink_12, gm_gm5_src_34,
 
  234               gm5_gm_sink_34, gm_gm5_src_12,
 
  237   std::vector<dcomplex> corr_direct_global(Lt);
 
  238   for (
int t_global = 0; t_global < Lt; ++t_global) {
 
  239     corr_direct_global[t_global]
 
  240       = corr_direct_1122_global[t_global] * corr_direct_3344_global[t_global]
 
  241         + corr_direct_1324_global[t_global] * corr_direct_3142_global[t_global];
 
  249   typedef std::vector<dcomplex> CorrSet;
 
  250   std::vector<CorrSet> corr_cross_1124_global(Lt);
 
  251   std::vector<CorrSet> corr_cross_3342_global(Lt);
 
  252   std::vector<CorrSet> corr_cross_1322_global(Lt);
 
  253   std::vector<CorrSet> corr_cross_3144_global(Lt);
 
  254   for (
int t_global = 0; t_global < Lt; ++t_global) {
 
  255     corr_cross_1124_global[t_global].resize(Nc * Nd * Nc * Nd);
 
  256     corr_cross_3342_global[t_global].resize(Nc * Nd * Nc * Nd);
 
  257     corr_cross_1322_global[t_global].resize(Nc * Nd * Nc * Nd);
 
  258     corr_cross_3144_global[t_global].resize(Nc * Nd * Nc * Nd);
 
  262                   gm5_gm_sink_12, gm_gm5_src_12,
 
  265                   gm5_gm_sink_34, gm_gm5_src_34,
 
  268                   gm5_gm_sink_34, gm_gm5_src_12,
 
  271                   gm5_gm_sink_12, gm_gm5_src_34,
 
  275   std::vector<dcomplex> corr_cross_global(Lt, cmplx(0.0, 0.0));
 
  276   for (
int t_global = 0; t_global < Lt; ++t_global) {
 
  277     for (
int c0 = 0; c0 < Nc; ++c0) {
 
  278       for (
int d0 = 0; d0 < Nd; ++d0) {
 
  279         for (
int c1 = 0; c1 < Nc; ++c1) {
 
  280           for (
int d1 = 0; d1 < Nd; ++d1) {
 
  281             int i_cd2_01 = c0 + Nc * d0 + Nc * Nd * c1 + Nc * Nd * Nc * d1;
 
  282             int i_cd2_10 = c1 + Nc * d1 + Nc * Nd * c0 + Nc * Nd * Nc * d0;
 
  284             dcomplex corr_1124 = corr_cross_1124_global[t_global][i_cd2_01];
 
  285             dcomplex corr_3342 = corr_cross_3342_global[t_global][i_cd2_10];
 
  287             corr_cross_global[t_global] += corr_1124 * corr_3342;
 
  289             dcomplex corr_3144 = corr_cross_3144_global[t_global][i_cd2_01];
 
  290             dcomplex corr_1322 = corr_cross_1322_global[t_global][i_cd2_10];
 
  292             corr_cross_global[t_global] += corr_3144 * corr_1322;
 
  301   for (
int t_global = 0; t_global < Lt; ++t_global) {
 
  302     corr_global[t_global] = corr_direct_global[t_global] - corr_cross_global[t_global];
 
  305                  t_global, real(corr_global[t_global]), imag(corr_global[t_global]));
 
  311   for (
int t_global = 0; t_global < Lt; ++t_global) {
 
  313                   t_global, real(corr_direct_global[t_global]), imag(corr_direct_global[t_global]));
 
  318   for (
int t_global = 0; t_global < Lt; ++t_global) {
 
  320                   t_global, real(corr_cross_global[t_global]), imag(corr_cross_global[t_global]));
 
  328                                            const std::vector<Field_F>& sq2,
 
  329                                            const std::vector<Field_F>& sq3,
 
  330                                            const std::vector<Field_F>& sq4,
 
  331                                            const std::vector<int>& source_position)
 
  336   std::vector<dcomplex> corr_global(Lt);
 
  337   GammaMatrix           gm_sink_12, gm_sink_34, gm_src_12, gm_src_34;
 
  339   const int N_momentum = 10;
 
  341   typedef std::vector<int> MomentumSet;
 
  342   std::vector<MomentumSet> momentum_sink(N_momentum);
 
  343   for (
int i_momentum = 0; i_momentum < N_momentum; i_momentum++) {
 
  344     momentum_sink[i_momentum].resize(Ndim - 1);
 
  349   momentum_sink[i_momentum][0] = 1;
 
  350   momentum_sink[i_momentum][1] = 0;
 
  351   momentum_sink[i_momentum][2] = 0;
 
  355   momentum_sink[i_momentum][0] = 0;
 
  356   momentum_sink[i_momentum][1] = 1;
 
  357   momentum_sink[i_momentum][2] = 0;
 
  361   momentum_sink[i_momentum][0] = 0;
 
  362   momentum_sink[i_momentum][1] = 0;
 
  363   momentum_sink[i_momentum][2] = 1;
 
  367   momentum_sink[i_momentum][0] = 1;
 
  368   momentum_sink[i_momentum][1] = 1;
 
  369   momentum_sink[i_momentum][2] = 0;
 
  373   momentum_sink[i_momentum][0] = 0;
 
  374   momentum_sink[i_momentum][1] = 1;
 
  375   momentum_sink[i_momentum][2] = 1;
 
  379   momentum_sink[i_momentum][0] = 1;
 
  380   momentum_sink[i_momentum][1] = 0;
 
  381   momentum_sink[i_momentum][2] = 1;
 
  385   momentum_sink[i_momentum][0] = 1;
 
  386   momentum_sink[i_momentum][1] = 1;
 
  387   momentum_sink[i_momentum][2] = 1;
 
  391   momentum_sink[i_momentum][0] = 2;
 
  392   momentum_sink[i_momentum][1] = 0;
 
  393   momentum_sink[i_momentum][2] = 0;
 
  397   momentum_sink[i_momentum][0] = 0;
 
  398   momentum_sink[i_momentum][1] = 2;
 
  399   momentum_sink[i_momentum][2] = 0;
 
  403   momentum_sink[i_momentum][0] = 0;
 
  404   momentum_sink[i_momentum][1] = 0;
 
  405   momentum_sink[i_momentum][2] = 2;
 
  408   if (use_outputfile) {
 
  417   for (
int i_momentum = 0; i_momentum < N_momentum; i_momentum++) {
 
  419                  momentum_sink[i_momentum][0],
 
  420                  momentum_sink[i_momentum][1],
 
  421                  momentum_sink[i_momentum][2]);
 
  423                               gm_sink_12, gm_sink_34, gm_src_12, gm_src_34,
 
  424                               sq1, sq2, sq3, sq4, source_position);
 
  431   for (
int i_momentum = 0; i_momentum < N_momentum; i_momentum++) {
 
  433                  momentum_sink[i_momentum][0],
 
  434                  momentum_sink[i_momentum][1],
 
  435                  momentum_sink[i_momentum][2]);
 
  437                               gm_sink_12, gm_sink_34, gm_src_12, gm_src_34,
 
  438                               sq1, sq2, sq3, sq4, source_position);
 
  445   for (
int i_momentum = 0; i_momentum < N_momentum; i_momentum++) {
 
  447                  momentum_sink[i_momentum][0],
 
  448                  momentum_sink[i_momentum][1],
 
  449                  momentum_sink[i_momentum][2]);
 
  451                               gm_sink_12, gm_sink_34, gm_src_12, gm_src_34,
 
  452                               sq1, sq2, sq3, sq4, source_position);
 
  459   for (
int i_momentum = 0; i_momentum < N_momentum; i_momentum++) {
 
  461                  momentum_sink[i_momentum][0],
 
  462                  momentum_sink[i_momentum][1],
 
  463                  momentum_sink[i_momentum][2]);
 
  465                               gm_sink_12, gm_sink_34, gm_src_12, gm_src_34,
 
  466                               sq1, sq2, sq3, sq4, source_position);
 
  469   if (use_outputfile) {
 
  479                                                 const std::vector<int>& momentum_sink,
 
  484                                                 const std::vector<Field_F>& sq1,
 
  485                                                 const std::vector<Field_F>& sq2,
 
  486                                                 const std::vector<Field_F>& sq3,
 
  487                                                 const std::vector<Field_F>& sq4,
 
  488                                                 const std::vector<int>& source_position)
 
  495   assert(corr_global.size() == Lt);
 
  500   gm_gm5_src  = gm_src.
mult(gm5);
 
  501   gm5_gm_sink = gm5.
mult(gm_sink);
 
  503   std::vector<dcomplex> corr_local(Nt);
 
  505   for (
int c0 = 0; c0 < Nc; ++c0) {
 
  506     for (
int d0 = 0; d0 < Nd; ++d0) {
 
  507       int d1 = gm_gm5_src.
index(d0);
 
  509       for (
int t = 0; t < Nt; ++t) {
 
  512         contract_at_t(corr_t, momentum_sink, gm5_gm_sink, source_position,
 
  513                       sq1[c0 + Nc * d0], sq2[c0 + Nc * d1], t);
 
  515         corr_local[t] += gm_gm5_src.
value(d0) * corr_t;
 
  522   for (
int t = 0; t < corr_global.size(); ++t) {
 
  524                  t, real(corr_global[t]), imag(corr_global[t]));
 
  534                                   const std::vector<Field_F>& sq1,
 
  535                                   const std::vector<Field_F>& sq2)
 
  541   std::vector<dcomplex> corr_local(Nt, cmplx(0.0, 0.0));
 
  543   for (
int c0 = 0; c0 < Nc; ++c0) {
 
  544     for (
int d0 = 0; d0 < Nd; ++d0) {
 
  545       int d1 = gm_gm5_src.
index(d0);
 
  547       for (
int t = 0; t < Nt; ++t) {
 
  551                       sq1[c0 + Nc * d0], sq2[c0 + Nc * d1], t);
 
  553         corr_local[t] += gm_gm5_src.
value(d0) * corr_t;
 
  565                                       const std::vector<Field_F>& sq1,
 
  566                                       const std::vector<Field_F>& sq2)
 
  573   typedef std::vector<dcomplex> CorrSet;
 
  574   std::vector<CorrSet> corr_local_idx(Nt);
 
  575   for (
int t = 0; t < Nt; ++t) {
 
  576     corr_local_idx[t].resize(Nc * Nd * Nc * Nd);
 
  578   for (
int t = 0; t < Nt; ++t) {
 
  579     for (
int i_cd2 = 0; i_cd2 < Nc * Nd * Nc * Nd; ++i_cd2) {
 
  580       corr_local_idx[t][i_cd2] = cmplx(0.0, 0.0);
 
  584   for (
int c0 = 0; c0 < Nc; ++c0) {
 
  585     for (
int d0 = 0; d0 < Nd; ++d0) {
 
  586       for (
int c1 = 0; c1 < Nc; ++c1) {
 
  587         for (
int d1 = 0; d1 < Nd; ++d1) {
 
  588           int d51 = gm_gm5_src.
index(d1);
 
  590           for (
int t = 0; t < Nt; ++t) {
 
  594                           sq1[c0 + Nc * d0], sq2[c1 + Nc * d51], t);
 
  596             int i_cd2 = c0 + Nc * d0 + Nc * Nd * c1 + Nc * Nd * Nc * d51;
 
  598             corr_local_idx[t][i_cd2] = gm_gm5_src.
value(d1) * corr_t;
 
  606   for (
int i_cd2 = 0; i_cd2 < Nc * Nd * Nc * Nd; ++i_cd2) {
 
  607     std::vector<dcomplex> corr_local(Nt);
 
  608     std::vector<dcomplex> corr_global(Lt);
 
  610     for (
int t = 0; t < Nt; ++t) {
 
  611       corr_local[t] = corr_local_idx[t][i_cd2];
 
  616     for (
int t_global = 0; t_global < Lt; ++t_global) {
 
  617       corr_cross_global[t_global][i_cd2] = corr_global[t_global];
 
  625                                     const std::vector<dcomplex>& corr_local)
 
  630   assert(corr_global.size() == Lt);
 
  631   assert(corr_local.size() == Nt);
 
  635   std::vector<dcomplex> corr_tmp(Lt, cmplx(0.0, 0.0));
 
  637   for (
int t = 0; t < Nt; ++t) {
 
  638     int t_global = t + ipe_t * Nt;
 
  639     corr_tmp[t_global] = corr_local[t];
 
  642   for (
int t_global = 0; t_global < Lt; ++t_global) {
 
  646     corr_global[t_global] = cmplx(cr_r, cr_i);