50 h5_int64_t numFileAttributes = H5GetNumFileAttribs(
file_m);
52 const h5_size_t lengthAttributeName = 256;
53 char attributeName[lengthAttributeName];
54 h5_int64_t attributeType;
55 h5_size_t numAttributeElements;
56 std::set<std::string> attributeNames;
58 for (h5_int64_t i = 0; i < numFileAttributes; ++i) {
60 file_m, i, attributeName, lengthAttributeName, &attributeType,
61 &numAttributeElements));
63 attributeNames.insert(attributeName);
66 if (attributeNames.find(
"dump frequency") != attributeNames.end()) {
72 if (attributeNames.find(
"dPhiGlobal") != attributeNames.end()) {
78 if (attributeNames.find(
"nAutoPhaseCavities") != attributeNames.end()) {
81 h5_int64_t numAutoPhaseCavities = 0;
82 if (!H5HasFileAttrib(
file_m,
"nAutoPhaseCavities")
83 || H5ReadFileAttribInt64(
file_m,
"nAutoPhaseCavities", &numAutoPhaseCavities)
85 numAutoPhaseCavities = 0;
87 for (
long i = 0; i < numAutoPhaseCavities; ++i) {
88 std::string elementName =
"Cav-" + std::to_string(i + 1) +
"-name";
89 std::string elementPhase =
"Cav-" + std::to_string(i + 1) +
"-value";
95 opal->setMaxPhase(name, phase);
308 PartBunch_t* bunch,
const std::map<std::string, double>& additionalStepAttributes,
309 size_t particleContainerIndex) {
310 auto pc = bunch->getParticleContainer(particleContainerIndex);
311 double actPos = pc->get_sPos();
312 double t = bunch->
getT();
330 double meanEnergy = pc->getMeanKineticEnergy();
331 double energySpread = pc->getStdKineticEnergy();
333 / pc->getTotalCharge();
334 double sigma = ((xsigma[0] * xsigma[0]) + (xsigma[1] * xsigma[1]))
335 / (2.0 * pc->getMeanGammaZ() * I_0
336 * (geomvareps[0] * geomvareps[0] + geomvareps[1] * geomvareps[1]));
342 double charge = pc->getTotalCharge();
344 h5_int64_t numBunch = 1;
345 h5_int64_t SteptoLastInj = 0;
353 char const* OPALFlavour =
"opal-t";
396 additionalStepAttributes.at(
"B-ref_x"), additionalStepAttributes.at(
"B-ref_z"),
397 additionalStepAttributes.at(
"B-ref_y"));
399 additionalStepAttributes.at(
"E-ref_x"), additionalStepAttributes.at(
"E-ref_z"),
400 additionalStepAttributes.at(
"E-ref_y"));
404 }
catch (std::out_of_range& m) {
405 *ippl::Error << m.what() << endl;
408 "H5PartWrapperForPC::writeStepHeader",
"some additional step attribute not found");
415 auto pc = bunch->getParticleContainer(particleContainerIndex);
416 size_t numLocalParticles = pc->getLocalNum();
418 auto rViewDevice = pc->
R.getView();
419 auto rView = Kokkos::create_mirror_view(rViewDevice);
420 Kokkos::deep_copy(rView, rViewDevice);
423 std::vector<char> buffer(numLocalParticles *
sizeof(h5_float64_t));
425 h5_float64_t* f64buffer =
reinterpret_cast<h5_float64_t*
>(buffer_ptr);
426 h5_int64_t* i64buffer =
reinterpret_cast<h5_int64_t*
>(buffer_ptr);
427 h5_int32_t* i32buffer =
reinterpret_cast<h5_int32_t*
>(buffer_ptr);
429 for (
size_t i = 0; i < numLocalParticles; ++i)
430 f64buffer[i] = rView(i)(0);
433 for (
size_t i = 0; i < numLocalParticles; ++i)
434 f64buffer[i] = rView(i)(1);
437 for (
size_t i = 0; i < numLocalParticles; ++i)
438 f64buffer[i] = rView(i)(2);
441 auto pViewDevice = pc->P.getView();
442 auto pView = Kokkos::create_mirror_view(pViewDevice);
443 Kokkos::deep_copy(pView, pViewDevice);
445 for (
long unsigned i = 0; i < numLocalParticles; i++)
446 f64buffer[i] = pView(i)(0);
449 for (
size_t i = 0; i < numLocalParticles; ++i)
450 f64buffer[i] = pView(i)(1);
453 for (
size_t i = 0; i < numLocalParticles; ++i)
454 f64buffer[i] = pView(i)(2);
457 auto qViewDevice = pc->getQView();
458 auto qViewHost = Kokkos::create_mirror_view(qViewDevice);
459 Kokkos::deep_copy(qViewHost, qViewDevice);
461 const auto qmMode = pc->getQMStorageMode();
462 if (qmMode ==
decltype(qmMode)::Attributes) {
463 for (
size_t i = 0; i < numLocalParticles; ++i) {
464 f64buffer[i] = qViewHost(i);
467 for (
size_t i = 0; i < numLocalParticles; ++i) {
468 f64buffer[i] = qViewHost(0);
473 auto idViewDevice = bunch->getParticleContainer()->ID.getView();
474 auto idView = Kokkos::create_mirror_view(idViewDevice);
475 Kokkos::deep_copy(idView, idViewDevice);
477 for (
long unsigned i = 0; i < numLocalParticles; i++)
478 i64buffer[i] = idView(i);
481 auto binViewDevice = pc->Bin.getView();
482 auto binView = Kokkos::create_mirror_view(binViewDevice);
483 Kokkos::deep_copy(binView, binViewDevice);
485 for (
size_t i = 0; i < numLocalParticles; ++i)
486 i32buffer[i] = binView(i);
489 const int sp = pc->Sp;
490 for (
size_t i = 0; i < numLocalParticles; ++i)
495 auto EViewDevice = pc->E.getView();
496 auto EView = Kokkos::create_mirror_view(EViewDevice);
497 Kokkos::deep_copy(EView, EViewDevice);
499 for (
size_t i = 0; i < numLocalParticles; ++i)
500 f64buffer[i] = EView(i)(0);
503 for (
size_t i = 0; i < numLocalParticles; ++i)
504 f64buffer[i] = EView(i)(1);
507 for (
size_t i = 0; i < numLocalParticles; ++i)
508 f64buffer[i] = EView(i)(2);
511 auto BViewDevice = pc->B.getView();
512 auto BView = Kokkos::create_mirror_view(BViewDevice);
513 Kokkos::deep_copy(BView, BViewDevice);
515 for (
size_t i = 0; i < numLocalParticles; ++i)
516 f64buffer[i] = BView(i)(0);
519 for (
size_t i = 0; i < numLocalParticles; ++i)
520 f64buffer[i] = BView(i)(1);
523 for (
size_t i = 0; i < numLocalParticles; ++i)
524 f64buffer[i] = BView(i)(2);
530 if (Options::rhoDump) {
531 NDIndex<3> idx = bunch->getFieldLayout().getLocalNDIndex();
533 h5_err_t herr = H5Block3dSetView(
534 file_m, idx[0].min(), idx[0].max(), idx[1].min(), idx[1].max(), idx[2].min(),
536 reportOnError(herr, __FILE__, __LINE__);
538 std::unique_ptr<h5_float64_t[]> data(
539 new h5_float64_t[(idx[0].max() + 1) * (idx[1].max() + 1) * (idx[2].max() + 1)]);
542 // h5block uses the fortran convention of storing data:
543 // INTEGER, DIMENSION(2,3) :: a
544 // => {a(1,1), a(2,1), a(1,2), a(2,2), a(1,3), a(2,3)}
545 for (int i = idx[2].min(); i <= idx[2].max(); ++i) {
546 for (int j = idx[1].min(); j <= idx[1].max(); ++j) {
547 for (int k = idx[0].min(); k <= idx[0].max(); ++k) {
548 data[ii] = bunch->getRho(k, j, i);
553 herr = H5Block3dWriteScalarFieldFloat64(file_m, "rho", data.get());
554 reportOnError(herr, __FILE__, __LINE__);
557 herr = H5Block3dSetFieldOrigin(
558 file_m, "rho", (h5_float64_t)bunch->get_origin()(0),
559 (h5_float64_t)bunch->get_origin()(1), (h5_float64_t)bunch->get_origin()(2));
560 reportOnError(herr, __FILE__, __LINE__);
562 herr = H5Block3dSetFieldSpacing(
563 file_m, "rho", (h5_float64_t)bunch->get_hr()(0), (h5_float64_t)bunch->get_hr()(1),
564 (h5_float64_t)bunch->get_hr()(2));
565 reportOnError(herr, __FILE__, __LINE__);