#ifndef _WRITELATTICEPAR_H_ #define _WRITELATTICEPAR_H_ // Write the format {load,unload}_lattice #include // exit() #include #include #include #include #include #include #include #include #include #include #include #include #include #include CPS_START_NAMESPACE //---------------------------------------- // WriteLatticeParallel class // A modification to "WriteLattice" class to enable parallel writing class WriteLatticeParallel : public QioControl { // IoStyle provides a function IoStyle::store() // which determines Parallel or Serial storing private: // FPConv fpconv; int csum_pos; bool recon_row_3; const char *cname; bool UseParIO; public: LatticeHeader hd; public: // ctor for 2-step unloading WriteLatticeParallel() : QioControl(), cname("WriteLatticeParallel"){ #if TARGET != QCDOC setSerial(); #else setParallel(); #endif } // ctor containing unloading behavior WriteLatticeParallel(Lattice & lat, const char * filename, const FP_FORMAT dataFormat = FP_AUTOMATIC, const int recon_row_3 = 1) : QioControl(), cname("WriteLatticeParallel"){ #if TARGET != QCDOC setSerial(); #else setParallel(); #endif QioArg wt_arg(filename, dataFormat, recon_row_3); write(lat, wt_arg); } // ctor containing unloading behavior WriteLatticeParallel(Lattice & lat, const QioArg & wt_arg) : QioControl(), cname("WriteLatticeParallel"){ #if TARGET != QCDOC setSerial(); #else setParallel(); #endif write(lat, wt_arg); } ~WriteLatticeParallel() {} void setHeader(const char * EnsembleId, const char * EnsembleLabel, const int SequenceNumber) { hd.setHeader(EnsembleId, EnsembleLabel, SequenceNumber); } void write(Lattice & lat, const char * filename, const FP_FORMAT dataFormat = FP_AUTOMATIC, const int recon_row_3 = 1) { QioArg wt_arg(filename, dataFormat, recon_row_3); write(lat, wt_arg); } void write(Lattice & lat, const QioArg & wt_arg); public: inline void setParallel() { UseParIO = 1; } inline void setSerial() { #if 1 UseParIO = 0; #else const char * fname = "setSerial()"; VRB.Flow(cname,fname,"On non-QCDOC platform, setSerial() has no effect!\n"); #endif } inline int parIO() const { return UseParIO; } }; class WriteLatticeSerial : public WriteLatticeParallel { private: const char * cname; public: // ctor for 2-step unloading WriteLatticeSerial() : WriteLatticeParallel(), cname("WriteLatticeParallel") { setSerial(); } // ctor containing unloading behavior WriteLatticeSerial(Lattice & lat, const char * filename, const FP_FORMAT dataFormat = FP_AUTOMATIC, const int recon_row_3 = 1) : WriteLatticeParallel(), cname("WriteLatticeParallel") { setSerial(); write(lat, filename, dataFormat, recon_row_3); } // ctor containing unloading behavior WriteLatticeSerial(Lattice & lat, const QioArg & wt_arg) : WriteLatticeParallel(), cname("WriteLatticeParallel"){ setSerial(); write(lat, wt_arg); } ~WriteLatticeSerial() {} }; CPS_END_NAMESPACE #endif