diff --git a/Grid/parallelIO/BinaryIO.h b/Grid/parallelIO/BinaryIO.h index 6b0af46b..1895dc3e 100644 --- a/Grid/parallelIO/BinaryIO.h +++ b/Grid/parallelIO/BinaryIO.h @@ -210,10 +210,10 @@ PARALLEL_CRITICAL static inline void le32toh_v(void *file_object,uint64_t bytes) { uint32_t *fp = (uint32_t *)file_object; - uint32_t f; uint64_t count = bytes/sizeof(uint32_t); parallel_for(uint64_t i=0;i>8) | ((f&0xFF000000UL)>>24) ; @@ -235,10 +235,9 @@ PARALLEL_CRITICAL static inline void le64toh_v(void *file_object,uint64_t bytes) { uint64_t *fp = (uint64_t *)file_object; - uint64_t f,g; - uint64_t count = bytes/sizeof(uint64_t); parallel_for(uint64_t i=0;i>8) | ((f&0xFF000000UL)>>24) ; @@ -349,7 +348,8 @@ PARALLEL_CRITICAL int ieee32 = (format == std::string("IEEE32")); int ieee64big = (format == std::string("IEEE64BIG")); int ieee64 = (format == std::string("IEEE64")); - + assert(ieee64||ieee32|ieee64big||ieee32big); + assert((ieee64+ieee32+ieee64big+ieee32big)==1); ////////////////////////////////////////////////////////////////////////////// // Do the I/O ////////////////////////////////////////////////////////////////////////////// diff --git a/Grid/parallelIO/IldgIO.h b/Grid/parallelIO/IldgIO.h index 518a84a9..85800af0 100644 --- a/Grid/parallelIO/IldgIO.h +++ b/Grid/parallelIO/IldgIO.h @@ -46,6 +46,9 @@ extern "C" { namespace Grid { namespace QCD { +#define GRID_FIELD_NORM "FieldNormMetaData" +#define GRID_FIELD_NORM_CHECK(FieldNormMetaData_,n2ck) assert(fabs(FieldNormMetaData_.norm2 - n2ck < 1.0e-5 )); + ///////////////////////////////// // Encode word types as strings ///////////////////////////////// @@ -205,6 +208,7 @@ class GridLimeReader : public BinaryIO { { typedef typename vobj::scalar_object sobj; scidacChecksum scidacChecksum_; + FieldNormMetaData FieldNormMetaData_; uint32_t nersc_csum,scidac_csuma,scidac_csumb; std::string format = getFormatString(); @@ -233,21 +237,52 @@ class GridLimeReader : public BinaryIO { // std::cout << " ReadLatticeObject from offset "< munge; BinaryIO::readLatticeObject< vobj, sobj >(field, filename, munge, offset, format,nersc_csum,scidac_csuma,scidac_csumb); - std::cout << GridLogMessage << "SciDAC checksum A " << std::hex << scidac_csuma << std::dec << std::endl; - std::cout << GridLogMessage << "SciDAC checksum B " << std::hex << scidac_csumb << std::dec << std::endl; + std::cout << GridLogMessage << "SciDAC checksum A " << std::hex << scidac_csuma << std::dec << std::endl; + std::cout << GridLogMessage << "SciDAC checksum B " << std::hex << scidac_csumb << std::dec << std::endl; ///////////////////////////////////////////// // Insist checksum is next record ///////////////////////////////////////////// - readLimeObject(scidacChecksum_,std::string("scidacChecksum"),std::string(SCIDAC_CHECKSUM)); - + readScidacChecksum(scidacChecksum_,FieldNormMetaData_); ///////////////////////////////////////////// // Verify checksums ///////////////////////////////////////////// + if(FieldNormMetaData_.norm2 != 0.0){ + RealD n2ck = norm2(field); + // std::cout << GridLogMessage << "checking field norm: metadata "< xmlc(nbytes+1,'\0'); + limeReaderReadData((void *)&xmlc[0], &nbytes, LimeR); + std::string xmlstring = std::string(&xmlc[0]); + XmlReader RD(xmlstring, true, ""); + if ( !strncmp(limeReaderType(LimeR), field_norm_str.c_str(),strlen(field_norm_str.c_str()) ) ) { + // std::cout << "FieldNormMetaData "<IsBoss() ); + FieldNormMetaData FNMD; FNMD.norm2 = norm2(field); + //////////////////////////////////////////// // Create record header //////////////////////////////////////////// @@ -448,6 +485,7 @@ class GridLimeWriter : public BinaryIO checksum.suma= streama.str(); checksum.sumb= streamb.str(); if ( boss_node ) { + writeLimeObject(0,0,FNMD,std::string(GRID_FIELD_NORM),std::string(GRID_FIELD_NORM)); writeLimeObject(0,1,checksum,std::string("scidacChecksum"),std::string(SCIDAC_CHECKSUM)); } } @@ -625,6 +663,12 @@ class IldgWriter : public ScidacWriter { assert(header.nd==4); assert(header.nd==header.dimension.size()); + ////////////////////////////////////////////////////////////////////////////// + // Field norm tests + ////////////////////////////////////////////////////////////////////////////// + FieldNormMetaData FieldNormMetaData_; + FieldNormMetaData_.norm2 = norm2(Umu); + ////////////////////////////////////////////////////////////////////////////// // Fill the USQCD info field ////////////////////////////////////////////////////////////////////////////// @@ -633,11 +677,12 @@ class IldgWriter : public ScidacWriter { info.plaq = header.plaquette; info.linktr = header.link_trace; - std::cout << GridLogMessage << " Writing config; IldgIO "< munge; @@ -846,6 +898,13 @@ class IldgReader : public GridLimeReader { //////////////////////////////////////////////////////////// // Really really want to mandate a scidac checksum //////////////////////////////////////////////////////////// + if ( found_FieldNormMetaData ) { + RealD nn = norm2(Umu); + GRID_FIELD_NORM_CHECK(FieldNormMetaData_,nn); + std::cout << GridLogMessage<<"FieldNormMetaData matches " << std::endl; + } else { + std::cout << GridLogWarning<<"FieldNormMetaData not found. " << std::endl; + } if ( found_scidacChecksum ) { FieldMetaData_.scidac_checksuma = stoull(scidacChecksum_.suma,0,16); FieldMetaData_.scidac_checksumb = stoull(scidacChecksum_.sumb,0,16); diff --git a/Grid/parallelIO/MetaData.h b/Grid/parallelIO/MetaData.h index 55254786..4cc93d03 100644 --- a/Grid/parallelIO/MetaData.h +++ b/Grid/parallelIO/MetaData.h @@ -56,6 +56,10 @@ namespace Grid { //////////////////////////////////////////////////////////////////////////////// // header specification/interpretation //////////////////////////////////////////////////////////////////////////////// + class FieldNormMetaData : Serializable { + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(FieldNormMetaData, double, norm2); + }; class FieldMetaData : Serializable { public: diff --git a/tests/IO/Test_ildg_io.cc b/tests/IO/Test_ildg_io.cc index 55dd93b8..cb5efed2 100644 --- a/tests/IO/Test_ildg_io.cc +++ b/tests/IO/Test_ildg_io.cc @@ -53,7 +53,6 @@ int main (int argc, char ** argv) GridCartesian Fine(latt_size,simd_layout,mpi_layout); GridCartesian Coarse(clatt_size,simd_layout,mpi_layout); - GridParallelRNG pRNGa(&Fine); GridParallelRNG pRNGb(&Fine); GridSerialRNG sRNGa; @@ -94,6 +93,27 @@ int main (int argc, char ** argv) _IldgReader.close(); Umu_diff = Umu - Umu_saved; + std::cout <