mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-03 21:44:33 +00:00 
			
		
		
		
	Namespace
This commit is contained in:
		@@ -93,50 +93,50 @@ public:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace QCD {
 | 
			
		||||
 | 
			
		||||
  using namespace Grid;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  //////////////////////////////////////////////////////////////////////
 | 
			
		||||
  // Bit and Physical Checksumming and QA of data
 | 
			
		||||
  //////////////////////////////////////////////////////////////////////
 | 
			
		||||
  inline void GridMetaData(GridBase *grid,FieldMetaData &header)
 | 
			
		||||
  {
 | 
			
		||||
    int nd = grid->_ndimension;
 | 
			
		||||
    header.nd = nd;
 | 
			
		||||
    header.dimension.resize(nd);
 | 
			
		||||
    header.boundary.resize(nd);
 | 
			
		||||
    header.data_start = 0;
 | 
			
		||||
    for(int d=0;d<nd;d++) {
 | 
			
		||||
      header.dimension[d] = grid->_fdimensions[d];
 | 
			
		||||
    }
 | 
			
		||||
    for(int d=0;d<nd;d++) {
 | 
			
		||||
      header.boundary[d] = std::string("PERIODIC");
 | 
			
		||||
    }
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//////////////////////////////////////////////////////////////////////
 | 
			
		||||
// Bit and Physical Checksumming and QA of data
 | 
			
		||||
//////////////////////////////////////////////////////////////////////
 | 
			
		||||
inline void GridMetaData(GridBase *grid,FieldMetaData &header)
 | 
			
		||||
{
 | 
			
		||||
  int nd = grid->_ndimension;
 | 
			
		||||
  header.nd = nd;
 | 
			
		||||
  header.dimension.resize(nd);
 | 
			
		||||
  header.boundary.resize(nd);
 | 
			
		||||
  header.data_start = 0;
 | 
			
		||||
  for(int d=0;d<nd;d++) {
 | 
			
		||||
    header.dimension[d] = grid->_fdimensions[d];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  inline void MachineCharacteristics(FieldMetaData &header)
 | 
			
		||||
  {
 | 
			
		||||
    // Who
 | 
			
		||||
    struct passwd *pw = getpwuid (getuid());
 | 
			
		||||
    if (pw) header.creator = std::string(pw->pw_name); 
 | 
			
		||||
 | 
			
		||||
    // When
 | 
			
		||||
    std::time_t t = std::time(nullptr);
 | 
			
		||||
    std::tm tm_ = *std::localtime(&t);
 | 
			
		||||
    std::ostringstream oss; 
 | 
			
		||||
    //      oss << std::put_time(&tm_, "%c %Z");
 | 
			
		||||
    header.creation_date = oss.str();
 | 
			
		||||
    header.archive_date  = header.creation_date;
 | 
			
		||||
 | 
			
		||||
    // What
 | 
			
		||||
    struct utsname name;  uname(&name);
 | 
			
		||||
    header.creator_hardware = std::string(name.nodename)+"-";
 | 
			
		||||
    header.creator_hardware+= std::string(name.machine)+"-";
 | 
			
		||||
    header.creator_hardware+= std::string(name.sysname)+"-";
 | 
			
		||||
    header.creator_hardware+= std::string(name.release);
 | 
			
		||||
  for(int d=0;d<nd;d++) {
 | 
			
		||||
    header.boundary[d] = std::string("PERIODIC");
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void MachineCharacteristics(FieldMetaData &header)
 | 
			
		||||
{
 | 
			
		||||
  // Who
 | 
			
		||||
  struct passwd *pw = getpwuid (getuid());
 | 
			
		||||
  if (pw) header.creator = std::string(pw->pw_name); 
 | 
			
		||||
 | 
			
		||||
  // When
 | 
			
		||||
  std::time_t t = std::time(nullptr);
 | 
			
		||||
  std::tm tm_ = *std::localtime(&t);
 | 
			
		||||
  std::ostringstream oss; 
 | 
			
		||||
  //      oss << std::put_time(&tm_, "%c %Z");
 | 
			
		||||
  header.creation_date = oss.str();
 | 
			
		||||
  header.archive_date  = header.creation_date;
 | 
			
		||||
 | 
			
		||||
  // What
 | 
			
		||||
  struct utsname name;  uname(&name);
 | 
			
		||||
  header.creator_hardware = std::string(name.nodename)+"-";
 | 
			
		||||
  header.creator_hardware+= std::string(name.machine)+"-";
 | 
			
		||||
  header.creator_hardware+= std::string(name.sysname)+"-";
 | 
			
		||||
  header.creator_hardware+= std::string(name.release);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define dump_meta_data(field, s)					\
 | 
			
		||||
  s << "BEGIN_HEADER"      << std::endl;				\
 | 
			
		||||
@@ -165,165 +165,164 @@ namespace QCD {
 | 
			
		||||
  s << "FLOATING_POINT = "  << field.floating_point   << std::endl;	\
 | 
			
		||||
  s << "END_HEADER"         << std::endl;
 | 
			
		||||
 | 
			
		||||
  template<class vobj> inline void PrepareMetaData(Lattice<vobj> & field, FieldMetaData &header)
 | 
			
		||||
  {
 | 
			
		||||
    GridBase *grid = field._grid;
 | 
			
		||||
    std::string format = getFormatString<vobj>();
 | 
			
		||||
    header.floating_point = format;
 | 
			
		||||
    header.checksum = 0x0; // Nersc checksum unused in ILDG, Scidac
 | 
			
		||||
    GridMetaData(grid,header); 
 | 
			
		||||
    MachineCharacteristics(header);
 | 
			
		||||
  }
 | 
			
		||||
  inline void GaugeStatistics(Lattice<vLorentzColourMatrixF> & data,FieldMetaData &header)
 | 
			
		||||
  {
 | 
			
		||||
    // How to convert data precision etc...
 | 
			
		||||
    header.link_trace=Grid::QCD::WilsonLoops<PeriodicGimplF>::linkTrace(data);
 | 
			
		||||
    header.plaquette =Grid::QCD::WilsonLoops<PeriodicGimplF>::avgPlaquette(data);
 | 
			
		||||
  }
 | 
			
		||||
  inline void GaugeStatistics(Lattice<vLorentzColourMatrixD> & data,FieldMetaData &header)
 | 
			
		||||
  {
 | 
			
		||||
    // How to convert data precision etc...
 | 
			
		||||
    header.link_trace=Grid::QCD::WilsonLoops<PeriodicGimplD>::linkTrace(data);
 | 
			
		||||
    header.plaquette =Grid::QCD::WilsonLoops<PeriodicGimplD>::avgPlaquette(data);
 | 
			
		||||
  }
 | 
			
		||||
  template<> inline void PrepareMetaData<vLorentzColourMatrixF>(Lattice<vLorentzColourMatrixF> & field, FieldMetaData &header)
 | 
			
		||||
  {
 | 
			
		||||
   
 | 
			
		||||
    GridBase *grid = field._grid;
 | 
			
		||||
    std::string format = getFormatString<vLorentzColourMatrixF>();
 | 
			
		||||
    header.floating_point = format;
 | 
			
		||||
    header.checksum = 0x0; // Nersc checksum unused in ILDG, Scidac
 | 
			
		||||
    GridMetaData(grid,header); 
 | 
			
		||||
    GaugeStatistics(field,header);
 | 
			
		||||
    MachineCharacteristics(header);
 | 
			
		||||
  }
 | 
			
		||||
  template<> inline void PrepareMetaData<vLorentzColourMatrixD>(Lattice<vLorentzColourMatrixD> & field, FieldMetaData &header)
 | 
			
		||||
  {
 | 
			
		||||
    GridBase *grid = field._grid;
 | 
			
		||||
    std::string format = getFormatString<vLorentzColourMatrixD>();
 | 
			
		||||
    header.floating_point = format;
 | 
			
		||||
    header.checksum = 0x0; // Nersc checksum unused in ILDG, Scidac
 | 
			
		||||
    GridMetaData(grid,header); 
 | 
			
		||||
    GaugeStatistics(field,header);
 | 
			
		||||
    MachineCharacteristics(header);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //////////////////////////////////////////////////////////////////////
 | 
			
		||||
  // Utilities ; these are QCD aware
 | 
			
		||||
  //////////////////////////////////////////////////////////////////////
 | 
			
		||||
  inline void reconstruct3(LorentzColourMatrix & cm)
 | 
			
		||||
  {
 | 
			
		||||
    const int x=0;
 | 
			
		||||
    const int y=1;
 | 
			
		||||
    const int z=2;
 | 
			
		||||
    for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
      cm(mu)()(2,x) = adj(cm(mu)()(0,y)*cm(mu)()(1,z)-cm(mu)()(0,z)*cm(mu)()(1,y)); //x= yz-zy
 | 
			
		||||
      cm(mu)()(2,y) = adj(cm(mu)()(0,z)*cm(mu)()(1,x)-cm(mu)()(0,x)*cm(mu)()(1,z)); //y= zx-xz
 | 
			
		||||
      cm(mu)()(2,z) = adj(cm(mu)()(0,x)*cm(mu)()(1,y)-cm(mu)()(0,y)*cm(mu)()(1,x)); //z= xy-yx
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  // Some data types for intermediate storage
 | 
			
		||||
  ////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  template<typename vtype> using iLorentzColour2x3 = iVector<iVector<iVector<vtype, Nc>, 2>, Nd >;
 | 
			
		||||
 | 
			
		||||
  typedef iLorentzColour2x3<Complex>  LorentzColour2x3;
 | 
			
		||||
  typedef iLorentzColour2x3<ComplexF> LorentzColour2x3F;
 | 
			
		||||
  typedef iLorentzColour2x3<ComplexD> LorentzColour2x3D;
 | 
			
		||||
 | 
			
		||||
  /////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  // Simple classes for precision conversion
 | 
			
		||||
  /////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  template <class fobj, class sobj>
 | 
			
		||||
  struct BinarySimpleUnmunger {
 | 
			
		||||
    typedef typename getPrecision<fobj>::real_scalar_type fobj_stype;
 | 
			
		||||
    typedef typename getPrecision<sobj>::real_scalar_type sobj_stype;
 | 
			
		||||
  
 | 
			
		||||
    void operator()(sobj &in, fobj &out) {
 | 
			
		||||
      // take word by word and transform accoding to the status
 | 
			
		||||
      fobj_stype *out_buffer = (fobj_stype *)&out;
 | 
			
		||||
      sobj_stype *in_buffer = (sobj_stype *)∈
 | 
			
		||||
      size_t fobj_words = sizeof(out) / sizeof(fobj_stype);
 | 
			
		||||
      size_t sobj_words = sizeof(in) / sizeof(sobj_stype);
 | 
			
		||||
      assert(fobj_words == sobj_words);
 | 
			
		||||
    
 | 
			
		||||
      for (unsigned int word = 0; word < sobj_words; word++)
 | 
			
		||||
	out_buffer[word] = in_buffer[word];  // type conversion on the fly
 | 
			
		||||
    
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  template <class fobj, class sobj>
 | 
			
		||||
  struct BinarySimpleMunger {
 | 
			
		||||
    typedef typename getPrecision<fobj>::real_scalar_type fobj_stype;
 | 
			
		||||
    typedef typename getPrecision<sobj>::real_scalar_type sobj_stype;
 | 
			
		||||
 | 
			
		||||
    void operator()(fobj &in, sobj &out) {
 | 
			
		||||
      // take word by word and transform accoding to the status
 | 
			
		||||
      fobj_stype *in_buffer = (fobj_stype *)∈
 | 
			
		||||
      sobj_stype *out_buffer = (sobj_stype *)&out;
 | 
			
		||||
      size_t fobj_words = sizeof(in) / sizeof(fobj_stype);
 | 
			
		||||
      size_t sobj_words = sizeof(out) / sizeof(sobj_stype);
 | 
			
		||||
      assert(fobj_words == sobj_words);
 | 
			
		||||
    
 | 
			
		||||
      for (unsigned int word = 0; word < sobj_words; word++)
 | 
			
		||||
	out_buffer[word] = in_buffer[word];  // type conversion on the fly
 | 
			
		||||
    
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  template<class fobj,class sobj>
 | 
			
		||||
  struct GaugeSimpleMunger{
 | 
			
		||||
    void operator()(fobj &in, sobj &out) {
 | 
			
		||||
      for (int mu = 0; mu < Nd; mu++) {
 | 
			
		||||
	for (int i = 0; i < Nc; i++) {
 | 
			
		||||
          for (int j = 0; j < Nc; j++) {
 | 
			
		||||
	    out(mu)()(i, j) = in(mu)()(i, j);
 | 
			
		||||
	  }}
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  template <class fobj, class sobj>
 | 
			
		||||
  struct GaugeSimpleUnmunger {
 | 
			
		||||
 | 
			
		||||
    void operator()(sobj &in, fobj &out) {
 | 
			
		||||
      for (int mu = 0; mu < Nd; mu++) {
 | 
			
		||||
	for (int i = 0; i < Nc; i++) {
 | 
			
		||||
          for (int j = 0; j < Nc; j++) {
 | 
			
		||||
	    out(mu)()(i, j) = in(mu)()(i, j);
 | 
			
		||||
	  }}
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  template<class fobj,class sobj>
 | 
			
		||||
  struct Gauge3x2munger{
 | 
			
		||||
    void operator() (fobj &in,sobj &out){
 | 
			
		||||
      for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
	for(int i=0;i<2;i++){
 | 
			
		||||
	  for(int j=0;j<3;j++){
 | 
			
		||||
	    out(mu)()(i,j) = in(mu)(i)(j);
 | 
			
		||||
	  }}
 | 
			
		||||
      }
 | 
			
		||||
      reconstruct3(out);
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  template<class fobj,class sobj>
 | 
			
		||||
  struct Gauge3x2unmunger{
 | 
			
		||||
    void operator() (sobj &in,fobj &out){
 | 
			
		||||
      for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
	for(int i=0;i<2;i++){
 | 
			
		||||
	  for(int j=0;j<3;j++){
 | 
			
		||||
	    out(mu)(i)(j) = in(mu)()(i,j);
 | 
			
		||||
	  }}
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
template<class vobj> inline void PrepareMetaData(Lattice<vobj> & field, FieldMetaData &header)
 | 
			
		||||
{
 | 
			
		||||
  GridBase *grid = field._grid;
 | 
			
		||||
  std::string format = getFormatString<vobj>();
 | 
			
		||||
  header.floating_point = format;
 | 
			
		||||
  header.checksum = 0x0; // Nersc checksum unused in ILDG, Scidac
 | 
			
		||||
  GridMetaData(grid,header); 
 | 
			
		||||
  MachineCharacteristics(header);
 | 
			
		||||
}
 | 
			
		||||
inline void GaugeStatistics(Lattice<vLorentzColourMatrixF> & data,FieldMetaData &header)
 | 
			
		||||
{
 | 
			
		||||
  // How to convert data precision etc...
 | 
			
		||||
  header.link_trace=Grid::QCD::WilsonLoops<PeriodicGimplF>::linkTrace(data);
 | 
			
		||||
  header.plaquette =Grid::QCD::WilsonLoops<PeriodicGimplF>::avgPlaquette(data);
 | 
			
		||||
}
 | 
			
		||||
inline void GaugeStatistics(Lattice<vLorentzColourMatrixD> & data,FieldMetaData &header)
 | 
			
		||||
{
 | 
			
		||||
  // How to convert data precision etc...
 | 
			
		||||
  header.link_trace=Grid::QCD::WilsonLoops<PeriodicGimplD>::linkTrace(data);
 | 
			
		||||
  header.plaquette =Grid::QCD::WilsonLoops<PeriodicGimplD>::avgPlaquette(data);
 | 
			
		||||
}
 | 
			
		||||
template<> inline void PrepareMetaData<vLorentzColourMatrixF>(Lattice<vLorentzColourMatrixF> & field, FieldMetaData &header)
 | 
			
		||||
{
 | 
			
		||||
   
 | 
			
		||||
  GridBase *grid = field._grid;
 | 
			
		||||
  std::string format = getFormatString<vLorentzColourMatrixF>();
 | 
			
		||||
  header.floating_point = format;
 | 
			
		||||
  header.checksum = 0x0; // Nersc checksum unused in ILDG, Scidac
 | 
			
		||||
  GridMetaData(grid,header); 
 | 
			
		||||
  GaugeStatistics(field,header);
 | 
			
		||||
  MachineCharacteristics(header);
 | 
			
		||||
}
 | 
			
		||||
template<> inline void PrepareMetaData<vLorentzColourMatrixD>(Lattice<vLorentzColourMatrixD> & field, FieldMetaData &header)
 | 
			
		||||
{
 | 
			
		||||
  GridBase *grid = field._grid;
 | 
			
		||||
  std::string format = getFormatString<vLorentzColourMatrixD>();
 | 
			
		||||
  header.floating_point = format;
 | 
			
		||||
  header.checksum = 0x0; // Nersc checksum unused in ILDG, Scidac
 | 
			
		||||
  GridMetaData(grid,header); 
 | 
			
		||||
  GaugeStatistics(field,header);
 | 
			
		||||
  MachineCharacteristics(header);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//////////////////////////////////////////////////////////////////////
 | 
			
		||||
// Utilities ; these are QCD aware
 | 
			
		||||
//////////////////////////////////////////////////////////////////////
 | 
			
		||||
inline void reconstruct3(LorentzColourMatrix & cm)
 | 
			
		||||
{
 | 
			
		||||
  const int x=0;
 | 
			
		||||
  const int y=1;
 | 
			
		||||
  const int z=2;
 | 
			
		||||
  for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
    cm(mu)()(2,x) = adj(cm(mu)()(0,y)*cm(mu)()(1,z)-cm(mu)()(0,z)*cm(mu)()(1,y)); //x= yz-zy
 | 
			
		||||
    cm(mu)()(2,y) = adj(cm(mu)()(0,z)*cm(mu)()(1,x)-cm(mu)()(0,x)*cm(mu)()(1,z)); //y= zx-xz
 | 
			
		||||
    cm(mu)()(2,z) = adj(cm(mu)()(0,x)*cm(mu)()(1,y)-cm(mu)()(0,y)*cm(mu)()(1,x)); //z= xy-yx
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
// Some data types for intermediate storage
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
template<typename vtype> using iLorentzColour2x3 = iVector<iVector<iVector<vtype, Nc>, 2>, Nd >;
 | 
			
		||||
 | 
			
		||||
typedef iLorentzColour2x3<Complex>  LorentzColour2x3;
 | 
			
		||||
typedef iLorentzColour2x3<ComplexF> LorentzColour2x3F;
 | 
			
		||||
typedef iLorentzColour2x3<ComplexD> LorentzColour2x3D;
 | 
			
		||||
 | 
			
		||||
/////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
// Simple classes for precision conversion
 | 
			
		||||
/////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
template <class fobj, class sobj>
 | 
			
		||||
struct BinarySimpleUnmunger {
 | 
			
		||||
  typedef typename getPrecision<fobj>::real_scalar_type fobj_stype;
 | 
			
		||||
  typedef typename getPrecision<sobj>::real_scalar_type sobj_stype;
 | 
			
		||||
  
 | 
			
		||||
  void operator()(sobj &in, fobj &out) {
 | 
			
		||||
    // take word by word and transform accoding to the status
 | 
			
		||||
    fobj_stype *out_buffer = (fobj_stype *)&out;
 | 
			
		||||
    sobj_stype *in_buffer = (sobj_stype *)∈
 | 
			
		||||
    size_t fobj_words = sizeof(out) / sizeof(fobj_stype);
 | 
			
		||||
    size_t sobj_words = sizeof(in) / sizeof(sobj_stype);
 | 
			
		||||
    assert(fobj_words == sobj_words);
 | 
			
		||||
    
 | 
			
		||||
    for (unsigned int word = 0; word < sobj_words; word++)
 | 
			
		||||
      out_buffer[word] = in_buffer[word];  // type conversion on the fly
 | 
			
		||||
    
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class fobj, class sobj>
 | 
			
		||||
struct BinarySimpleMunger {
 | 
			
		||||
  typedef typename getPrecision<fobj>::real_scalar_type fobj_stype;
 | 
			
		||||
  typedef typename getPrecision<sobj>::real_scalar_type sobj_stype;
 | 
			
		||||
 | 
			
		||||
  void operator()(fobj &in, sobj &out) {
 | 
			
		||||
    // take word by word and transform accoding to the status
 | 
			
		||||
    fobj_stype *in_buffer = (fobj_stype *)∈
 | 
			
		||||
    sobj_stype *out_buffer = (sobj_stype *)&out;
 | 
			
		||||
    size_t fobj_words = sizeof(in) / sizeof(fobj_stype);
 | 
			
		||||
    size_t sobj_words = sizeof(out) / sizeof(sobj_stype);
 | 
			
		||||
    assert(fobj_words == sobj_words);
 | 
			
		||||
    
 | 
			
		||||
    for (unsigned int word = 0; word < sobj_words; word++)
 | 
			
		||||
      out_buffer[word] = in_buffer[word];  // type conversion on the fly
 | 
			
		||||
    
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
template<class fobj,class sobj>
 | 
			
		||||
struct GaugeSimpleMunger{
 | 
			
		||||
  void operator()(fobj &in, sobj &out) {
 | 
			
		||||
    for (int mu = 0; mu < Nd; mu++) {
 | 
			
		||||
      for (int i = 0; i < Nc; i++) {
 | 
			
		||||
	for (int j = 0; j < Nc; j++) {
 | 
			
		||||
	  out(mu)()(i, j) = in(mu)()(i, j);
 | 
			
		||||
	}}
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class fobj, class sobj>
 | 
			
		||||
struct GaugeSimpleUnmunger {
 | 
			
		||||
 | 
			
		||||
  void operator()(sobj &in, fobj &out) {
 | 
			
		||||
    for (int mu = 0; mu < Nd; mu++) {
 | 
			
		||||
      for (int i = 0; i < Nc; i++) {
 | 
			
		||||
	for (int j = 0; j < Nc; j++) {
 | 
			
		||||
	  out(mu)()(i, j) = in(mu)()(i, j);
 | 
			
		||||
	}}
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class fobj,class sobj>
 | 
			
		||||
struct Gauge3x2munger{
 | 
			
		||||
  void operator() (fobj &in,sobj &out){
 | 
			
		||||
    for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
      for(int i=0;i<2;i++){
 | 
			
		||||
	for(int j=0;j<3;j++){
 | 
			
		||||
	  out(mu)()(i,j) = in(mu)(i)(j);
 | 
			
		||||
	}}
 | 
			
		||||
    }
 | 
			
		||||
    reconstruct3(out);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class fobj,class sobj>
 | 
			
		||||
struct Gauge3x2unmunger{
 | 
			
		||||
  void operator() (sobj &in,fobj &out){
 | 
			
		||||
    for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
      for(int i=0;i<2;i++){
 | 
			
		||||
	for(int j=0;j<3;j++){
 | 
			
		||||
	  out(mu)(i)(j) = in(mu)()(i,j);
 | 
			
		||||
	}}
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
NAMESPACE_END(Grid);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user