mirror of
https://github.com/paboyle/Grid.git
synced 2025-04-09 21:50:45 +01:00
Namespace
This commit is contained in:
parent
eda4fd9912
commit
4c829b410e
@ -93,50 +93,50 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace QCD {
|
|
||||||
|
|
||||||
using namespace Grid;
|
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
using namespace Grid;
|
||||||
// Bit and Physical Checksumming and QA of data
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
inline void GridMetaData(GridBase *grid,FieldMetaData &header)
|
//////////////////////////////////////////////////////////////////////
|
||||||
{
|
// Bit and Physical Checksumming and QA of data
|
||||||
int nd = grid->_ndimension;
|
//////////////////////////////////////////////////////////////////////
|
||||||
header.nd = nd;
|
inline void GridMetaData(GridBase *grid,FieldMetaData &header)
|
||||||
header.dimension.resize(nd);
|
{
|
||||||
header.boundary.resize(nd);
|
int nd = grid->_ndimension;
|
||||||
header.data_start = 0;
|
header.nd = nd;
|
||||||
for(int d=0;d<nd;d++) {
|
header.dimension.resize(nd);
|
||||||
header.dimension[d] = grid->_fdimensions[d];
|
header.boundary.resize(nd);
|
||||||
}
|
header.data_start = 0;
|
||||||
for(int d=0;d<nd;d++) {
|
for(int d=0;d<nd;d++) {
|
||||||
header.boundary[d] = std::string("PERIODIC");
|
header.dimension[d] = grid->_fdimensions[d];
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
for(int d=0;d<nd;d++) {
|
||||||
inline void MachineCharacteristics(FieldMetaData &header)
|
header.boundary[d] = std::string("PERIODIC");
|
||||||
{
|
|
||||||
// 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);
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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) \
|
#define dump_meta_data(field, s) \
|
||||||
s << "BEGIN_HEADER" << std::endl; \
|
s << "BEGIN_HEADER" << std::endl; \
|
||||||
@ -165,165 +165,164 @@ namespace QCD {
|
|||||||
s << "FLOATING_POINT = " << field.floating_point << std::endl; \
|
s << "FLOATING_POINT = " << field.floating_point << std::endl; \
|
||||||
s << "END_HEADER" << std::endl;
|
s << "END_HEADER" << std::endl;
|
||||||
|
|
||||||
template<class vobj> inline void PrepareMetaData(Lattice<vobj> & field, FieldMetaData &header)
|
template<class vobj> inline void PrepareMetaData(Lattice<vobj> & field, FieldMetaData &header)
|
||||||
{
|
{
|
||||||
GridBase *grid = field._grid;
|
GridBase *grid = field._grid;
|
||||||
std::string format = getFormatString<vobj>();
|
std::string format = getFormatString<vobj>();
|
||||||
header.floating_point = format;
|
header.floating_point = format;
|
||||||
header.checksum = 0x0; // Nersc checksum unused in ILDG, Scidac
|
header.checksum = 0x0; // Nersc checksum unused in ILDG, Scidac
|
||||||
GridMetaData(grid,header);
|
GridMetaData(grid,header);
|
||||||
MachineCharacteristics(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);
|
|
||||||
}}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
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);
|
NAMESPACE_END(Grid);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user