22 const h5_int64_t H5TypesCHAR = H5_STRING_T;
23 const h5_int64_t H5TypesFLOAT = H5_FLOAT32_T;
24 const h5_int64_t H5TypesDOUBLE = H5_FLOAT64_T;
25 const h5_int64_t H5TypesINT32 = H5_INT32_T;
26 const h5_int64_t H5TypesINT64 = H5_INT64_T;
34 predecessorOPALFlavour_m(
"NOT SET"),
36 startedFromExistingFile_m(false)
44 predecessorOPALFlavour_m(
"NOT SET"),
46 startedFromExistingFile_m(true)
48 if (sourceFile.empty()) {
52 copyFile(sourceFile, restartStep, flags);
74 h5_prop_t props = H5CreateFileProp ();
76 h5_err_t h5err = H5SetPropFileMPIOCollective (props, &comm);
89 h5_int64_t nFormerlySavedAutoPhaseCavities = 0;
90 bool fileWasClosed = (
file_m == 0);
92 if (nAutoPhaseCavities == 0)
return;
93 if (fileWasClosed)
open(H5_O_APPENDONLY);
94 if (!H5HasFileAttrib(
file_m,
"nAutoPhaseCavities") ||
95 H5ReadFileAttribInt64(
file_m,
"nAutoPhaseCavities", &nFormerlySavedAutoPhaseCavities) != H5_SUCCESS) {
96 nFormerlySavedAutoPhaseCavities = 0;
98 if (nFormerlySavedAutoPhaseCavities == nAutoPhaseCavities) {
99 if (fileWasClosed)
close();
105 unsigned int elementNumber = 1;
108 for(; it <
end; ++ it, ++ elementNumber) {
109 if (elementNumber <= nFormerlySavedAutoPhaseCavities)
continue;
111 std::string nameAttributeName =
"Cav-" + std::to_string(elementNumber) +
"-name";
112 std::string valueAttributeName =
"Cav-" + std::to_string(elementNumber) +
"-value";
114 std::string elementName = (*it).first;
115 h5_float64_t elementPhase = (*it).second;
120 INFOMSG(
"Saved phases in the h5 file: "
121 << nameAttributeName <<
" -> " << elementName <<
" --- "
122 << valueAttributeName <<
" -> " << elementPhase <<
endl);
125 if (fileWasClosed)
close();
130 namespace fs = std::filesystem;
131 if (!fs::exists(sourceFile)) {
133 "source file '" + sourceFile +
"' does not exist");
137 h5_prop_t props = H5CreateFileProp ();
139 h5_err_t h5err = H5SetPropFileMPIOCollective (props, &comm);
144 h5_file_t source = H5OpenFile (sourceFile.c_str(), H5_O_RDONLY, props);
145 PAssert (source != (h5_file_t)H5_ERR);
147 h5_ssize_t numStepsInSource = H5GetNumSteps(source);
149 if (lastStep == -1 || lastStep >= numStepsInSource) {
152 char opalFlavour[128];
174 props = H5CreateFileProp ();
176 h5err = H5SetPropFileMPIOCollective (props, &comm);
178 source = H5OpenFile (sourceFileName.c_str(), H5_O_RDONLY, props);
179 PAssert (source != (h5_file_t)H5_ERR);
184 if (-lastStep > numStepsInSource) {
187 lastStep = numStepsInSource + lastStep;
198 fs::remove(sourceFileName);
206 h5_prop_t props = H5CreateFileProp ();
208 h5_err_t h5err = H5SetPropFileMPIOCollective (props, &comm);
213 h5_file_t source = H5OpenFile (sourceFile.c_str(), H5_O_RDONLY, props);
214 PAssert (source != (h5_file_t)H5_ERR);
216 h5_ssize_t numStepsInSource = H5GetNumSteps(source);
218 if (lastStep == -1 || lastStep >= numStepsInSource) {
221 char opalFlavour[128];
236 if (-lastStep > numStepsInSource) {
239 lastStep = numStepsInSource + lastStep;
269 std::ifstream source(sourceFile, std::ios::binary);
270 std::ofstream dest(
fileName_m, std::ios::binary);
272 std::istreambuf_iterator<char> begin_source(source);
273 std::istreambuf_iterator<char> end_source;
274 std::ostreambuf_iterator<char> begin_dest(dest);
275 std::copy(begin_source, end_source, begin_dest);
280 "H5PartWrapper::copyFile",
281 "could not copy file " + sourceFile);
285 "H5PartWrapper::copyFile",
286 "received message to throw exception from node 0");
293 h5_int64_t numFileAttributes = H5GetNumFileAttribs(source);
295 const h5_size_t lengthAttributeName = 256;
296 std::vector<char> attributeName(lengthAttributeName);
297 h5_int64_t attributeType;
298 h5_size_t numAttributeElements;
299 std::vector<char> buffer(256);
300 h5_float32_t *f32buffer =
nullptr;
301 h5_float64_t *f64buffer =
nullptr;
302 h5_int32_t *i32buffer =
nullptr;
303 h5_int64_t *i64buffer =
nullptr;
304 auto refreshTypedBuffers = [&]() {
306 f32buffer =
reinterpret_cast<h5_float32_t*
>(buffer_ptr);
307 f64buffer =
reinterpret_cast<h5_float64_t*
>(buffer_ptr);
308 i32buffer =
reinterpret_cast<h5_int32_t*
>(buffer_ptr);
309 i64buffer =
reinterpret_cast<h5_int64_t*
>(buffer_ptr);
311 refreshTypedBuffers();
313 for (h5_int64_t i = 0; i < numFileAttributes; ++ i) {
316 attributeName.data(),
319 &numAttributeElements));
321 if (attributeType == H5_STRING_T) {
322 if (buffer.size() < numAttributeElements) {
323 buffer.resize(numAttributeElements);
324 refreshTypedBuffers();
330 }
else if (attributeType == H5_FLOAT32_T) {
331 if (buffer.size() < numAttributeElements *
sizeof(h5_float32_t)) {
332 buffer.resize(numAttributeElements *
sizeof(h5_float32_t));
333 refreshTypedBuffers();
339 }
else if (attributeType == H5_FLOAT64_T) {
340 if (buffer.size() < numAttributeElements *
sizeof(h5_float64_t)) {
341 buffer.resize(numAttributeElements *
sizeof(h5_float64_t));
342 refreshTypedBuffers();
348 }
else if (attributeType == H5_INT32_T) {
349 if (buffer.size() < numAttributeElements *
sizeof(h5_int32_t)) {
350 buffer.resize(numAttributeElements *
sizeof(h5_int32_t));
351 refreshTypedBuffers();
357 }
else if (attributeType == H5_INT64_T) {
358 if (buffer.size() < numAttributeElements *
sizeof(h5_int64_t)) {
359 buffer.resize(numAttributeElements *
sizeof(h5_int64_t));
360 refreshTypedBuffers();
368 "unknown data type: " + std::to_string(attributeType));
387 h5_int64_t numStepAttributes = H5GetNumStepAttribs(source);
389 h5_size_t lengthAttributeName = 256;
390 std::vector<char> attributeName(lengthAttributeName);
391 h5_int64_t attributeType;
392 h5_size_t numAttributeElements;
394 std::vector<char> buffer(256);
395 h5_float32_t *f32buffer =
nullptr;
396 h5_float64_t *f64buffer =
nullptr;
397 h5_int32_t *i32buffer =
nullptr;
398 h5_int64_t *i64buffer =
nullptr;
399 auto refreshTypedBuffers = [&]() {
401 f32buffer =
reinterpret_cast<h5_float32_t*
>(buffer_ptr);
402 f64buffer =
reinterpret_cast<h5_float64_t*
>(buffer_ptr);
403 i32buffer =
reinterpret_cast<h5_int32_t*
>(buffer_ptr);
404 i64buffer =
reinterpret_cast<h5_int64_t*
>(buffer_ptr);
406 refreshTypedBuffers();
411 for (h5_int64_t i = 0; i < numStepAttributes; ++ i) {
414 attributeName.data(),
417 &numAttributeElements));
419 if (attributeType == H5TypesCHAR) {
420 if (buffer.size() < numAttributeElements) {
421 buffer.resize(numAttributeElements);
422 refreshTypedBuffers();
428 }
else if (attributeType == H5TypesFLOAT) {
429 if (buffer.size() < numAttributeElements *
sizeof(h5_float32_t)) {
430 buffer.resize(numAttributeElements *
sizeof(h5_float32_t));
431 refreshTypedBuffers();
437 }
else if (attributeType == H5TypesDOUBLE) {
438 if (buffer.size() < numAttributeElements *
sizeof(h5_float64_t)) {
439 buffer.resize(numAttributeElements *
sizeof(h5_float64_t));
440 refreshTypedBuffers();
446 }
else if (attributeType == H5TypesINT32) {
447 if (buffer.size() < numAttributeElements *
sizeof(h5_int32_t)) {
448 buffer.resize(numAttributeElements *
sizeof(h5_int32_t));
449 refreshTypedBuffers();
455 }
else if (attributeType == H5TypesINT64) {
456 if (buffer.size() < numAttributeElements *
sizeof(h5_int64_t)) {
457 buffer.resize(numAttributeElements *
sizeof(h5_int64_t));
458 refreshTypedBuffers();
466 "unknown data type: " + std::to_string(attributeType));
474 h5_size_t lengthSetName = 256;
475 std::vector<char> setName(lengthSetName);
477 h5_size_t numSetElements;
479 h5_ssize_t numParticles = H5PartGetNumParticles(source);
482 h5_ssize_t firstParticle = numParticlesPerNode *
Ippl::myNode();
483 h5_ssize_t lastParticle = firstParticle + numParticlesPerNode - 1;
485 lastParticle = numParticles - 1;
487 REPORTONERROR(H5PartSetView(source, firstParticle, lastParticle));
489 numParticles = lastParticle - firstParticle + 1;
492 std::vector<char> buffer(numParticles *
sizeof(h5_float64_t));
494 h5_float32_t *f32buffer =
reinterpret_cast<h5_float32_t*
>(buffer_ptr);
495 h5_float64_t *f64buffer =
reinterpret_cast<h5_float64_t*
>(buffer_ptr);
496 h5_int32_t *i32buffer =
reinterpret_cast<h5_int32_t*
>(buffer_ptr);
497 h5_int64_t *i64buffer =
reinterpret_cast<h5_int64_t*
>(buffer_ptr);
499 h5_ssize_t numDatasets = H5PartGetNumDatasets(source);
501 for (h5_ssize_t i = 0; i < numDatasets; ++ i) {
502 REPORTONERROR(H5PartGetDatasetInfo(source, i, setName.data(), lengthSetName, &setType, &numSetElements));
504 if (setType == H5TypesFLOAT) {
505 READDATA(Float32, source, setName.data(), f32buffer);
507 }
else if (setType == H5TypesDOUBLE) {
508 READDATA(Float64, source, setName.data(), f64buffer);
510 }
else if (setType == H5TypesINT32) {
511 READDATA(Int32, source, setName.data(), i32buffer);
513 }
else if (setType == H5TypesINT64) {
514 READDATA(Int64, source, setName.data(), i64buffer);
518 "unknown data type: " + std::to_string(setType));
522 numParticles = H5PartGetNumParticles(
file_m);
527 const std::string &
where,
528 const std::string &what) {
539 const std::string &
where,
540 const std::string &what) {
557 h5_ssize_t numParticles = H5PartGetNumParticles(
file_m);
PartBunchBase< T, Dim >::ConstIterator end(PartBunchBase< T, Dim > const &bunch)
#define WRITESTRINGFILEATTRIB(file, name, value)
#define WRITESTEPATTRIB(type, file, name, value, length)
#define REPORTONERROR(rc)
#define READSTEPATTRIB(type, file, name, value)
#define WRITEDATA(type, file, name, value)
#define WRITEFILEATTRIB(type, file, name, value, length)
#define WRITESTRINGSTEPATTRIB(file, name, value)
#define READDATA(type, file, name, value)
#define READFILEATTRIB(type, file, name, value)
void putMessage(Message &m, const T &t)
void getMessage(Message &m, T &t)
Inform & endl(Inform &inf)
PETE_TTTree< OpWhere, typename Cond_t::PETE_Expr_t, typename True_t::PETE_Expr_t, PETE_Scalar< Vektor< T, Dim > > > where(const PETE_Expr< Cond_t > &c, const PETE_Expr< True_t > &t, const Vektor< T, Dim > &f)
T * c_data(std::vector< T, A > &v)
int getNumberOfMaxPhases()
std::vector< MaxPhasesT >::iterator getLastMaxPhases()
std::vector< MaxPhasesT >::iterator getFirstMaxPhases()
static OpalData * getInstance()
size_t getNumParticles() const
void receiveFailureMessage(int sourceNode, const std::string &where, const std::string &what)
void copyStepData(h5_file_t source)
void copyFile(const std::string &sourceFile, int lastStep=-1, h5_int32_t flags=H5_O_WRONLY)
void open(h5_int32_t flags)
void copyFileSystem(const std::string &sourceFile)
H5PartWrapper(const std::string &fileName, h5_int32_t flags=H5_O_WRONLY)
void copyHeader(h5_file_t source)
std::string predecessorOPALFlavour_m
void storeCavityInformation()
void copyStepHeader(h5_file_t source)
void copyStep(h5_file_t source, int step)
static std::string copyFilePrefix_m
void sendFailureMessage(bool failed, const std::string &where, const std::string &what)
The base class for all OPAL exceptions.
Message * receive_block(int &node, int &tag)
virtual int broadcast_all(Message *, int)
static MPI_Comm getComm()
static Communicate * Comm