42#include <sys/utsname.h>
52#define GRID_FIELD_NORM "FieldNormMetaData"
53#define GRID_FIELD_NORM_CALC(FieldNormMetaData_, n2ck) \
540.5*fabs(FieldNormMetaData_.norm2 - n2ck)/(FieldNormMetaData_.norm2 + n2ck)
55#define GRID_FIELD_NORM_CHECK(FieldNormMetaData_, n2ck) \
56assert(GRID_FIELD_NORM_CALC(FieldNormMetaData_, n2ck) < 1.0e-5);
61 template<
class word>
inline std::string ScidacWordMnemonic(
void){
return std::string(
"unknown"); }
62 template<>
inline std::string ScidacWordMnemonic<double> (
void){
return std::string(
"D"); }
63 template<>
inline std::string ScidacWordMnemonic<float> (
void){
return std::string(
"F"); }
64 template<>
inline std::string ScidacWordMnemonic< int32_t>(
void){
return std::string(
"I32_t"); }
65 template<>
inline std::string ScidacWordMnemonic<uint32_t>(
void){
return std::string(
"U32_t"); }
66 template<>
inline std::string ScidacWordMnemonic< int64_t>(
void){
return std::string(
"I64_t"); }
67 template<>
inline std::string ScidacWordMnemonic<uint64_t>(
void){
return std::string(
"U64_t"); }
72 template<
class vobj> std::string ScidacRecordTypeString(
int &colors,
int &spins,
int & typesize,
int &datacount) {
91 std::stringstream stream;
94 stream << ScidacWordMnemonic<stype>();
96 if ( _LorentzVector ) stream <<
"_LorentzVector"<<_LorentzN;
97 if ( _LorentzMatrix ) stream <<
"_LorentzMatrix"<<_LorentzN;
99 if ( _SpinVector ) stream <<
"_SpinVector"<<_SpinN;
100 if ( _SpinMatrix ) stream <<
"_SpinMatrix"<<_SpinN;
102 if ( _ColourVector ) stream <<
"_ColourVector"<<_ColourN;
103 if ( _ColourMatrix ) stream <<
"_ColourMatrix"<<_ColourN;
105 if ( _ColourScalar && _LorentzScalar && _SpinScalar ) stream <<
"_Complex";
108 typesize =
sizeof(
typename vobj::scalar_type);
110 if ( _ColourMatrix ) typesize*= _ColourN*_ColourN;
111 else typesize*= _ColourN;
113 if ( _SpinMatrix ) typesize*= _SpinN*_SpinN;
114 else typesize*= _SpinN;
118 datacount = _LorentzN;
123 template<
class vobj> std::string ScidacRecordTypeString(
Lattice<vobj> & lat,
int &colors,
int &spins,
int & typesize,
int &datacount) {
124 return ScidacRecordTypeString<vobj>(colors,spins,typesize,datacount);
131template<
class vobj>
void ScidacMetaData(
Lattice<vobj> & field,
133 scidacRecord & _scidacRecord,
134 scidacFile & _scidacFile)
146 _scidacFile = scidacFile(field.
Grid());
152 sr.datatype = ScidacRecordTypeString(field,sr.colors,sr.spins,sr.typesize,sr.datacount);
153 sr.date =
header.creation_date;
154 sr.precision = ScidacWordMnemonic<stype>();
155 sr.recordtype = GRID_IO_FIELD;
165 static int scidacChecksumVerify(scidacChecksum &scidacChecksum_,uint32_t scidac_csuma,uint32_t scidac_csumb)
167 uint32_t scidac_checksuma = stoull(scidacChecksum_.suma,0,16);
168 uint32_t scidac_checksumb = stoull(scidacChecksum_.sumb,0,16);
169 std::cout <<
GridLogMessage <<
" scidacChecksumVerify computed "<<scidac_csuma<<
" expected "<<scidac_checksuma <<std::endl;
170 std::cout <<
GridLogMessage <<
" scidacChecksumVerify computed "<<scidac_csumb<<
" expected "<<scidac_checksumb <<std::endl;
171 if ( scidac_csuma !=scidac_checksuma) {
174 if ( scidac_csumb !=scidac_checksumb) {
183class GridLimeReader :
public BinaryIO {
191 std::string filename;
196 void open(
const std::string &_filename)
199 File = fopen(filename.c_str(),
"r");
202 std::cerr <<
"cannot open file '" << filename <<
"'" << std::endl;
205 LimeR = limeCreateReader(File);
219 void readLimeLatticeBinaryObject(Lattice<vobj> &field,std::string record_name,
int control=BINARYIO_LEXICOGRAPHIC)
221 typedef typename vobj::scalar_object sobj;
222 scidacChecksum scidacChecksum_;
223 FieldNormMetaData FieldNormMetaData_;
224 uint32_t nersc_csum,scidac_csuma,scidac_csumb;
228 while ( limeReaderNextRecord(LimeR) == LIME_SUCCESS ) {
230 uint64_t file_bytes =limeReaderBytes(LimeR);
235 if ( !strncmp(limeReaderType(LimeR), record_name.c_str(),strlen(record_name.c_str()) ) ) {
239 uint64_t PayloadSize =
sizeof(sobj) * field.
Grid()->
_gsites;
246 assert(PayloadSize == file_bytes);
248 uint64_t offset= ftello(File);
250 BinarySimpleMunger<sobj,sobj> munge;
252 std::cout <<
GridLogMessage <<
"SciDAC checksum A " << std::hex << scidac_csuma << std::dec << std::endl;
253 std::cout <<
GridLogMessage <<
"SciDAC checksum B " << std::hex << scidac_csumb << std::dec << std::endl;
257 readScidacChecksum(scidacChecksum_,FieldNormMetaData_);
261 if(FieldNormMetaData_.norm2 != 0.0){
263 std::cout <<
GridLogMessage <<
"Field norm: metadata= " << FieldNormMetaData_.norm2
264 <<
" / field= " << n2ck <<
" / rdiff= " << GRID_FIELD_NORM_CALC(FieldNormMetaData_,n2ck) << std::endl;
265 GRID_FIELD_NORM_CHECK(FieldNormMetaData_,n2ck);
267 assert(scidacChecksumVerify(scidacChecksum_,scidac_csuma,scidac_csumb)==1);
274 void readScidacChecksum(scidacChecksum &scidacChecksum_,
275 FieldNormMetaData &FieldNormMetaData_)
277 FieldNormMetaData_.norm2 =0.0;
278 std::string scidac_str(SCIDAC_CHECKSUM);
279 std::string field_norm_str(GRID_FIELD_NORM);
280 while ( limeReaderNextRecord(LimeR) == LIME_SUCCESS ) {
281 uint64_t nbytes = limeReaderBytes(LimeR);
282 std::vector<char> xmlc(nbytes+1,
'\0');
283 limeReaderReadData((
void *)&xmlc[0], &nbytes, LimeR);
284 std::string xmlstring = std::string(&xmlc[0]);
285 XmlReader RD(xmlstring,
true,
"");
286 if ( !strncmp(limeReaderType(LimeR), field_norm_str.c_str(),strlen(field_norm_str.c_str()) ) ) {
288 read(RD,field_norm_str,FieldNormMetaData_);
290 if ( !strncmp(limeReaderType(LimeR), scidac_str.c_str(),strlen(scidac_str.c_str()) ) ) {
292 read(RD,std::string(
"scidacChecksum"),scidacChecksum_);
301 void readLimeObject(std::string &xmlstring,std::string record_name)
304 while ( limeReaderNextRecord(LimeR) == LIME_SUCCESS ) {
307 uint64_t nbytes = limeReaderBytes(LimeR);
309 if ( !strncmp(limeReaderType(LimeR), record_name.c_str(),strlen(record_name.c_str()) ) ) {
312 std::vector<char> xmlc(nbytes+1,
'\0');
313 limeReaderReadData((
void *)&xmlc[0], &nbytes, LimeR);
316 xmlstring = std::string(&xmlc[0]);
324 template<
class serialisable_
object>
325 void readLimeObject(serialisable_object &
object,std::string object_name,std::string record_name)
327 std::string xmlstring;
329 readLimeObject(xmlstring, record_name);
330 XmlReader RD(xmlstring,
true,
"");
331 read(RD,object_name,
object);
335class GridLimeWriter :
public BinaryIO
346 std::string filename;
348 GridLimeWriter(
bool isboss =
true) {
351 void open(
const std::string &_filename) {
354 File = fopen(filename.c_str(),
"w");
355 LimeW = limeCreateWriter(File); assert(LimeW != NULL );
370 int createLimeRecordHeader(std::string message,
int MB,
int ME,
size_t PayloadSize)
374 h = limeCreateHeader(MB, ME,
const_cast<char *
>(message.c_str()), PayloadSize);
375 assert(limeWriteRecordHeader(h, LimeW) >= 0);
376 limeDestroyHeader(h);
383 void writeLimeObject(
int MB,
int ME,XmlWriter &writer,std::string object_name,std::string record_name)
386 std::string xmlstring = writer.docString();
389 uint64_t nbytes = xmlstring.size();
392 LimeRecordHeader *h = limeCreateHeader(MB, ME,
const_cast<char *
>(record_name.c_str()), nbytes);
395 err=limeWriteRecordHeader(h, LimeW); assert(err>=0);
396 err=limeWriteRecordData(&xmlstring[0], &nbytes, LimeW); assert(err>=0);
397 err=limeWriterCloseRecord(LimeW); assert(err>=0);
398 limeDestroyHeader(h);
402 template<
class serialisable_
object>
403 void writeLimeObject(
int MB,
int ME,serialisable_object &
object,std::string object_name,std::string record_name,
const unsigned int scientificPrec = 0)
409 WR.scientificFormat(
true);
410 WR.setPrecision(scientificPrec);
412 write(WR,object_name,
object);
413 writeLimeObject(MB, ME, WR, object_name, record_name);
420 template<
class vobj,
class group_name=GroupName::SU, MatrixFormat matrix_fmt=MatrixFormat::FULL, FloatingPo
intFormat fp_fmt=FloatingPo
intFormat::IEEE64BIG>
421 void writeLimeLatticeBinaryObject(Lattice<vobj> &field,std::string record_name,
int control=BINARYIO_LEXICOGRAPHIC)
437 GridBase *grid = field.
Grid();
440 FieldNormMetaData FNMD; FNMD.norm2 =
norm2(field);
446 uint32_t nersc_csum,scidac_csuma,scidac_csumb;
447 typedef typename GaugeUnMunger<vobj, group_name, matrix_fmt, fp_fmt>::out_type sobj;
448 uint64_t PayloadSize =
sizeof(sobj) * grid->
_gsites;
450 createLimeRecordHeader(record_name, 0, 0, PayloadSize);
463 offset1 = ftello(File);
465 grid->
Broadcast(0,(
void *)&offset1,
sizeof(offset1));
472 GaugeUnMunger<vobj, group_name, matrix_fmt, fp_fmt> unmunger;
480 fseek(File,0,SEEK_END);
481 uint64_t offset2 = ftello(File);
482 assert( (offset2-offset1) == PayloadSize);
490 err=limeWriterCloseRecord(LimeW); assert(err>=0);
496 scidacChecksum checksum;
497 std::stringstream streama; streama << std::hex << scidac_csuma;
498 std::stringstream streamb; streamb << std::hex << scidac_csumb;
499 checksum.suma= streama.str();
500 checksum.sumb= streamb.str();
502 writeLimeObject(0,0,FNMD,std::string(GRID_FIELD_NORM),std::string(GRID_FIELD_NORM));
503 writeLimeObject(0,1,checksum,std::string(
"scidacChecksum"),std::string(SCIDAC_CHECKSUM));
508class ScidacWriter :
public GridLimeWriter {
511 ScidacWriter(
bool isboss =
true ) : GridLimeWriter(isboss) { };
513 template<
class SerialisableUserFile>
514 void writeScidacFileRecord(GridBase *grid,SerialisableUserFile &_userFile)
516 scidacFile _scidacFile(grid);
517 if ( this->boss_node ) {
518 writeLimeObject(1,0,_scidacFile,_scidacFile.SerialisableClassName(),std::string(SCIDAC_PRIVATE_FILE_XML));
519 writeLimeObject(0,1,_userFile,_userFile.SerialisableClassName(),std::string(SCIDAC_FILE_XML));
525 template <
class vobj,
class userRecord>
526 void writeScidacFieldRecord(Lattice<vobj> &field,userRecord _userRecord,
527 const unsigned int recordScientificPrec = 0,
528 int control=BINARYIO_LEXICOGRAPHIC)
530 GridBase * grid = field.
Grid();
536 scidacRecord _scidacRecord;
537 scidacFile _scidacFile;
539 ScidacMetaData(field,
header,_scidacRecord,_scidacFile);
544 if ( this->boss_node ) {
545 writeLimeObject(1,0,
header ,std::string(
"FieldMetaData"),std::string(GRID_FORMAT));
546 writeLimeObject(0,0,_userRecord,_userRecord.SerialisableClassName(),std::string(SCIDAC_RECORD_XML), recordScientificPrec);
547 writeLimeObject(0,0,_scidacRecord,_scidacRecord.SerialisableClassName(),std::string(SCIDAC_PRIVATE_RECORD_XML));
550 writeLimeLatticeBinaryObject(field,std::string(ILDG_BINARY_DATA),control);
555class ScidacReader :
public GridLimeReader {
558 template<
class SerialisableUserFile>
559 void readScidacFileRecord(GridBase *grid,SerialisableUserFile &_userFile)
561 scidacFile _scidacFile(grid);
562 readLimeObject(_scidacFile,_scidacFile.SerialisableClassName(),std::string(SCIDAC_PRIVATE_FILE_XML));
563 readLimeObject(_userFile,_userFile.SerialisableClassName(),std::string(SCIDAC_FILE_XML));
568 template <
class vobj,
class userRecord>
569 void readScidacFieldRecord(Lattice<vobj> &field,userRecord &_userRecord,
570 int control=BINARYIO_LEXICOGRAPHIC)
572 typedef typename vobj::scalar_object sobj;
573 GridBase * grid = field.
Grid();
579 scidacRecord _scidacRecord;
580 scidacFile _scidacFile;
585 readLimeObject(
header ,std::string(
"FieldMetaData"),std::string(GRID_FORMAT));
586 readLimeObject(_userRecord,_userRecord.SerialisableClassName(),std::string(SCIDAC_RECORD_XML));
587 readLimeObject(_scidacRecord,_scidacRecord.SerialisableClassName(),std::string(SCIDAC_PRIVATE_RECORD_XML));
588 readLimeLatticeBinaryObject(field,std::string(ILDG_BINARY_DATA),control);
590 void skipPastBinaryRecord(
void) {
591 std::string rec_name(ILDG_BINARY_DATA);
592 while ( limeReaderNextRecord(LimeR) == LIME_SUCCESS ) {
593 if ( !strncmp(limeReaderType(LimeR), rec_name.c_str(),strlen(rec_name.c_str()) ) ) {
596 skipPastObjectRecord(std::string(SCIDAC_CHECKSUM));
601 void skipPastObjectRecord(std::string rec_name) {
602 while ( limeReaderNextRecord(LimeR) == LIME_SUCCESS ) {
603 if ( !strncmp(limeReaderType(LimeR), rec_name.c_str(),strlen(rec_name.c_str()) ) ) {
608 void skipScidacFieldRecord() {
609 skipPastObjectRecord(std::string(GRID_FORMAT));
610 skipPastObjectRecord(std::string(SCIDAC_RECORD_XML));
611 skipPastObjectRecord(std::string(SCIDAC_PRIVATE_RECORD_XML));
612 skipPastBinaryRecord();
617class IldgWriter :
public ScidacWriter {
620 IldgWriter(
bool isboss) : ScidacWriter(isboss) {};
625 void writeLimeIldgLFN(std::string &LFN)
627 uint64_t PayloadSize = LFN.size();
629 createLimeRecordHeader(ILDG_DATA_LFN, 1 , 1, PayloadSize);
630 err=limeWriteRecordData(
const_cast<char*
>(LFN.c_str()), &PayloadSize,LimeW); assert(err>=0);
631 err=limeWriterCloseRecord(LimeW); assert(err>=0);
639 template <
class stats = PeriodicGaugeStatistics,
class group_name = GroupName::SU, MatrixFormat matrix_fmt = MatrixFormat::FULL, FloatingPo
intFormat fp_fmt = FloatingPo
intFormat::IEEE64BIG,
class vobj>
640 void writeConfiguration(Lattice<vobj> &Umu,
int sequence, std::string LFN, std::string description)
642 GridBase * grid = Umu.
Grid();
645 static_assert( std::is_same_v<group_name, GroupName::SU> || (std::is_same_v<group_name, GroupName::Sp> &&
Nc%2==0),
"IldgWriter supports SU(Nc) and Sp(Nc=2k) lattices. For Sp fields Nc must be even" );
651 scidacRecord _scidacRecord;
652 scidacFile _scidacFile;
654 ScidacMetaData(Umu,
header,_scidacRecord,_scidacFile);
659 header.ensemble_id = description;
660 header.ensemble_label = description;
661 header.sequence_number = sequence;
667 const std::string stNC = std::to_string(
Nc ) ;
671 std::cout <<
GridLogMessage <<
"writing SU(" << stNC <<
") field" << std::endl;
672 ildgfmt.field = std::string(
"su"+stNC+
"gauge");
674 std::cout <<
GridLogMessage <<
"writing Sp(" << stNC <<
") field" << std::endl;
675 ildgfmt.field = std::string(
"sp"+stNC+
"gauge");
677 static_assert(1,
"Unrecognised group; unable to determine field tag");
682 ildgfmt.rows =
Nc-1 ;
684 ildgfmt.rows =
Nc/2 ;
688 static_assert(1,
"Unknown MatrixFormat specified");
693 header.floating_point = std::string(
"IEEE32BIG");
694 ildgfmt.precision = 32;
696 header.floating_point = std::string(
"IEEE64BIG");
697 ildgfmt.precision = 64;
699 static_assert(1,
"Unknown FloatingPointFormat specified");
702 ildgfmt.version = 1.2;
703 ildgfmt.lx =
header.dimension[0];
704 ildgfmt.ly =
header.dimension[1];
705 ildgfmt.lz =
header.dimension[2];
706 ildgfmt.lt =
header.dimension[3];
713 FieldNormMetaData FieldNormMetaData_;
714 FieldNormMetaData_.norm2 =
norm2(Umu);
721 info.plaq =
header.plaquette;
722 info.linktr =
header.link_trace;
728 writeLimeObject(1,0,
header ,std::string(
"FieldMetaData"),std::string(GRID_FORMAT));
729 writeLimeObject(0,0,FieldNormMetaData_,FieldNormMetaData_.SerialisableClassName(),std::string(GRID_FIELD_NORM));
730 writeLimeObject(0,0,_scidacFile,_scidacFile.SerialisableClassName(),std::string(SCIDAC_PRIVATE_FILE_XML));
731 writeLimeObject(0,1,info,info.SerialisableClassName(),std::string(SCIDAC_FILE_XML));
732 writeLimeObject(1,0,_scidacRecord,_scidacRecord.SerialisableClassName(),std::string(SCIDAC_PRIVATE_RECORD_XML));
733 writeLimeObject(0,0,info,info.SerialisableClassName(),std::string(SCIDAC_RECORD_XML));
734 writeLimeObject(0,0,ildgfmt,std::string(
"ildgFormat") ,std::string(ILDG_FORMAT));
735 writeLimeLatticeBinaryObject<vobj,group_name,matrix_fmt,fp_fmt>(Umu,std::string(ILDG_BINARY_DATA));
736 writeLimeIldgLFN(
header.ildg_lfn);
741class IldgReader :
public GridLimeReader {
755 template<
bool unique_su,
class vobj>
756 void readLatticeBinaryObject(Lattice<vobj> &Umu, std::string filename,
FloatingPointFormat fp_fmt,
MatrixFormat matrix_fmt,
bool is_grp_su,
bool is_grp_sp, uint64_t &offset, uint32_t &nersc_csum, uint32_t &scidac_csuma, uint32_t &scidac_csumb)
762 typedef typename vobj::scalar_object sobj;
773 format = std::string(
"IEEE64BIG");
775 GaugeSUmunger<dobjsuR,sobj,unique_su> munge;
778 GaugeSpmunger<dobjspR,sobj> munge;
781 GaugeSimpleMunger<dobj,sobj> munge;
785 format = std::string(
"IEEE32BIG");
787 GaugeSUmunger<fobjsuR,sobj,unique_su> munge;
790 GaugeSpmunger<fobjspR,sobj> munge;
793 GaugeSimpleMunger<fobj,sobj> munge;
796 }
else { assert(
"Unable to determine which readLatticeObject function template to instantiate."); }
807 template <
class stats = PeriodicGaugeStatistics,
bool unique_su = false,
class vobj>
808 void readConfiguration(Lattice<vobj> &Umu, FieldMetaData &FieldMetaData_) {
810 GridBase *grid = Umu.
Grid();
814 assert(dims.
size()==4);
817 ildgFormat ildgFormat_ ;
818 std::string ildgLFN_ ;
819 scidacChecksum scidacChecksum_;
820 usqcdInfo usqcdInfo_ ;
821 FieldNormMetaData FieldNormMetaData_;
824 int found_ildgFormat =0;
825 int found_ildgLFN =0;
826 int found_scidacChecksum=0;
827 int found_usqcdInfo =0;
828 int found_ildgBinary =0;
829 int found_FieldMetaData =0;
830 int found_FieldNormMetaData =0;
832 uint32_t scidac_csuma;
833 uint32_t scidac_csumb;
838 bool is_grp_su =
false;
839 bool is_grp_sp =
false;
854 while ( limeReaderNextRecord(LimeR) == LIME_SUCCESS ) {
856 uint64_t nbytes = limeReaderBytes(LimeR);
861 if ( strncmp(limeReaderType(LimeR), ILDG_BINARY_DATA,strlen(ILDG_BINARY_DATA) ) ) {
864 std::vector<char> xmlc(nbytes+1,
'\0');
865 limeReaderReadData((
void *)&xmlc[0], &nbytes, LimeR);
871 std::string xmlstring(&xmlc[0]);
872 if ( !strncmp(limeReaderType(LimeR), ILDG_FORMAT,strlen(ILDG_FORMAT)) ) {
878 pugi::xml_document doc;
879 doc.load_string(xmlstring.c_str());
881 if(doc.child(
"ildgFormat").child(
"rows")) {
882 std::string rows = doc.child(
"ildgFormat").child(
"rows").child_value();
883 std::cout <<
GridLogMessage <<
"<rows/> element present = " << rows <<
". So this lattice might be ildg 1.2 compliant." << std::endl;
885 std::cout <<
GridLogMessage <<
"<rows/> element not present - adding it after <field>." << std::endl;
886 pugi::xml_node ildgfmt = doc.child(
"ildgFormat");
887 const std::string stNC = std::to_string(
Nc);
888 ildgfmt.insert_child_after(
"rows", ildgfmt.child(
"field")).text().set(stNC.c_str());
891 std::ostringstream ss;
893 xmlstring = ss.str();
896 XmlReader RD(xmlstring,
true,
"");
897 read(RD,
"ildgFormat",ildgFormat_);
903 std::cout <<
GridLogMessage <<
"ildgFormat_.rows is " << ildgFormat_.rows << std::endl;
905 if( !strncmp(ildgFormat_.field.c_str(),
"su",2) ) { is_grp_su =
true; }
906 if( !strncmp(ildgFormat_.field.c_str(),
"sp",2) ) { is_grp_sp =
true; }
908 assert( is_grp_su || is_grp_sp );
912 assert( ildgFormat_.rows ==
Nc-1 );
915 assert( ildgFormat_.rows ==
Nc/2 );
918 assert( ildgFormat_.rows ==
Nc );
921 assert( ildgFormat_.lx == dims[0]);
922 assert( ildgFormat_.ly == dims[1]);
923 assert( ildgFormat_.lz == dims[2]);
924 assert( ildgFormat_.lt == dims[3]);
926 found_ildgFormat = 1;
929 if ( !strncmp(limeReaderType(LimeR), ILDG_DATA_LFN,strlen(ILDG_DATA_LFN)) ) {
930 FieldMetaData_.ildg_lfn = xmlstring;
934 if ( !strncmp(limeReaderType(LimeR), GRID_FORMAT,strlen(ILDG_FORMAT)) ) {
936 XmlReader RD(xmlstring,
true,
"");
937 read(RD,
"FieldMetaData",FieldMetaData_);
939 format = FieldMetaData_.floating_point;
941 assert(FieldMetaData_.dimension[0] == dims[0]);
942 assert(FieldMetaData_.dimension[1] == dims[1]);
943 assert(FieldMetaData_.dimension[2] == dims[2]);
944 assert(FieldMetaData_.dimension[3] == dims[3]);
946 found_FieldMetaData = 1;
949 if ( !strncmp(limeReaderType(LimeR), SCIDAC_RECORD_XML,strlen(SCIDAC_RECORD_XML)) ) {
951 if ( xmlstring.find(std::string(
"usqcdInfo")) != std::string::npos ) {
953 XmlReader RD(xmlstring,
true,
"");
954 read(RD,
"usqcdInfo",usqcdInfo_);
959 if ( !strncmp(limeReaderType(LimeR), SCIDAC_CHECKSUM,strlen(SCIDAC_CHECKSUM)) ) {
960 XmlReader RD(xmlstring,
true,
"");
961 read(RD,
"scidacChecksum",scidacChecksum_);
962 found_scidacChecksum = 1;
965 if ( !strncmp(limeReaderType(LimeR), GRID_FIELD_NORM,strlen(GRID_FIELD_NORM)) ) {
966 XmlReader RD(xmlstring,
true,
"");
967 read(RD,GRID_FIELD_NORM,FieldNormMetaData_);
968 found_FieldNormMetaData = 1;
977 uint64_t offset= ftello(File);
979 readLatticeBinaryObject<unique_su>(Umu, filename, fp_fmt, matrix_fmt, is_grp_su, is_grp_sp, offset, nersc_csum, scidac_csuma, scidac_csumb);
981 found_ildgBinary = 1;
990 assert(found_ildgLFN);
991 assert(found_ildgBinary);
992 assert(found_ildgFormat);
993 assert(found_scidacChecksum);
996 assert(found_FieldMetaData||found_ildgFormat);
998 if ( found_FieldMetaData ) {
1000 std::cout <<
GridLogMessage<<
"Grid MetaData record found: configuration was probably written by Grid ! Yay ! "<<std::endl;
1004 assert(found_ildgFormat);
1005 const std::string stNC = std::to_string(
Nc ) ;
1006 assert ( ildgFormat_.field == std::string(
"su"+stNC+
"gauge") );
1012 std::ostringstream vers; vers << ildgFormat_.version;
1013 FieldMetaData_.hdr_version = vers.str();
1014 FieldMetaData_.data_type = std::string(
"4D_SU"+stNC+
"_GAUGE_"+stNC+
"x"+stNC);
1016 FieldMetaData_.nd=4;
1017 FieldMetaData_.dimension.resize(4);
1019 FieldMetaData_.dimension[0] = ildgFormat_.lx ;
1020 FieldMetaData_.dimension[1] = ildgFormat_.ly ;
1021 FieldMetaData_.dimension[2] = ildgFormat_.lz ;
1022 FieldMetaData_.dimension[3] = ildgFormat_.lt ;
1024 if ( found_usqcdInfo ) {
1025 FieldMetaData_.plaquette = usqcdInfo_.plaq;
1026 FieldMetaData_.link_trace= usqcdInfo_.linktr;
1027 std::cout <<
GridLogMessage <<
"This configuration was probably written by USQCD "<<std::endl;
1028 std::cout <<
GridLogMessage <<
"USQCD xml record Plaquette : "<<FieldMetaData_.plaquette<<std::endl;
1029 std::cout <<
GridLogMessage <<
"USQCD xml record LinkTrace : "<<FieldMetaData_.link_trace<<std::endl;
1031 FieldMetaData_.plaquette = 0.0;
1032 FieldMetaData_.link_trace= 0.0;
1033 std::cout <<
GridLogWarning <<
"This configuration is unsafe with no plaquette records that can verify it !!! "<<std::endl;
1040 if ( found_FieldNormMetaData ) {
1042 GRID_FIELD_NORM_CHECK(FieldNormMetaData_,nn);
1043 std::cout <<
GridLogMessage<<
"FieldNormMetaData matches " << std::endl;
1045 std::cout <<
GridLogWarning<<
"FieldNormMetaData not found. " << std::endl;
1047 if ( found_scidacChecksum ) {
1048 FieldMetaData_.scidac_checksuma = stoull(scidacChecksum_.suma,0,16);
1049 FieldMetaData_.scidac_checksumb = stoull(scidacChecksum_.sumb,0,16);
1050 scidacChecksumVerify(scidacChecksum_,scidac_csuma,scidac_csumb);
1051 assert( scidac_csuma ==FieldMetaData_.scidac_checksuma);
1052 assert( scidac_csumb ==FieldMetaData_.scidac_checksumb);
1053 std::cout <<
GridLogMessage<<
"SciDAC checksums match " << std::endl;
1055 std::cout <<
GridLogWarning<<
"SciDAC checksums not found. This is unsafe. " << std::endl;
1059 if ( found_FieldMetaData || found_usqcdInfo ) {
1060 FieldMetaData checker;
1063 assert(fabs(checker.plaquette - FieldMetaData_.plaquette )<1.0e-5);
1064 assert(fabs(checker.link_trace - FieldMetaData_.link_trace)<1.0e-5);
1065 std::cout <<
GridLogMessage<<
"Plaquette and link trace match " << std::endl;
AcceleratorVector< int, MaxDims > Coordinate
RealD norm2(const Lattice< vobj > &arg)
GridLogger GridLogMessage(1, "Message", GridLogColours, "NORMAL")
GridLogger GridLogWarning(1, "Warning", GridLogColours, "YELLOW")
#define NAMESPACE_BEGIN(A)
iLorentzColourMatrix< ComplexD > LorentzColourMatrixD
iLorentzColourMatrix< ComplexF > LorentzColourMatrixF
accelerator_inline int isVector(void)
accelerator_inline int isScalar(void)
accelerator_inline int isMatrix(void)
accelerator_inline int indexRank(void)
accelerator_inline size_type size(void) const
static void writeLatticeObject(Lattice< vobj > &Umu, std::string file, munger munge, uint64_t offset, const std::string &format, uint32_t &nersc_csum, uint32_t &scidac_csuma, uint32_t &scidac_csumb, int control=BINARYIO_LEXICOGRAPHIC)
static void readLatticeObject(Lattice< vobj > &Umu, std::string file, munger munge, uint64_t offset, const std::string &format, uint32_t &nersc_csum, uint32_t &scidac_csuma, uint32_t &scidac_csumb, int control=BINARYIO_LEXICOGRAPHIC)
void Broadcast(int root, void *data, int bytes)
const Coordinate & FullDimensions(void)
GridBase * Grid(void) const
GridTypeMapper< scalar_type >::Realified real_scalar_type
void read(Reader< T > &r, const std::string &s, U &output)
void write(Writer< T > &w, const std::string &s, const U &output)