//
// Class H5Writer
// Interface for H5 writers.
//
// Copyright (c) 2019, Matthias Frey, Paul Scherrer Institut, Villigen PSI, Switzerland
// All rights reserved
//
// This file is part of OPAL.
//
// OPAL is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// You should have received a copy of the GNU General Public License
// along with OPAL. If not, see .
//
#include "H5Writer.h"
H5Writer::H5Writer(H5PartWrapper* h5wrapper, bool restart)
: H5PartTimer_m(IpplTimings::getTimer("Write H5-File"))
, h5wrapper_m(h5wrapper)
, H5call_m(0)
{
if ( !restart ) {
h5wrapper->writeHeader();
}
h5wrapper->close();
}
void H5Writer::writePhaseSpace(PartBunchBase *beam, Vector_t FDext[]) {
IpplTimings::startTimer(H5PartTimer_m);
std::map additionalAttributes = {
std::make_pair("B-ref_x", FDext[0](0)),
std::make_pair("B-ref_z", FDext[0](1)),
std::make_pair("B-ref_y", FDext[0](2)),
std::make_pair("E-ref_x", FDext[1](0)),
std::make_pair("E-ref_z", FDext[1](1)),
std::make_pair("E-ref_y", FDext[1](2))};
h5wrapper_m->writeStep(beam, additionalAttributes);
IpplTimings::stopTimer(H5PartTimer_m);
}
int H5Writer::writePhaseSpace(PartBunchBase *beam, Vector_t FDext[], double /*meanEnergy*/,
double refPr, double refPt, double refPz,
double refR, double refTheta, double refZ,
double azimuth, double elevation, bool /*local*/) {
if (beam->getTotalNum() < 3) return -1; // in single particle mode and tune calculation (2 particles) we do not need h5 data
IpplTimings::startTimer(H5PartTimer_m);
std::map additionalAttributes = {
std::make_pair("REFPR", refPr),
std::make_pair("REFPT", refPt),
std::make_pair("REFPZ", refPz),
std::make_pair("REFR", refR),
std::make_pair("REFTHETA", refTheta),
std::make_pair("REFZ", refZ),
std::make_pair("AZIMUTH", azimuth),
std::make_pair("ELEVATION", elevation),
std::make_pair("B-head_x", FDext[0](0)),
std::make_pair("B-head_z", FDext[0](1)),
std::make_pair("B-head_y", FDext[0](2)),
std::make_pair("E-head_x", FDext[1](0)),
std::make_pair("E-head_z", FDext[1](1)),
std::make_pair("E-head_y", FDext[1](2)),
std::make_pair("B-ref_x", FDext[2](0)),
std::make_pair("B-ref_z", FDext[2](1)),
std::make_pair("B-ref_y", FDext[2](2)),
std::make_pair("E-ref_x", FDext[3](0)),
std::make_pair("E-ref_z", FDext[3](1)),
std::make_pair("E-ref_y", FDext[3](2)),
std::make_pair("B-tail_x", FDext[4](0)),
std::make_pair("B-tail_z", FDext[4](1)),
std::make_pair("B-tail_y", FDext[4](2)),
std::make_pair("E-tail_x", FDext[5](0)),
std::make_pair("E-tail_z", FDext[5](1)),
std::make_pair("E-tail_y", FDext[5](2))};
h5wrapper_m->writeStep(beam, additionalAttributes);
IpplTimings::stopTimer(H5PartTimer_m);
++ H5call_m;
return H5call_m - 1;
}
void H5Writer::writePhaseSpace(EnvelopeBunch &/*beam*/, Vector_t FDext[],
double sposHead, double sposRef,
double sposTail)
{
// FIXME https://gitlab.psi.ch/OPAL/src/issues/245
IpplTimings::startTimer(H5PartTimer_m);
std::map additionalAttributes = {
std::make_pair("sposHead", sposHead),
std::make_pair("sposRef", sposRef),
std::make_pair("sposTail", sposTail),
std::make_pair("B-head_x", FDext[0](0)),
std::make_pair("B-head_z", FDext[0](1)),
std::make_pair("B-head_y", FDext[0](2)),
std::make_pair("E-head_x", FDext[1](0)),
std::make_pair("E-head_z", FDext[1](1)),
std::make_pair("E-head_y", FDext[1](2)),
std::make_pair("B-ref_x", FDext[2](0)),
std::make_pair("B-ref_z", FDext[2](1)),
std::make_pair("B-ref_y", FDext[2](2)),
std::make_pair("E-ref_x", FDext[3](0)),
std::make_pair("E-ref_z", FDext[3](1)),
std::make_pair("E-ref_y", FDext[3](2)),
std::make_pair("B-tail_x", FDext[4](0)),
std::make_pair("B-tail_z", FDext[4](1)),
std::make_pair("B-tail_y", FDext[4](2)),
std::make_pair("E-tail_x", FDext[5](0)),
std::make_pair("E-tail_z", FDext[5](1)),
std::make_pair("E-tail_y", FDext[5](2))};
// does not compile with that line --> should be fixed with https://gitlab.psi.ch/OPAL/src/issues/245
// h5wrapper_m->writeStep(&beam, additionalAttributes);
IpplTimings::stopTimer(H5PartTimer_m);
}
//FIXME https://gitlab.psi.ch/OPAL/src/issues/245
// void H5Writer::stashPhaseSpaceEnvelope(EnvelopeBunch &beam, Vector_t FDext[], double sposHead, double sposRef, double sposTail) {
//
// if (!doHDF5_m) return;
//
// /// Start timer.
// IpplTimings::startTimer(H5PartTimer_m);
//
// static_cast(h5wrapper_m)->stashPhaseSpaceEnvelope(beam,
// FDext,
// sposHead,
// sposRef,
// sposTail);
// H5call_m++;
//
// /// %Stop timer.
// IpplTimings::stopTimer(H5PartTimer_m);
// }
//
// void H5Writer::dumpStashedPhaseSpaceEnvelope() {
//
// if (!doHDF5_m) return;
//
// static_cast(h5wrapper_m)->dumpStashedPhaseSpaceEnvelope();
//
// /// %Stop timer.
// IpplTimings::stopTimer(H5PartTimer_m);
// }