CHROMA
inline_static_light_spec_w.cc
Go to the documentation of this file.
1 /*! \file
2  * \brief Inline construction of hadron spectrum
3  *
4  * Spectrum calculations
5  */
6 
9 #include "meas/glue/mesplq.h"
10 #include "util/ft/sftmom.h"
11 #include "util/info/proginfo.h"
12 #include "io/param_io.h"
13 #include "io/qprop_io.h"
14 #include "meas/hadron/mesQl_w.h"
15 #include "meas/hadron/barQll_w.h"
16 #include "meas/hadron/mesQlPOT_w.h"
18 #include "meas/hadron/curcor2_w.h"
22 
23 namespace Chroma
24 {
25  namespace InlineStaticLightSpecEnv
26  {
27  namespace
28  {
29  AbsInlineMeasurement* createMeasurement(XMLReader& xml_in,
30  const std::string& path)
31  {
32  return new InlineStaticLightSpec(InlineStaticLightSpecParams(xml_in, path));
33  }
34 
35  //! Local registration flag
36  bool registered = false;
37  }
38 
39  const std::string name = "STATIC_LIGHT_SPECTRUM";
40 
41  //! Register all the factories
42  bool registerAll()
43  {
44  bool success = true;
45  if (! registered)
46  {
47  success &= TheInlineMeasurementFactory::Instance().registerObject(name, createMeasurement);
48  registered = true;
49  }
50  return success;
51  }
52  }
53 
54 
55 
56  //! Reader for parameters
57  void read(XMLReader& xml, const std::string& path, InlineStaticLightSpecParams::Param_t& param)
58  {
59  XMLReader paramtop(xml, path);
60 
61  int version;
62  read(paramtop, "version", version);
63 
64  switch (version)
65  {
66  case 1:
67  break;
68 
69  default:
70  QDPIO::cerr << "Input parameter version " << version << " unsupported." << std::endl;
71  QDP_abort(1);
72  }
73 
74  read(paramtop, "MesonP", param.MesonP);
75  read(paramtop, "BaryonP", param.BaryonP);
76  read(paramtop, "MesonPot", param.MesonPot);
77  read(paramtop, "BaryonPot", param.BaryonPot);
78 
79  }
80 
81 
82  //! Writer for parameters
83  void write(XMLWriter& xml, const std::string& path, const InlineStaticLightSpecParams::Param_t& param)
84  {
85  push(xml, path);
86 
87  int version = 1;
88  write(xml, "version", version);
89 
90  write(xml, "MesonP", param.MesonP);
91  write(xml, "BaryonP", param.BaryonP);
92  write(xml, "MesonPot", param.MesonPot);
93  write(xml, "BaryonPot", param.BaryonPot);
94 
95  pop(xml);
96  }
97 
98 
99  //! Propagator input
100  void read(XMLReader& xml, const std::string& path, InlineStaticLightSpecParams::NamedObject_t::Props_t& input)
101  {
102  XMLReader inputtop(xml, path);
103 
104  read(inputtop, "first_id", input.first_id);
105  read(inputtop, "second_id", input.second_id);
106  }
107 
108  //! Propagator output
109  void write(XMLWriter& xml, const std::string& path, const InlineStaticLightSpecParams::NamedObject_t::Props_t& input)
110  {
111  push(xml, path);
112 
113  write(xml, "first_id", input.first_id);
114  write(xml, "second_id", input.second_id);
115 
116  pop(xml);
117  }
118 
119 
120  //! Propagator input
121  void read(XMLReader& xml, const std::string& path, InlineStaticLightSpecParams::NamedObject_t& input)
122  {
123  XMLReader inputtop(xml, path);
124 
125  read(inputtop, "gauge_id", input.gauge_id);
126  read(inputtop, "sink_pairs", input.sink_pairs);
127  }
128 
129  //! Propagator output
130  void write(XMLWriter& xml, const std::string& path, const InlineStaticLightSpecParams::NamedObject_t& input)
131  {
132  push(xml, path);
133 
134  write(xml, "gauge_id", input.gauge_id);
135  write(xml, "sink_pairs", input.sink_pairs);
136 
137  pop(xml);
138  }
139 
140 
141  // Param stuff
143  {
144  frequency = 0;
145  }
146 
148  {
149  try
150  {
151  XMLReader paramtop(xml_in, path);
152 
153  if (paramtop.count("Frequency") == 1)
154  read(paramtop, "Frequency", frequency);
155  else
156  frequency = 1;
157 
158  // Parameters for source construction
159  read(paramtop, "Param", param);
160 
161  // Read in the output propagator/source configuration info
162  read(paramtop, "NamedObject", named_obj);
163 
164  // Possible alternate XML file pattern
165  if (paramtop.count("xml_file") != 0)
166  {
167  read(paramtop, "xml_file", xml_file);
168  }
169  }
170  catch(const std::string& e)
171  {
172  QDPIO::cerr << __func__ << ": Caught Exception reading XML: " << e << std::endl;
173  QDP_abort(1);
174  }
175  }
176 
177 
178  void
179  InlineStaticLightSpecParams::write(XMLWriter& xml_out, const std::string& path)
180  {
181  push(xml_out, path);
182 
183  Chroma::write(xml_out, "Param", param);
184  Chroma::write(xml_out, "NamedObject", named_obj);
185  QDP::write(xml_out, "xml_file", xml_file);
186 
187  pop(xml_out);
188  }
189 
190 
191 
192  // Anonymous namespace
193  namespace
194  {
195  //! Useful structure holding sink props
196  struct SinkPropContainer_t
197  {
198  ForwardProp_t prop_header;
200  Real Mass;
201 
202  multi1d<int> bc;
203 
208  };
209 
210 
211  //! Useful structure holding sink props
212  struct AllSinkProps_t
213  {
214  SinkPropContainer_t sink_prop_1;
215  SinkPropContainer_t sink_prop_2;
216  };
217 
218 
219  //! Read a sink prop
220  void readSinkProp(SinkPropContainer_t& s, const std::string& id)
221  {
222  try
223  {
224  // Try a cast to see if it succeeds
225  const LatticePropagator& foo =
226  TheNamedObjMap::Instance().getData<LatticePropagator>(id);
227 
228  // Snarf the data into a copy
229  s.quark_propagator_id = id;
230 
231  // Snarf the prop info. This is will throw if the prop_id is not there
232  XMLReader prop_file_xml, prop_record_xml;
233  TheNamedObjMap::Instance().get(id).getFileXML(prop_file_xml);
234  TheNamedObjMap::Instance().get(id).getRecordXML(prop_record_xml);
235 
236  // Try to invert this record XML into a ChromaProp struct
237  // Also pull out the id of this source
238  {
239  std::string xpath;
240  read(prop_record_xml, "/SinkSmear", s.prop_header);
241 
242  read(prop_record_xml, "/SinkSmear/PropSource/Source/SourceType", s.source_type);
243  xpath = "/SinkSmear/PropSource/Source/Displacement/DisplacementType";
244  if (prop_record_xml.count(xpath) != 0)
245  read(prop_record_xml, xpath, s.source_disp_type);
246  else
247  s.source_disp_type = NoQuarkDisplacementEnv::getName();
248 
249  read(prop_record_xml, "/SinkSmear/PropSink/Sink/SinkType", s.sink_type);
250  xpath = "/SinkSmear/PropSink/Sink/Displacement/DisplacementType";
251  if (prop_record_xml.count(xpath) != 0)
252  read(prop_record_xml, xpath, s.sink_disp_type);
253  else
254  s.sink_disp_type = NoQuarkDisplacementEnv::getName();
255  }
256  }
257  catch( std::bad_cast )
258  {
259  QDPIO::cerr << InlineStaticLightSpecEnv::name << ": caught dynamic cast error"
260  << std::endl;
261  QDP_abort(1);
262  }
263  catch (const std::string& e)
264  {
265  QDPIO::cerr << InlineStaticLightSpecEnv::name << ": error message: " << e
266  << std::endl;
267  QDP_abort(1);
268  }
269 
270 
271  // Derived from input prop
272  // Hunt around to find the mass
273  // NOTE: this may be problematic in the future if actions are used with no
274  // clear def. of a Mass
275  QDPIO::cout << "Try action and mass" << std::endl;
276  s.Mass = getMass(s.prop_header.prop_header.fermact);
277  s.bc = getFermActBoundary(s.prop_header.prop_header.fermact);
278 
279  QDPIO::cout << "FermAct = " << s.prop_header.prop_header.fermact.id << std::endl;
280  QDPIO::cout << "Mass = " << s.Mass << std::endl;
281  }
282 
283 
284  //! Read all sinks
285  void readAllSinks(AllSinkProps_t& s,
286  InlineStaticLightSpecParams::NamedObject_t::Props_t sink_pair)
287  {
288  QDPIO::cout << "Attempt to parse forward propagator = " << sink_pair.first_id << std::endl;
289  readSinkProp(s.sink_prop_1, sink_pair.first_id);
290  QDPIO::cout << "Forward propagator successfully parsed" << std::endl;
291 
292  QDPIO::cout << "Attempt to parse forward propagator = " << sink_pair.second_id << std::endl;
293  readSinkProp(s.sink_prop_2, sink_pair.second_id);
294  QDPIO::cout << "Forward propagator successfully parsed" << std::endl;
295  }
296 
297  } // namespace anonymous
298 
299 
300 
301  // Function call
302  void
303  InlineStaticLightSpec::operator()(unsigned long update_no,
304  XMLWriter& xml_out)
305  {
306  // If xml file not empty, then use alternate
307  if (params.xml_file != "")
308  {
309  std::string xml_file = makeXMLFileName(params.xml_file, update_no);
310 
311  push(xml_out, "StaticLightSpec");
312  write(xml_out, "update_no", update_no);
313  write(xml_out, "xml_file", xml_file);
314  pop(xml_out);
315 
316  XMLFileWriter xml(xml_file);
317  func(update_no, xml);
318  }
319  else
320  {
321  func(update_no, xml_out);
322  }
323  }
324 
325 
326  // Real work done here
327  void
328  InlineStaticLightSpec::func(unsigned long update_no,
329  XMLWriter& xml_out)
330  {
331  START_CODE();
332 
333  StopWatch snoop;
334  snoop.reset();
335  snoop.start();
336 
337  // Test and grab a reference to the gauge field
338  XMLBufferWriter gauge_xml;
339  try
340  {
341  TheNamedObjMap::Instance().getData< multi1d<LatticeColorMatrix> >(params.named_obj.gauge_id);
342  TheNamedObjMap::Instance().get(params.named_obj.gauge_id).getRecordXML(gauge_xml);
343  }
344  catch( std::bad_cast )
345  {
346  QDPIO::cerr << InlineStaticLightSpecEnv::name << ": caught dynamic cast error"
347  << std::endl;
348  QDP_abort(1);
349  }
350  catch (const std::string& e)
351  {
352  QDPIO::cerr << InlineStaticLightSpecEnv::name << ": std::map call failed: " << e
353  << std::endl;
354  QDP_abort(1);
355  }
356  const multi1d<LatticeColorMatrix>& u =
357  TheNamedObjMap::Instance().getData< multi1d<LatticeColorMatrix> >(params.named_obj.gauge_id);
358 
359  push(xml_out, "StaticLightSpec");
360  write(xml_out, "update_no", update_no);
361 
362  QDPIO::cout << " StaticLightSpec: Spectroscopy for Wilson-like fermions" ;
363  QDPIO::cout << std::endl;
364  QDPIO::cout << std::endl << " Gauge group: SU(" << Nc << ")" << std::endl;
365  QDPIO::cout << " volume: " << Layout::lattSize()[0];
366  for (int i=1; i<Nd; ++i) {
367  QDPIO::cout << " x " << Layout::lattSize()[i];
368  }
369  QDPIO::cout << std::endl;
370 
371  proginfo(xml_out); // Print out basic program info
372 
373  // Write out the input
374  params.write(xml_out, "Input");
375 
376  // Write out the config info
377  write(xml_out, "Config_info", gauge_xml);
378 
379  push(xml_out, "Output_version");
380  write(xml_out, "out_version", 14);
381  pop(xml_out);
382 
383 
384  // First calculate some gauge invariant observables just for info.
385  MesPlq(xml_out, "Observables", u);
386 
387  // Keep an array of all the xml output buffers
388  push(xml_out, "Wilson_hadron_measurements");
389 
390  // Now loop over the various fermion pairs
391  for(int lpair=0; lpair < params.named_obj.sink_pairs.size(); ++lpair)
392  {
394 
395  push(xml_out, "elem");
396 
397  AllSinkProps_t all_sinks;
398  readAllSinks(all_sinks, named_obj);
399 
400  // Derived from input prop
401  multi1d<int> t_src1
402  = all_sinks.sink_prop_1.prop_header.source_header.getTSrce();
403  multi1d<int> t_src2
404  = all_sinks.sink_prop_2.prop_header.source_header.getTSrce();
405 
406  int j_decay = all_sinks.sink_prop_1.prop_header.source_header.j_decay;
407  int t0 = all_sinks.sink_prop_1.prop_header.source_header.t_source;
408  int bc_spec = all_sinks.sink_prop_1.bc[j_decay] ;
409 
410  // Sanity checks
411  {
412  if (all_sinks.sink_prop_2.prop_header.source_header.j_decay != j_decay)
413  {
414  QDPIO::cerr << "Error!! j_decay must be the same for all propagators " << std::endl;
415  QDP_abort(1);
416  }
417  if (all_sinks.sink_prop_2.bc[j_decay] != bc_spec)
418  {
419  QDPIO::cerr << "Error!! bc must be the same for all propagators " << std::endl;
420  QDP_abort(1);
421  }
422  if (all_sinks.sink_prop_2.prop_header.source_header.t_source !=
423  all_sinks.sink_prop_1.prop_header.source_header.t_source)
424  {
425  QDPIO::cerr << "Error!! t_source must be the same for all propagators " << std::endl;
426  QDP_abort(1);
427  }
428  if (all_sinks.sink_prop_1.source_type != all_sinks.sink_prop_2.source_type)
429  {
430  QDPIO::cerr << "Error!! source_type must be the same in a pair " << std::endl;
431  QDP_abort(1);
432  }
433  if (all_sinks.sink_prop_1.sink_type != all_sinks.sink_prop_2.sink_type)
434  {
435  QDPIO::cerr << "Error!! source_type must be the same in a pair " << std::endl;
436  QDP_abort(1);
437  }
438  }
439 
440 
441  // Masses
442  write(xml_out, "Mass_1", all_sinks.sink_prop_1.Mass);
443  write(xml_out, "Mass_2", all_sinks.sink_prop_2.Mass);
444  write(xml_out, "t0", t0);
445 
446  // Initialize the slow Fourier transform phases with NO momenta
447  SftMom phases(0, true, j_decay);
448 
449  // Save prop input
450  push(xml_out, "Forward_prop_headers");
451  write(xml_out, "First_forward_prop", all_sinks.sink_prop_1.prop_header);
452  write(xml_out, "Second_forward_prop", all_sinks.sink_prop_2.prop_header);
453  pop(xml_out);
454 
455  // Sanity check - write out the norm2 of the forward prop in the j_decay direction
456  // Use this for any possible verification
457  push(xml_out, "Forward_prop_correlator");
458  {
459  const LatticePropagator& sink_prop_1 =
460  TheNamedObjMap::Instance().getData<LatticePropagator>(all_sinks.sink_prop_1.quark_propagator_id);
461  const LatticePropagator& sink_prop_2 =
462  TheNamedObjMap::Instance().getData<LatticePropagator>(all_sinks.sink_prop_2.quark_propagator_id);
463 
464  write(xml_out, "forward_prop_corr_1", sumMulti(localNorm2(sink_prop_1), phases.getSet()));
465  write(xml_out, "forward_prop_corr_2", sumMulti(localNorm2(sink_prop_2), phases.getSet()));
466  }
467  pop(xml_out);
468 
469 
470  push(xml_out, "SourceSinkType");
471  {
472  QDPIO::cout << "Source_type_1 = " << all_sinks.sink_prop_1.source_type << std::endl;
473  QDPIO::cout << "Sink_type_1 = " << all_sinks.sink_prop_1.sink_type << std::endl;
474  QDPIO::cout << "Source_type_2 = " << all_sinks.sink_prop_2.source_type << std::endl;
475  QDPIO::cout << "Sink_type_2 = " << all_sinks.sink_prop_2.sink_type << std::endl;
476 
477  write(xml_out, "source_type_1", all_sinks.sink_prop_1.source_type);
478  write(xml_out, "source_disp_type_1", all_sinks.sink_prop_1.source_disp_type);
479  write(xml_out, "sink_type_1", all_sinks.sink_prop_1.sink_type);
480  write(xml_out, "sink_disp_type_1", all_sinks.sink_prop_1.sink_disp_type);
481 
482  write(xml_out, "source_type_2", all_sinks.sink_prop_2.source_type);
483  write(xml_out, "source_disp_type_2", all_sinks.sink_prop_2.source_disp_type);
484  write(xml_out, "sink_type_2", all_sinks.sink_prop_2.sink_type);
485  write(xml_out, "sink_disp_type_2", all_sinks.sink_prop_2.sink_disp_type);
486  }
487  pop(xml_out);
488 
489 
490  // References for use later
491  const LatticePropagator& sink_prop_1 =
492  TheNamedObjMap::Instance().getData<LatticePropagator>(all_sinks.sink_prop_1.quark_propagator_id);
493  const LatticePropagator& sink_prop_2 =
494  TheNamedObjMap::Instance().getData<LatticePropagator>(all_sinks.sink_prop_2.quark_propagator_id);
495 
496 
497  // Construct group name for output
498  std::string src_type;
499  if (all_sinks.sink_prop_1.source_type == "POINT_SOURCE")
500  src_type = "Point";
501  else if (all_sinks.sink_prop_1.source_type == "SHELL_SOURCE")
502  src_type = "Shell";
503  else if (all_sinks.sink_prop_1.source_type == "WALL_SOURCE")
504  src_type = "Wall";
505  else
506  {
507  QDPIO::cerr << "Unsupported source type = " << all_sinks.sink_prop_1.source_type << std::endl;
508  QDP_abort(1);
509  }
510 
511  std::string snk_type;
512  if (all_sinks.sink_prop_1.sink_type == "POINT_SINK")
513  snk_type = "Point";
514  else if (all_sinks.sink_prop_1.sink_type == "SHELL_SINK")
515  snk_type = "Shell";
516  else if (all_sinks.sink_prop_1.sink_type == "WALL_SINK")
517  snk_type = "Wall";
518  else
519  {
520  QDPIO::cerr << "Unsupported sink type = " << all_sinks.sink_prop_1.sink_type << std::endl;
521  QDP_abort(1);
522  }
523 
524  std::string source_sink_type = src_type + "_" + snk_type;
525  QDPIO::cout << "Source type = " << src_type << std::endl;
526  QDPIO::cout << "Sink type = " << snk_type << std::endl;
527 
528  // Do the mesons first
529  if (params.param.MesonP)
530  {
531  Qlbar(u, sink_prop_1, t_src1, phases, xml_out, source_sink_type + "_Wilson_Qlmeson");
532  if(all_sinks.sink_prop_1.quark_propagator_id!=all_sinks.sink_prop_2.quark_propagator_id)
533  Qlbar(u, sink_prop_2, t_src2, phases, xml_out, source_sink_type + "_Wilson_Qlmeson");
534  } // end if (MesonP)
535 
536 
537  // Do the baryons
538  if (params.param.BaryonP)
539  {
540  //if location of prop1 is not equal to prop2 gauge non invariant
541  //correlation function may occure...
542  //Hopefully the user knows what he is doing...
543  Qll(u, sink_prop_1,sink_prop_2,t_src1, phases,xml_out, source_sink_type +"_Wilson_QllBaryons");
544  } // end if (BaryonP)
545 
546  // Do the potentials
547  if (params.param.MesonPot){
548  QlQlPOT(u,sink_prop_1,sink_prop_2, t_src1, t_src2, phases,
549  xml_out, source_sink_type +"_Wilson_QlQlPotential");
550  }
551 
552  // Do the full set of potentials
553  if (params.param.BaryonPot){
554  QllQllPOT(u,sink_prop_1,sink_prop_2, t_src1, t_src2, phases,
555  xml_out, source_sink_type +"_Wilson_QllQllPotential");
556  }
557 
558 
559  pop(xml_out); // array element
560  }
561  pop(xml_out); // Wilson_spectroscopy
562  pop(xml_out); // StaticLightSpec
563 
564  snoop.stop();
565  QDPIO::cout << InlineStaticLightSpecEnv::name << ": total time = "
566  << snoop.getTimeInSeconds()
567  << " secs" << std::endl;
568 
569  QDPIO::cout << InlineStaticLightSpecEnv::name << ": ran successfully" << std::endl;
570 
571  END_CODE();
572  }
573 
574 }
Inline measurement factory.
Heavy Baryon (Qll) 2-pt function : Orginos and Savage.
Inline measurement of static-light quark spectroscopy.
InlineStaticLightSpecParams params
void operator()(const unsigned long update_no, XMLWriter &xml_out)
Do the measurement.
void func(const unsigned long update_no, XMLWriter &xml_out)
Do the measurement.
Fourier transform phase factor support.
Definition: sftmom.h:35
const Set & getSet() const
The set to be used in sumMulti.
Definition: sftmom.h:57
static T & Instance()
Definition: singleton.h:432
void read(XMLReader &xml, const std::string &path, AsqtadFermActParams &param)
Read parameters.
void write(XMLWriter &xml, const std::string &path, const AsqtadFermActParams &param)
Writer parameters.
void QlQlPOT(const multi1d< LatticeColorMatrix > &u, const LatticePropagator &quark1, const LatticePropagator &quark2, const multi1d< int > &src1, const multi1d< int > &src2, const SftMom &phases, XMLWriter &xml, const std::string &xml_group)
Heavy-light meson potential.
Definition: mesQlPOT_w.cc:45
void Qll(const multi1d< LatticeColorMatrix > &u, const LatticePropagator &quark_prop1, const LatticePropagator &quark_prop2, const multi1d< int > &src_coord, const SftMom &phases, XMLWriter &xml, const std::string &xml_group)
Lambdaq and SigmaQ 2-pt functions.
Definition: barQll_w.cc:33
void QllQllPOT(const multi1d< LatticeColorMatrix > &u, const LatticePropagator &quark1, const LatticePropagator &quark2, const multi1d< int > &src1, const multi1d< int > &src2, const SftMom &phases, XMLWriter &xml, const std::string &xml_group)
Heavy hadron potentials for SU(2) isospin limit.
void Qlbar(const multi1d< LatticeColorMatrix > &u, const LatticePropagator &quark_propagator, const multi1d< int > &src_coord, const SftMom &phases, XMLWriter &xml, const std::string &xml_group, const int bc)
Heavy-light meson 2-pt function.
Definition: mesQl_w.cc:32
void proginfo(XMLWriter &xml)
Print out basic information about this program.
Definition: proginfo.cc:24
std::string makeXMLFileName(std::string xml_file, unsigned long update_no)
Return a xml file name for inline measurements.
Potential between 2 heavy hadrons : Detmold.
int bc_spec
std::string source_disp_type
multi1d< int > bc
std::string source_type
std::string quark_propagator_id
SinkPropContainer_t sink_prop_2
std::string sink_type
SinkPropContainer_t sink_prop_1
ForwardProp_t prop_header
std::string sink_disp_type
Inline static light spectrum calculations.
Make xml file writer.
Potential between 2 heavy mesons : Orginos and Savage.
Heavy light meson (Qlbar) 2-pt function : Orginos and Savage.
int j_decay
Definition: meslate.cc:22
Nd
Definition: meslate.cc:74
Named object function std::map.
static bool registered
Local registration flag.
bool registerAll()
Register all the factories.
std::string getName()
Return the name.
Asqtad Staggered-Dirac operator.
Definition: klein_gord.cc:10
Real getMass(const GroupXML_t &fermact)
Given a fermion action in std::string form, return the Mass.
Definition: qprop_io.cc:16
static multi1d< LatticeColorMatrix > u
const WilsonTypeFermAct< multi1d< LatticeFermion > > Handle< const ConnectState > const multi1d< Real > & Mass
Definition: pbg5p_w.cc:29
push(xml_out,"Condensates")
int i
Definition: pbg5p_w.cc:55
multi1d< int > getFermActBoundary(const GroupXML_t &fermact)
Given a fermion action in std::string form, return the boundary.
Definition: qprop_io.cc:61
pop(xml_out)
void MesPlq(const multi1d< LatticeColorMatrixF3 > &u, multi2d< Double > &plane_plaq, Double &link)
Definition: mesplq.cc:83
void write(XMLWriter &xml, const std::string &path, const InlineStaticLightSpecParams::NamedObject_t &input)
Propagator output.
START_CODE()
multi1d< LatticeFermion > s(Ncb)
::std::string string
Definition: gtest.h:1979
No quark displacement.
Various parameter structs and reader/writers.
Print out basic info about this program.
Routines associated with Chroma propagator IO.
Fourier transform phase factor support.
void write(XMLWriter &xml_out, const std::string &path)
struct Chroma::InlineStaticLightSpecParams::Param_t param
struct Chroma::InlineStaticLightSpecParams::NamedObject_t named_obj