CHROMA
hybmeson_w.cc
Go to the documentation of this file.
1 /*! \file
2  * \brief Hybrid meson 2-pt functions
3  */
4 
5 #include "chromabase.h"
6 #include "util/ft/sftmom.h"
8 
9 namespace Chroma
10 {
11 
12  //! Print the correlator to xml
13  static void print_disp(XMLWriter& xml_hyb, const LatticeComplex& corr_fn,
14  const SftMom& phases, int t0)
15  {
16  int length = phases.numSubsets();
17 
18  multi2d<DComplex> hsum;
19  hsum = phases.sft(corr_fn);
20 
21  // Loop over sink momenta
22  XMLArrayWriter xml_sink_mom(xml_hyb,phases.numMom());
23  push(xml_sink_mom, "momenta");
24 
25  for (int sink_mom_num=0; sink_mom_num < phases.numMom(); ++sink_mom_num)
26  {
27  push(xml_sink_mom);
28  write(xml_sink_mom, "sink_mom_num", sink_mom_num);
29  write(xml_sink_mom, "sink_mom", phases.numToMom(sink_mom_num));
30 
31  multi1d<Complex> mesprop(length);
32  for (int t=0; t < length; ++t)
33  {
34  int t_eff = (t - t0 + length) % length;
35  mesprop[t_eff] = real(hsum[sink_mom_num][t]);
36  }
37 
38  write(xml_sink_mom, "mesprop", mesprop);
39  pop(xml_sink_mom);
40  } // end for(sink_mom_num)
41 
42  pop(xml_sink_mom);
43  }
44 
45 
46 
47  //! Hybrid meson 2-pt functions
48  /*!
49  * \ingroup hadron
50  *
51  * This routine is specific to Wilson fermions!
52  *
53  * First we construct a hybrid pion and 3 hybrid rho's, followed by
54  * an exotic 0^{+-}, an exotic 0^{--} and finally 2*3 exotic 1^{-+}'s.
55  *
56  * \param f field strength tensor ( Read )
57  * \param u_smr the SMEARED gauge field, used in constructing the f's
58  * \param quark_prop_1 first quark propagator ( Read )
59  * \param quark_prop_2 second (anti-) quark propagator ( Read )
60  * \param t_source cartesian coordinates of the source ( Read )
61  * \param phases object holds list of momenta and Fourier phases ( Read )
62  * \param xml xml file object ( Read )
63  * \param xml_group std::string used for writing xml data ( Read )
64  *
65  * ____
66  * \
67  * m(t) = > < m(t_source, 0) m(t + t_source, x) >
68  * /
69  * ----
70  * x
71  */
72 
73  void hybmeson(const multi1d<LatticeColorMatrix>& f,
74  const multi1d<LatticeColorMatrix>& u_smr,
75  const LatticePropagator& quark_prop_1,
76  const LatticePropagator& quark_prop_2,
77  const SftMom& phases,
78  multi1d<int> t_source,
79  XMLWriter& xml,
80  const std::string& xml_group)
81  {
82  START_CODE();
83 
84  // Group
85  XMLArrayWriter xml_hyb(xml,15);
86  push(xml_hyb, xml_group);
87 
88  if ( Nd != 4 ) /* Code is specific to Nd=4. */
89  {
90  END_CODE();
91  return;
92  }
93 
94  // Length of lattice in decay direction
95  int length = phases.numSubsets();
96  int j_decay = phases.getDir();
97  int t0 = t_source[j_decay];
98 
99  // Fill f_source everywhere with f(t_source)
100  multi1d<LatticeColorMatrix> f_source(Nd*(Nd-1)/2);
101  for(int m = 0; m < Nd*(Nd-1)/2; ++m)
102  f_source[m] = peekSite(f[m], t_source);
103 
104 
105  // Construct the anti-quark propagator from quark_prop_2
106  int G5 = Ns*Ns-1;
107  LatticePropagator anti_quark_prop = Gamma(G5) * quark_prop_2 * Gamma(G5);
108 
109  /* Cyclic direction index */
110  multi1d<int> kp1(Nd);
111  multi2d<int> n_munu(Nd, Nd);
112  for(int k = 0; k < Nd; ++k)
113  {
114  if( k != j_decay )
115  {
116  int n = k+1;
117  if ( n == j_decay ) n++;
118  if ( n == Nd ) n = 0;
119  kp1[k] = n;
120  }
121  else
122  kp1[k] = -99999;
123  }
124 
125  /* Index to F_{mu,nu} */
126  int icnt = 0;
127  for(int m=0; m < Nd-1; ++m)
128  for(int n=m+1; n < Nd; ++n)
129  {
130  n_munu[n][m] = icnt;
131  n_munu[m][n] = icnt;
132  icnt++;
133  }
134 
135  // Hybrid pion: \epsilon_{k,j,n} \bar \psi \gamma_k F_{j,n} \psi
136  int kv = 0;
137  {
138  push(xml_hyb); // next array element
139  write(xml_hyb, "kv", kv);
140 
141  LatticePropagator q1_prop = 0;
142  LatticePropagator q2_prop = 0;
143  for(int k = 0; k < Nd; ++k)
144  if( k != j_decay )
145  {
146  int jm = 1 << k;
147  int j = kp1[k];
148  int n = kp1[j];
149  int m = n_munu[n][j];
150 
151  if( j < n )
152  {
153  q1_prop += f[m] * (Gamma(jm) * quark_prop_1);
154  q2_prop += (anti_quark_prop * Gamma(jm)) * f_source[m];
155  }
156  else
157  {
158  q1_prop -= f[m] * (Gamma(jm) * quark_prop_1);
159  q2_prop -= (anti_quark_prop * Gamma(jm)) * f_source[m];
160  }
161  }
162 
163  LatticeComplex corr_fn = localInnerProduct(q2_prop, q1_prop);
164  print_disp(xml_hyb, corr_fn, phases, t0);
165 
166  pop(xml_hyb);
167  }
168 
169  // Hybrid rho: \epsilon_{k,j,n} \bar \psi \gamma_5 F_{j,n} \psi
170  kv = 0;
171  for(int k = 0; k < Nd; ++k)
172  if( k != j_decay )
173  {
174  kv++;
175 
176  push(xml_hyb); // next array element
177  write(xml_hyb, "kv", kv);
178 
179  int j = kp1[k];
180  int n = kp1[j];
181  int m = n_munu[n][j];
182 
183  LatticeComplex corr_fn = localInnerProduct(anti_quark_prop * f_source[m],
184  f[m] * (Gamma(G5) * quark_prop_1 * Gamma(G5)));
185  print_disp(xml_hyb, corr_fn, phases, t0);
186 
187  pop(xml_hyb);
188  }
189 
190  // Exotic 0^{+-}: \epsilon_{k,j,n} \bar \psi \gamma_5 \gamma_k F_{j,n} \psi
191  kv = 4;
192  {
193  push(xml_hyb); // next array element
194  write(xml_hyb, "kv", kv);
195 
196  LatticePropagator q1_prop = 0;
197  LatticePropagator q2_prop = 0;
198  for(int k = 0; k < Nd; ++k)
199  if( k != j_decay )
200  {
201  int m = 1 << k;
202  int jm = m ^ G5;
203  int j = kp1[k];
204  int n = kp1[j];
205  m = n_munu[n][j];
206 
207  if( j < n )
208  {
209  q1_prop += f[m] * (Gamma(jm) * quark_prop_1);
210  q2_prop += (anti_quark_prop * Gamma(jm)) * f_source[m];
211  }
212  else
213  {
214  q1_prop -= f[m] * (Gamma(jm) * quark_prop_1);
215  q2_prop -= (anti_quark_prop * Gamma(jm)) * f_source[m];
216  }
217  }
218 
219  LatticeComplex corr_fn = localInnerProduct(q2_prop, q1_prop);
220  print_disp(xml_hyb, corr_fn, phases, t0);
221 
222  pop(xml_hyb);
223  }
224 
225 
226  // Exotic 0^{--}: \bar \psi \gamma_5 \gamma_k F_{j_decay,k} \psi
227  kv = 5;
228  {
229  push(xml_hyb); // next array element
230  write(xml_hyb, "kv", kv);
231 
232  LatticePropagator q1_prop = 0;
233  LatticePropagator q2_prop = 0;
234 
235  for(int k = 0; k < Nd; ++k)
236  if( k != j_decay )
237  {
238  int m = 1 << k;
239  int jm = m ^ G5;
240  m = n_munu[k][j_decay];
241 
242  if( j_decay < k )
243  {
244  q1_prop += f[m] * (Gamma(jm) * quark_prop_1);
245  q2_prop += (anti_quark_prop * Gamma(jm)) * f_source[m];
246  }
247  else
248  {
249  q1_prop -= f[m] * (Gamma(jm) * quark_prop_1);
250  q2_prop -= (anti_quark_prop * Gamma(jm)) * f_source[m];
251  }
252  }
253 
254  LatticeComplex corr_fn = localInnerProduct(q2_prop, q1_prop);
255  print_disp(xml_hyb, corr_fn, phases, t0);
256 
257  pop(xml_hyb);
258  }
259 
260 
261  // Exotic 1^{-+}_1: \bar \psi \gamma_j F_{j,k} \psi
262  kv = 5;
263  for(int k = 0; k < Nd; ++k)
264  if( k != j_decay )
265  {
266  kv++;
267 
268  push(xml_hyb); // next array element
269  write(xml_hyb, "kv", kv);
270 
271  LatticePropagator q1_prop = 0;
272  LatticePropagator q2_prop = 0;
273 
274  for(int j = 0; j < Nd; ++j)
275  if( j != j_decay && j != k )
276  {
277  int jm = 1 << j;
278  int m = n_munu[k][j];
279 
280  if( j < k )
281  {
282  q1_prop += f[m] * (Gamma(jm) * quark_prop_1);
283  q2_prop += (anti_quark_prop * Gamma(jm)) * f_source[m];
284  }
285  else
286  {
287  q1_prop -= f[m] * (Gamma(jm) * quark_prop_1);
288  q2_prop -= (anti_quark_prop * Gamma(jm)) * f_source[m];
289  }
290  }
291 
292  LatticeComplex corr_fn = localInnerProduct(q2_prop, q1_prop);
293  print_disp(xml_hyb, corr_fn, phases, t0);
294 
295  pop(xml_hyb);
296  }
297 
298 
299  // Exotic 1^{-+}_2: \bar \psi \gamma_{j_decay} F_{j_decay,k} \psi
300  kv = 8;
301  for(int k = 0; k < Nd; ++k)
302  if( k != j_decay )
303  {
304  kv++;
305 
306  push(xml_hyb); // next array element
307  write(xml_hyb, "kv", kv);
308 
309  int jm = 1 << j_decay;
310  int m = n_munu[k][j_decay];
311 
312  LatticeComplex corr_fn = localInnerProduct(anti_quark_prop * f_source[m],
313  f[m] * (Gamma(jm) * quark_prop_1 * Gamma(jm)));
314  print_disp(xml_hyb, corr_fn, phases, t0);
315 
316  pop(xml_hyb);
317  }
318 
319  /*
320  * Finally, some spin-exotic mesons in which we have non-local
321  * sinks
322  *
323  * This way we may find we get a better signal
324  */
325 
326  /*
327  * As a first test, we will compute the 1^{-+} operators in which we have
328  *
329  * O_1 at the source
330  * O_3 = \bar{psi} \gamma_j F_{jk} \psi at the sink
331  *
332  * where at the sink we now write F{jk} in terms of the
333  * L-shaped paths a la Lacock et al, PRD54, 6997.
334  *
335  * In their notation, the F_{jk} operator corresponds to the path
336  * (jk) - (kj) + (k jbar) - (jbar k) + (jbar kbar) - (kbar jbar)
337  * + (kbar j) - (j kbar)
338  */
339 
340  kv = 11; /* Channel counter */
341  for(int k = 0; k < Nd; ++k)
342  if( k != j_decay )
343  {
344  kv++;
345 
346  push(xml_hyb); // next array element
347  write(xml_hyb,"kv", kv);
348 
349  LatticePropagator q1_prop = 0;
350  LatticePropagator q2_prop = 0;
351 
352  LatticePropagator tmp_prop1;
353  LatticePropagator tmp_prop2;
354 
355  for(int j = 0; j < Nd; ++j)
356  {
357  if( j != j_decay && j != k )
358  {
359  /*
360  * First we perform the gamma-matrix algebra
361  */
362  int jm = 1 << j;
363  int m = n_munu[k][j];
364 
365  LatticePropagator tmp_prop1 = Gamma(jm) * quark_prop_1;
366 
367  /*
368  * Now the simple operation of multiplying by
369  * F_{jk} at the SOURCE
370  */
371  if( j < k )
372  {
373  q2_prop += (anti_quark_prop * Gamma(jm)) * f_source[m];
374  }
375  else
376  {
377  q2_prop -= (anti_quark_prop * Gamma(jm)) * f_source[m];
378  }
379 
380  /*
381  * Note that we can now reuse tmp_prop2
382  */
383 
384  /*
385  * At the sink, we have to do various communication
386  *
387  * We will loop over the forward and backward directions
388  * for the j and k axes respectively
389  *
390  * There are a total of 8 terms
391  */
392 
393  /*
394  * (jk) - (j kbar)
395  */
396  tmp_prop2 = u_smr[k] * shift(tmp_prop1, FORWARD, k) /* Forward k */
397  - shift(adj(u_smr[k]) * tmp_prop1, BACKWARD, k); /* k - kbar */
398  q1_prop += u_smr[j] * shift(tmp_prop2, FORWARD, j); /* j x (k - kbar) */
399 
400  /*
401  * - [ (kj) - (k jbar)]
402  */
403  tmp_prop2 = u_smr[j] * shift(tmp_prop1, FORWARD, j) /* Forward j */
404  - shift(adj(u_smr[j]) * tmp_prop1, BACKWARD, j); /* j - jbar */
405  q1_prop -= u_smr[k] * shift(tmp_prop2, FORWARD, k); /* - k x (j - jbar) */
406 
407  /*
408  * - [ (jbar k) - (jbar kbar)]
409  */
410  tmp_prop2 = u_smr[k] * shift(tmp_prop1, FORWARD, k) /* Forward k */
411  - shift(adj(u_smr[k]) * tmp_prop1, BACKWARD, k); /* k - kbar */
412  q1_prop -= shift(adj(u_smr[j]) * tmp_prop2, BACKWARD, j); /* Now the communication */
413 
414  /*
415  * + [ (kbar j) - (kbar jbar)]
416  */
417  tmp_prop2 = u_smr[j] * shift(tmp_prop1, FORWARD, j) /* Forward j */
418  - shift(adj(u_smr[j]) * tmp_prop1, BACKWARD, j); /* k - kbar */
419  q1_prop += shift(adj(u_smr[k]) * tmp_prop2, BACKWARD, k); /* Now the communication */
420  } /* End if statement */
421  } /* End loop over j */
422 
423 
424  LatticeComplex corr_fn = localInnerProduct(q2_prop, q1_prop);
425  print_disp(xml_hyb, corr_fn, phases, t0);
426 
427  pop(xml_hyb);
428  }
429 
430  pop(xml_hyb);
431 
432  END_CODE();
433  }
434 
435 } // 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
multi1d< int > numToMom(int mom_num) const
Convert momenta id to actual array of momenta.
Definition: sftmom.h:78
int getDir() const
Decay direction.
Definition: sftmom.h:69
multi2d< DComplex > sft(const LatticeComplex &cf) const
Do a sumMulti(cf*phases,getSet())
Definition: sftmom.cc:524
int numMom() const
Number of momenta.
Definition: sftmom.h:60
void write(XMLWriter &xml, const std::string &path, const AsqtadFermActParams &param)
Writer parameters.
void hybmeson(const multi1d< LatticeColorMatrix > &f, const multi1d< LatticeColorMatrix > &u_smr, const LatticePropagator &quark_prop_1, const LatticePropagator &quark_prop_2, const SftMom &phases, multi1d< int > t_source, XMLWriter &xml, const std::string &xml_group)
Hybrid meson 2-pt functions.
Definition: hybmeson_w.cc:73
Hybrid meson 2-pt functions.
unsigned j
Definition: ldumul_w.cc:35
unsigned n
Definition: ldumul_w.cc:36
static int m[4]
Definition: make_seeds.cc:16
int j_decay
Definition: meslate.cc:22
int t
Definition: meslate.cc:37
Nd
Definition: meslate.cc:74
QDPSubTypeTrait< typename BinaryReturn< C1, C2, FnLocalInnerProduct >::Type_t >::Type_t localInnerProduct(const QDPSubType< T1, C1 > &l, const QDPType< T2, C2 > &r)
Asqtad Staggered-Dirac operator.
Definition: klein_gord.cc:10
int G5
Definition: pbg5p_w.cc:57
static void print_disp(XMLWriter &xml_hyb, const LatticeComplex &corr_fn, const SftMom &phases, int t0)
Print the correlator to xml.
Definition: hybmeson_w.cc:13
push(xml_out,"Condensates")
pop(xml_out)
START_CODE()
int k
Definition: invbicg.cc:119
::std::string string
Definition: gtest.h:1979
#define FORWARD
Definition: primitives.h:82
#define BACKWARD
Definition: primitives.h:83
Fourier transform phase factor support.