#ifndef OPAL_LOSSOUTPUT_H_ #define OPAL_LOSSOUTPUT_H_ ////////////////////////////////////////////////////////////// //#include "Ippl.h" #include "Utility/IpplInfo.h" #include //#include #include #include //#include #include "AbstractObjects/OpalData.h" #include #include "H5hut.h" #include "config.h" #define MAXLOSS 1000000 ////////////////////////////////////////////////////////////// // specialization of LossDataSink to PPartBunch objects class LossDataSink { public: LossDataSink(size_t np, bool hdf5Save = false): element_m("NULL"), doHdf5Save_m(hdf5Save) { if(!doHdf5Save_m) { fn_m = OpalData::getInstance()->getInputBasename() + std::string(".loss"); os_m.precision(8); os_m.setf(std::ios::scientific, std::ios::floatfield); if(OpalData::getInstance()->inRestartRun()) append(); else open(); writeHeader(np); close(); } hdf5FileIsOpen_m = false; H5call_m = 0; } LossDataSink(): element_m("NULL") { if(!doHdf5Save_m) { fn_m = OpalData::getInstance()->getInputBasename() + std::string(".loss"); os_m.precision(8); os_m.setf(std::ios::scientific, std::ios::floatfield); append(); } hdf5FileIsOpen_m = false; H5call_m = 0; } ~LossDataSink() { save(element_m); if(!doHdf5Save_m) { close(); } else { if(hdf5FileIsOpen_m) { H5CloseFile(H5file_m); Ippl::Comm->barrier(); } } } bool inH5Mode() { return doHdf5Save_m;} private: void open() { if(Ippl::myNode() == 0) { os_m.open(fn_m.c_str(), std::ios::out); } } void append() { if(Ippl::myNode() == 0) { os_m.open(fn_m.c_str(), std::ios::app); } } void close() { if(Ippl::myNode() == 0) os_m.close(); } void writeHeader(size_t np) { if(Ippl::myNode() == 0) { os_m << "# Element x (mm), y (mm), z (mm), px ( ), py ( ), pz ( ), id, turn, time (ns) " << std::endl; } } void writeH5FileAttributes(); public: void addParticle(const Vector_t x, const Vector_t p, const size_t id); void addParticle_time(const Vector_t x, const Vector_t p, const size_t id, const double time, const size_t turn); void openH5(std::string fn); void save(std::string element) ; void save_time(std::string element) ; private: // filename without extension std::string fn_m; // used to write out the data std::ofstream os_m; std::string element_m; bool doHdf5Save_m; bool hdf5FileIsOpen_m; /// %Pointer to H5 file for particle data. h5_file_t *H5file_m; /// Current record, or time step, of H5 file. h5_int64_t H5call_m; std::vector id_m; std::vector x_m; std::vector y_m; std::vector z_m; std::vector px_m; std::vector py_m; std::vector pz_m; std::vector turn_m; std::vector time_m; }; #endif