CHROMA
wallpionff_w.cc
Go to the documentation of this file.
1 /*! \file
2  * \brief Wall-sink pion form-factors
3  *
4  * Form factors constructed from a quark and a backward quark propagator
5  */
6 
7 #include "chromabase.h"
9 
10 namespace Chroma {
11 
12 //! Compute contractions for current insertion 3-point functions.
13 /*!
14  * \ingroup hadron
15  *
16  * This routine is specific to Wilson fermions!
17  *
18  * \param form Mega-structure holding form-factors ( Write )
19  * \param u gauge fields (used for non-local currents) ( Read )
20  * \param forw_u_prop forward U quark propagator ( Read )
21  * \param back_u_prop backward D quark propagator ( Read )
22  * \param forw_d_prop forward U quark propagator ( Read )
23  * \param back_d_prop backward D quark propagator ( Read )
24  * \param u_x2 forward U quark propagator evaluated at sink ( Read )
25  * \param d_x2 forward D quark propagator evaluated at sink ( Read )
26  * \param phases fourier transform phase factors ( Read )
27  * \param t0 time slice of the source ( Read )
28  * \param wall_source true if using a wall source ( Read )
29  */
30 
32  const multi1d<LatticeColorMatrix>& u,
33  const LatticePropagator& forw_u_prop,
34  const LatticePropagator& back_u_prop,
35  const LatticePropagator& forw_d_prop,
36  const LatticePropagator& back_d_prop,
37  const Propagator& u_x2,
38  const Propagator& d_x2,
39  const SftMom& phases,
40  int t0,
41  bool wall_source)
42 {
43  START_CODE();
44 
45  form.subroutine = "wallPionFormFac";
46 
47  // Length of lattice in decay direction and 3pt correlations fcns
48  int length = phases.numSubsets();
49 
50  const int G5 = Ns*Ns-1;
51 
52  // The list of meaningful insertions
53  // The gamma matrices specified correspond to
54  // V_mu and A_mu = gamma_mu gamma_5, specificially
55  // where in the Chroma code gamma_5 = g_3 g_2 g_1 g_0
56  //
57  // GAMMA CURRENT
58  // 1 V_0
59  // 2 V_1
60  // 4 V_2
61  // 8 V_3
62  // 14 -A_0
63  // 13 A_1
64  // 11 -A_2
65  // 7 A_3
66  multi1d<int> gamma_list(2*Nd);
67  gamma_list[0] = 1;
68  gamma_list[1] = 2;
69  gamma_list[2] = 4;
70  gamma_list[3] = 8;
71  gamma_list[4] = 14;
72  gamma_list[5] = 13;
73  gamma_list[6] = 11;
74  gamma_list[7] = 7;
75 
76  // Quark names
77  multi1d<std::string> quark_name(2);
78  quark_name[0] = "u";
79  quark_name[1] = "d";
80 
81  // Formfac names
82  multi1d<std::string> formfac_name(1);
83  formfac_name[0] = "pi->gamma+pi";
84 
85  // Projector names
86  multi1d<std::string> proj_name(1);
87  proj_name[0] = "none";
88 
89  // Antiquarks
90  LatticePropagator anti_u_prop = adj(Gamma(G5)*back_u_prop*Gamma(G5));
91  LatticePropagator anti_d_prop = adj(Gamma(G5)*back_d_prop*Gamma(G5));
92 
93  // Resize some things - this is needed upfront because I traverse the
94  // structure in a non-recursive scheme
95  form.quark.resize(quark_name.size());
96  for (int ud=0; ud < form.quark.size(); ++ud)
97  {
98  form.quark[ud].formfac.resize(formfac_name.size());
99  for(int dp = 0; dp < form.quark[ud].formfac.size(); ++dp)
100  {
101  form.quark[ud].formfac[dp].lorentz.resize(1);
102  for(int lorz = 0; lorz < form.quark[ud].formfac[dp].lorentz.size(); ++lorz)
103  {
104  form.quark[ud].formfac[dp].lorentz[lorz].projector.resize(proj_name.size());
105  for (int proj = 0; proj < form.quark[ud].formfac[dp].lorentz[lorz].projector.size(); ++proj)
106  {
107  form.quark[ud].formfac[dp].lorentz[lorz].projector[proj].insertion.resize(gamma_list.size());
108  }
109  }
110  }
111  }
112 
113 
114 
115  // For calculational purpose, loop over insertions first.
116  // This is out-of-order from storage within the data structure
117  // Loop over gamma matrices of the insertion current of insertion current
118  for(int gamma_ctr = 0; gamma_ctr < gamma_list.size(); ++gamma_ctr)
119  {
120  int gamma_value = gamma_list[gamma_ctr];
121  int mu = gamma_ctr % Nd;
122  bool compute_nonlocal = (gamma_ctr < Nd) ? true : false;
123 
124  // Loop over "u"=0 or "d"=1 pieces
125  for(int ud = 0; ud < form.quark.size(); ++ud)
126  {
127  WallFormFac_quark_t& quark = form.quark[ud];
128  quark.quark_ctr = ud;
129  quark.quark_name = quark_name[ud];
130 
131  LatticePropagator local_insert_prop, nonlocal_insert_prop;
132 
133  switch (ud)
134  {
135  case 0:
136  {
137  // "\bar u O u" insertion in pion
138  // The local non-conserved current contraction
139  local_insert_prop = anti_u_prop*Gamma(gamma_value)*forw_u_prop;
140 
141  if (compute_nonlocal)
142  {
143  // Construct the non-local (possibly conserved) current contraction
144  nonlocal_insert_prop = nonlocalCurrentProp(u, mu, forw_u_prop, anti_u_prop);
145  }
146  }
147  break;
148 
149  case 1:
150  {
151  // "\bar d O d" insertion in pion
152  // The local non-conserved current contraction
153  local_insert_prop = anti_d_prop*Gamma(gamma_value)*forw_d_prop;
154 
155  if (compute_nonlocal)
156  {
157  // Construct the non-local (possibly conserved) current contraction
158  nonlocal_insert_prop = nonlocalCurrentProp(u, mu, forw_d_prop, anti_d_prop);
159  }
160  }
161  break;
162 
163  default:
164  QDP_error_exit("Unknown ud type", ud);
165  }
166 
167 
168  // Loop over "pion->pion"=0 types of form-factors
169  for(int dp = 0; dp < quark.formfac.size(); ++dp)
170  {
171  WallFormFac_formfac_t& formfac = quark.formfac[dp];
172  formfac.formfac_ctr = dp;
173  formfac.formfac_name = formfac_name[dp];
174 
175  LatticeComplex local_contract, nonlocal_contract;
176 
177 
178  // Loop over Lorentz indices of source and sink hadron operators
179  for(int lorz = 0; lorz < formfac.lorentz.size(); ++lorz)
180  {
181  WallFormFac_lorentz_t& lorentz = formfac.lorentz[lorz];
182  lorentz.lorentz_ctr = lorz;
183 
184  int gamma_value1 = G5;
185  int gamma_value2 = G5;
186 
187  lorentz.snk_gamma = gamma_value1;
188  lorentz.src_gamma = gamma_value2;
189 
190  // Contractions depend on "ud" (u or d quark contribution)
191  // and source/sink operators
192  switch (ud)
193  {
194  case 0:
195  {
196  // "\bar u O u" insertion in pion
197  // The local non-conserved current contraction
198  local_contract =
199  trace(Gamma(gamma_value1)*local_insert_prop*Gamma(gamma_value2)*
200  Gamma(G5)*adj(d_x2)*Gamma(G5));
201 
202  if (compute_nonlocal)
203  {
204  // Construct the non-local (possibly conserved) current contraction
205  nonlocal_contract =
206  trace(Gamma(gamma_value1)*nonlocal_insert_prop*Gamma(gamma_value2)*
207  Gamma(G5)*adj(d_x2)*Gamma(G5));
208  }
209  }
210  break;
211 
212  case 1:
213  {
214  // "\bar d O d" insertion in pion
215  // The local non-conserved current contraction
216  local_contract =
217  trace(Gamma(gamma_value1)*u_x2*Gamma(gamma_value2)*
218  Gamma(G5)*adj(local_insert_prop)*Gamma(G5));
219 
220  if (compute_nonlocal)
221  {
222  // Construct the non-local (possibly conserved) current contraction
223  nonlocal_contract =
224  trace(Gamma(gamma_value1)*u_x2*Gamma(gamma_value2)*
225  Gamma(G5)*adj(nonlocal_insert_prop)*Gamma(G5));
226  }
227  }
228  break;
229 
230  default:
231  QDP_error_exit("Unknown ud type", ud);
232  }
233 
234 
235  // Loop over the spin projectors - none here
236  for (int proj = 0; proj < lorentz.projector.size(); ++proj)
237  {
238  WallFormFac_projector_t& projector = lorentz.projector[proj];
239  projector.proj_ctr = proj;
240  projector.proj_name = proj_name[proj];
241 
242  WallFormFac_insertion_t& insertion = projector.insertion[gamma_ctr];
243 
244  insertion.gamma_ctr = gamma_ctr;
245  insertion.mu = mu;
246  insertion.gamma_value = gamma_value;
247 
248  // The local non-conserved std::vector-current matrix element
249  LatticeComplex corr_local_fn = local_contract;
250 
251  // The nonlocal (possibly conserved) current matrix element
252  LatticeComplex corr_nonlocal_fn = nonlocal_contract;
253 
254  multi1d<WallFormFac_momenta_t>& momenta = insertion.momenta;
255 
256  wallFormFacSft(momenta, corr_local_fn, corr_nonlocal_fn, phases,
257  compute_nonlocal, t0);
258 
259  } // end for(proj)
260  } // end for(lorz)
261  } // end for(dp)
262  } // end for(ud)
263  } // end for(gamma_ctr)
264 
265  END_CODE();
266 }
267 
268 } // end namespace Chroma
Primary include file for CHROMA library code.
Fourier transform phase factor support.
Definition: sftmom.h:35
int numSubsets() const
Number of subsets - length in decay direction.
Definition: sftmom.h:63
int mu
Definition: cool.cc:24
void wallFormFacSft(multi1d< WallFormFac_momenta_t > &momenta, const LatticeComplex &corr_local_fn, const LatticeComplex &corr_nonlocal_fn, const SftMom &phases, bool compute_nonlocal, int t0)
Do slow SFT over hadron correlator data.
Definition: wallff_w.cc:54
LatticePropagator nonlocalCurrentProp(const multi1d< LatticeColorMatrix > &u, int mu, const LatticePropagator &forw_prop, const LatticePropagator &anti_prop)
Compute nonlocal current propagator.
Definition: wallff_w.cc:28
void wallPionFormFac(WallFormFac_formfacs_t &form, const multi1d< LatticeColorMatrix > &u, const LatticePropagator &forw_u_prop, const LatticePropagator &back_u_prop, const LatticePropagator &forw_d_prop, const LatticePropagator &back_d_prop, const Propagator &u_x2, const Propagator &d_x2, const SftMom &phases, int t0, bool wall_source)
Compute contractions for current insertion 3-point functions.
Definition: wallpionff_w.cc:31
Nd
Definition: meslate.cc:74
Asqtad Staggered-Dirac operator.
Definition: klein_gord.cc:10
QDP_error_exit("too many BiCG iterations", n_count, rsd_sq, cp, c, re_rvr, im_rvr, re_a, im_a, re_b, im_b)
int G5
Definition: pbg5p_w.cc:57
static multi1d< LatticeColorMatrix > u
START_CODE()
multi1d< WallFormFac_lorentz_t > lorentz
Definition: wallff_w.h:51
multi1d< WallFormFac_quark_t > quark
Definition: wallff_w.h:64
multi1d< WallFormFac_momenta_t > momenta
Definition: wallff_w.h:29
multi1d< WallFormFac_projector_t > projector
Definition: wallff_w.h:44
multi1d< WallFormFac_insertion_t > insertion
Definition: wallff_w.h:36
multi1d< WallFormFac_formfac_t > formfac
Definition: wallff_w.h:58
Wall-sink pion form-factors.