void read(XMLReader& xml, const string& path, Propagator_input_t& input)
void read(XMLReader& xml, const string& path, Prop_t& input)
void read(XMLReader& xml, const string& path, Propagator_input_t& input){  XMLReader inputtop(xml, path);  // First, read the input parameter version.  Then, if this version  // includes 'Nc' and 'Nd', verify they agree with values compiled  // into QDP++  // Read in the IO_version  int version;  try  {    read(inputtop, "IO_version/version", version);  }  catch (const string& e)   {    QDPIO::cerr << "Error reading data: " << e << endl;    throw;  }  // Currently, in the supported IO versions, there is only a small difference  // in the inputs. So, to make code simpler, extract the common bits   // Read the uncommon bits first  try  {    XMLReader paramtop(inputtop, "param"); // push into 'param' group    switch (version)     {      /**************************************************************************/    case 2 :      /**************************************************************************/      break;    default :      /**************************************************************************/      QDPIO::cerr << "Input parameter version " << version << " unsupported." << endl;      QDP_abort(1);    }  }  catch (const string& e)   {    QDPIO::cerr << "Error reading data: " << e << endl;    throw;  }  // Read the common bits  try   {    XMLReader paramtop(inputtop, "param"); // push into 'param' group    {      string ferm_type_str;      read(paramtop, "FermTypeP", ferm_type_str);      if (ferm_type_str == "STAGGERED") {	input.param.FermTypeP = FERM_TYPE_STAGGERED;      }     }    // GTF NOTE: I'm going to switch on FermTypeP here because I want    // to leave open the option of treating masses differently.    switch (input.param.FermTypeP) {    case FERM_TYPE_STAGGERED :      QDPIO::cout << " PROPAGATOR: Disconnected loops for Staggered fermions" << endl;      read(paramtop, "Mass", input.param.Mass);      read(paramtop, "u0" , input.param.u0);#if 0      for (int i=0; i < input.param.numKappa; ++i) {	if (toBool(input.param.Kappa[i] < 0.0)) {	  QDPIO::cerr << "Unreasonable value for Kappa." << endl;	  QDPIO::cerr << "  Kappa[" << i << "] = " << input.param.Kappa[i] << endl;	  QDP_abort(1);	} else {	  QDPIO::cout << " Spectroscopy Kappa: " << input.param.Kappa[i] << endl;	}      }#endif      break;    default :      QDP_error_exit("Fermion type not supported\n.");    }    {      string prop_type_str;      read(paramtop, "prop_type", prop_type_str);      if (prop_type_str == "SZIN") {	input.param.prop_type = PROP_TYPE_SZIN;      } else {	QDP_error_exit("Dont know non SZIN files yet");      }    }//    read(paramtop, "invType", input.param.invType);    input.param.invParam.invType = CG_INVERTER;   //need to fix this    read(paramtop, "RsdCG", input.param.invParam.RsdCG);    read(paramtop, "MaxCG", input.param.invParam.MaxCG);    read(paramtop, "Nsamples", input.param.Nsamples);    read(paramtop, "CFGNO", input.param.CFGNO);    read(paramtop, "GFAccu", input.param.GFAccu);    read(paramtop, "OrPara", input.param.OrPara);    read(paramtop, "GFMax", input.param.GFMax);    read(paramtop, "nrow", input.param.nrow);    read(paramtop, "boundary", input.param.boundary);    read(paramtop, "t_srce", input.param.t_srce);  }  catch (const string& e)   {    QDPIO::cerr << "Error reading data: " << e << endl;    throw;  }  // Read in the gauge configuration file name  try  {    read(inputtop, "Cfg", input.cfg);    read(inputtop, "Prop", input.prop);  }  catch (const string& e)   {    QDPIO::cerr << "Error reading data: " << e << endl;    throw;  }}