14 #include <boost/filesystem.hpp>
21 previousH5Local_m(false),
22 referenceMomentum_m(0.0),
23 referenceLocation_m(0.0),
32 std::string sourceFile,
35 previousH5Local_m(false),
36 referenceMomentum_m(0.0),
37 referenceLocation_m(0.0),
48 h5_int64_t numFileAttributes = H5GetNumFileAttribs(
file_m);
50 const h5_size_t lengthAttributeName = 256;
51 char attributeName[lengthAttributeName];
52 h5_int64_t attributeType;
53 h5_size_t numAttributeElements;
54 std::set<std::string> attributeNames;
56 for (h5_int64_t i = 0; i < numFileAttributes; ++ i) {
62 &numAttributeElements));
64 attributeNames.insert(attributeName);
67 if (attributeNames.find(
"dump frequency") != attributeNames.end()) {
75 h5_ssize_t firstParticle,
76 h5_ssize_t lastParticle)
78 h5_ssize_t numStepsInSource = H5GetNumSteps(
file_m);
79 h5_ssize_t
readStep = numStepsInSource - 1;
87 h5_float64_t pathLength;
103 bunch->
setT(actualT);
105 h5_int64_t SteptoLastInj;
125 h5_int64_t localDump = 0;
126 h5_int64_t rc = H5ReadStepAttribInt64(
file_m,
"LOCAL", &localDump);
127 if(rc != H5_SUCCESS) {
129 ERRORMSG(
"H5 rc= " << rc <<
" in " << __FILE__ <<
" @ line " << __LINE__ <<
endl);
131 std::string errormsg =
132 "You are trying to restart from a legacy file that doesn't contain"
133 "information on local/global frame. We are working on legacy support,"
134 "but for now you have to use OPAL 1.3.0!";
136 throw OpalException(
"H5PartWrapperForPC::readStepHeader", errormsg);
145 double mass = bunch->
getM() * 1
e-6;
150 h5_ssize_t firstParticle,
151 h5_ssize_t lastParticle)
154 if (lastParticle >= numParticles || firstParticle > lastParticle) {
156 "the provided particle numbers don't match the number of particles in the file");
163 numParticles = lastParticle - firstParticle + 1;
165 std::vector<char> buffer(numParticles *
sizeof(h5_float64_t));
166 h5_float64_t *f64buffer =
reinterpret_cast<h5_float64_t*
>(&buffer[0]);
169 for(
long int n = 0;
n < numParticles; ++
n) {
170 bunch->
R[
n](0) = f64buffer[
n];
175 for(
long int n = 0;
n < numParticles; ++
n) {
176 bunch->
R[
n](yIndex) = f64buffer[
n];
180 for(
long int n = 0;
n < numParticles; ++
n) {
181 bunch->
R[
n](zIndex) = f64buffer[
n];
185 for(
long int n = 0;
n < numParticles; ++
n) {
186 bunch->
P[
n](0) = f64buffer[
n];
190 for(
long int n = 0;
n < numParticles; ++
n) {
191 bunch->
P[
n](yIndex) = f64buffer[
n];
195 for(
long int n = 0;
n < numParticles; ++
n) {
196 bunch->
P[
n](zIndex) = f64buffer[
n];
200 for(
long int n = 0;
n < numParticles; ++
n) {
201 bunch->
Q[
n] = f64buffer[
n];
205 for(
long int n = 0;
n < numParticles; ++
n) {
206 bunch->
M[
n] = f64buffer[
n];
210 std::vector<char> ibuffer(numParticles *
sizeof(h5_int64_t));
211 h5_int64_t *i64buffer =
reinterpret_cast<h5_int64_t*
>(&ibuffer[0]);
213 for(
long int n = 0;
n < numParticles; ++
n) {
214 bunch->
Bin[
n] = i64buffer[
n];
218 std::vector<char> ibuffer(numParticles *
sizeof(h5_int64_t));
219 h5_int64_t *i64buffer =
reinterpret_cast<h5_int64_t*
>(&ibuffer[0]);
221 for(
long int n = 0;
n < numParticles; ++
n) {
229 std::stringstream OPAL_version;
315 const std::map<std::string, double> &additionalStepAttributes)
319 open(H5_O_APPENDONLY);
328 const std::map<std::string, double> &additionalStepAttributes)
332 double t = bunch->
getT();
333 double pathLength = bunch->
get_sPos();
349 double energySpread = bunch->
getdE();
351 double sigma = ((xsigma[0] * xsigma[0]) + (xsigma[1] * xsigma[1])) /
352 (2.0 * bunch->
get_gamma() * I_0 * (geomvareps[0] * geomvareps[0] + geomvareps[1] * geomvareps[1]));
357 h5_int64_t numBunch = (h5_int64_t)bunch->
getNumBunch();
360 double mass = 1.0e-9 * bunch->
getM();
365 double sposHead = 0.0;
366 double sposRef = 0.0;
367 double sposTail = 0.0;
375 char const *OPALFlavour =
"opal-cycl";
412 h5_float64_t refpr = additionalStepAttributes.at(
"REFPR");
413 h5_float64_t refpt = additionalStepAttributes.at(
"REFPT");
414 h5_float64_t refpz = additionalStepAttributes.at(
"REFPZ");
415 h5_float64_t refr = additionalStepAttributes.at(
"REFR");
416 h5_float64_t reft = additionalStepAttributes.at(
"REFTHETA");
417 h5_float64_t refz = additionalStepAttributes.at(
"REFZ");
418 h5_float64_t azimuth = additionalStepAttributes.at(
"AZIMUTH");
419 h5_float64_t elevation = additionalStepAttributes.at(
"ELEVATION");
421 Vector_t referenceB(additionalStepAttributes.at(
"B-ref_x"),
422 additionalStepAttributes.at(
"B-ref_z"),
423 additionalStepAttributes.at(
"B-ref_y"));
424 Vector_t referenceE(additionalStepAttributes.at(
"E-ref_x"),
425 additionalStepAttributes.at(
"E-ref_z"),
426 additionalStepAttributes.at(
"E-ref_y"));
427 Vector_t headB(additionalStepAttributes.at(
"B-head_x"),
428 additionalStepAttributes.at(
"B-head_z"),
429 additionalStepAttributes.at(
"B-head_y"));
430 Vector_t headE(additionalStepAttributes.at(
"E-head_x"),
431 additionalStepAttributes.at(
"E-head_z"),
432 additionalStepAttributes.at(
"E-head_y"));
433 Vector_t tailB(additionalStepAttributes.at(
"B-tail_x"),
434 additionalStepAttributes.at(
"B-tail_z"),
435 additionalStepAttributes.at(
"B-tail_y"));
436 Vector_t tailE(additionalStepAttributes.at(
"E-tail_x"),
437 additionalStepAttributes.at(
"E-tail_z"),
438 additionalStepAttributes.at(
"E-tail_y"));
459 }
catch (std::out_of_range & m) {
463 "some additional step attribute not found");
478 for(
size_t k = 0; k < IDZero; ++ k) {
479 if (bunch->
ID[k] == 0) {
486 const size_t skipID = IDZero;
488 std::vector<char> buffer(numLocalParticles *
sizeof(h5_float64_t));
489 h5_float64_t *f64buffer =
reinterpret_cast<h5_float64_t*
>(&buffer[0]);
490 h5_int64_t *i64buffer =
reinterpret_cast<h5_int64_t*
> (&buffer[0]);
495 for(
size_t i = 0; i < skipID; ++ i)
496 f64buffer[i] = bunch->
R[i](0);
497 for (
size_t i = skipID; i < numLocalParticles; ++ i)
498 f64buffer[i] = bunch->
R[i + 1](0);
502 for(
size_t i = 0; i < skipID; ++ i)
503 f64buffer[i] = bunch->
R[i](1);
504 for (
size_t i = skipID; i < numLocalParticles; ++ i)
505 f64buffer[i] = bunch->
R[i + 1](1);
509 for(
size_t i = 0; i < skipID; ++ i)
510 f64buffer[i] = bunch->
R[i](2);
511 for (
size_t i = skipID; i < numLocalParticles; ++ i)
512 f64buffer[i] = bunch->
R[i + 1](2);
516 for(
size_t i = 0; i < skipID; ++ i)
517 f64buffer[i] = bunch->
P[i](0);
518 for (
size_t i = skipID; i < numLocalParticles; ++ i)
519 f64buffer[i] = bunch->
P[i + 1](0);
523 for(
size_t i = 0; i < skipID; ++ i)
524 f64buffer[i] = bunch->
P[i](1);
525 for (
size_t i = skipID; i < numLocalParticles; ++ i)
526 f64buffer[i] = bunch->
P[i + 1](1);
530 for(
size_t i = 0; i < skipID; ++ i)
531 f64buffer[i] = bunch->
P[i](2);
532 for (
size_t i = skipID; i < numLocalParticles; ++ i)
533 f64buffer[i] = bunch->
P[i + 1](2);
537 for(
size_t i = 0; i < skipID; ++ i)
538 f64buffer[i] = bunch->
Q[i];
539 for (
size_t i = skipID; i < numLocalParticles; ++ i)
540 f64buffer[i] = bunch->
Q[i + 1];
544 for(
size_t i = 0; i < skipID; ++ i)
545 f64buffer[i] = bunch->
M[i];
546 for (
size_t i = skipID; i < numLocalParticles; ++ i)
547 f64buffer[i] = bunch->
M[i + 1];
551 for(
size_t i = 0; i < skipID; ++ i)
552 i64buffer[i] = bunch->
ID[i];
553 for (
size_t i = skipID; i < numLocalParticles; ++ i)
554 i64buffer[i] = bunch->
ID[i + 1];
559 for(
size_t i = 0; i < skipID; ++ i)
560 i64buffer[i] = bunch->
Bin[i];
561 for (
size_t i = skipID; i < numLocalParticles; ++ i)
562 i64buffer[i] = bunch->
Bin[i + 1];
567 for (
size_t i = 0; i < skipID; ++ i)
569 for (
size_t i = skipID; i < numLocalParticles; ++ i)
570 i64buffer[i] = bunch->
bunchNum[i + 1];
574 for(
size_t i = 0; i < skipID; ++ i)
575 f64buffer[i] = bunch->
Ef[i](0);
576 for (
size_t i = skipID; i < numLocalParticles; ++ i)
577 f64buffer[i] = bunch->
Ef[i + 1](0);
581 for(
size_t i = 0; i < skipID; ++ i)
582 f64buffer[i] = bunch->
Ef[i](1);
583 for (
size_t i = skipID; i < numLocalParticles; ++ i)
584 f64buffer[i] = bunch->
Ef[i + 1](1);
588 for(
size_t i = 0; i < skipID; ++ i)
589 f64buffer[i] = bunch->
Ef[i](2);
590 for (
size_t i = skipID; i < numLocalParticles; ++ i)
591 f64buffer[i] = bunch->
Ef[i + 1](2);
595 for(
size_t i = 0; i < skipID; ++ i)
596 f64buffer[i] = bunch->
Bf[i](0);
597 for (
size_t i = skipID; i < numLocalParticles; ++ i)
598 f64buffer[i] = bunch->
Bf[i + 1](0);
602 for(
size_t i = 0; i < skipID; ++ i)
603 f64buffer[i] = bunch->
Bf[i](1);
604 for (
size_t i = skipID; i < numLocalParticles; ++ i)
605 f64buffer[i] = bunch->
Bf[i + 1](1);
609 for(
size_t i = 0; i < skipID; ++ i)
610 f64buffer[i] = bunch->
Bf[i](2);
611 for (
size_t i = skipID; i < numLocalParticles; ++ i)
612 f64buffer[i] = bunch->
Bf[i + 1](2);
623 idx[0].
min(), idx[0].
max(),
624 idx[1].
min(), idx[1].
max(),
625 idx[2].
min(), idx[2].
max()));
627 std::unique_ptr<h5_float64_t[]> data(
new h5_float64_t[(idx[0].
max() + 1) * (idx[1].
max() + 1) * (idx[2].
max() + 1)]);
633 for(
int i = idx[2].
min(); i <= idx[2].max(); ++ i) {
634 for(
int j = idx[1].
min(); j <= idx[1].max(); ++ j) {
635 for(
int k = idx[0].
min(); k <= idx[0].max(); ++ k) {
636 data[ii] = bunch->
getRho(k, j, i);
650 (h5_float64_t)bunch->
get_hr()(0),
651 (h5_float64_t)bunch->
get_hr()(1),
652 (h5_float64_t)bunch->
get_hr()(2)));
void writeStepHeader(PartBunchBase< double, 3 > *, const std::map< std::string, double > &)
ParticleAttrib< Vector_t > P
void open(h5_int32_t flags)
constexpr double e
The value of .
ParticleAttrib< Vector_t > Ef
long long getLocalTrackStep() const
T::PETE_Expr_t::PETE_Return_t max(const PETE_Expr< T > &expr, NDIndex< D > &loc)
The base class for all OPAL exceptions.
virtual void readHeader()
ParticleAttrib< double > Q
Vector_t get_rrms() const
void writeStepData(PartBunchBase< double, 3 > *)
double get_meanKineticEnergy() const
void setLocalTrackStep(long long n)
step in a TRACK command
ParticleAttrib< short > bunchNum
#define WRITEDATA(type, file, name, value)
std::string predecessorOPALFlavour_m
Vector_t get_emit() const
Vector_t referenceMomentum_m
Vector_t referenceLocation_m
#define REPORTONERROR(rc)
size_t getTotalNum() const
virtual void writeHeader()
Vector_t get_prms() const
#define WRITESTRINGSTEPATTRIB(file, name, value)
h5_float64_t meanMomentum_m
Vector_t get_rmean() const
static OpalData * getInstance()
virtual void writeStep(PartBunchBase< double, 3 > *, const std::map< std::string, double > &additionalStepAttributes)
#define OPAL_PROJECT_NAME
void calcBeamParameters()
Vector_t get_pmean() const
Vector_t get_maxExtent() const
virtual void readStep(PartBunchBase< double, 3 > *, h5_ssize_t firstParticle, h5_ssize_t lastParticle)
void setRestartDumpFreq(const int &N)
set the dump frequency as found in restart file
constexpr double pi
The value of .
constexpr double c
The velocity of light in m/s.
void get_PBounds(Vector_t &min, Vector_t &max) const
Vector_t get_norm_emit() const
#define OPAL_PROJECT_VERSION
Tps< T > pow(const Tps< T > &x, int y)
Integer power.
Vector_t get_origin() const
virtual FieldLayout_t & getFieldLayout()=0
size_t getLocalNum() const
#define WRITESTEPATTRIB(type, file, name, value, length)
Vector_t get_centroid() const
Tps< T > sqrt(const Tps< T > &x)
Square root.
H5PartWrapperForPC(const std::string &fileName, h5_int32_t flags=H5_O_WRONLY)
int psDumpFreq
The frequency to dump the phase space, i.e.dump data when steppsDumpFreq==0.
double getCharge() const
get the total charge per simulation particle
#define READSTEPATTRIB(type, file, name, value)
short getNumBunch() const
DumpFrame psDumpFrame
flag to decide in which coordinate frame the phase space will be dumped for OPAL-cycl ...
virtual ~H5PartWrapperForPC()
virtual Vector_t get_hr() const
void readStepHeader(PartBunchBase< double, 3 > *)
void setNumBunch(short n)
double getQ() const
Access to reference data.
ParticleAttrib< int > Bin
std::string getGitRevision()
#define WRITEFILEATTRIB(type, file, name, value, length)
constexpr double epsilon_0
The permittivity of vacuum in As/Vm.
ParticleAttrib< Vector_t > Bf
ParticleAttrib< double > M
virtual double getRho(int x, int y, int z)=0
#define READDATA(type, file, name, value)
size_t getNumParticles() const
NDIndex< Dim > getLocalNDIndex()
T::PETE_Expr_t::PETE_Return_t min(const PETE_Expr< T > &expr, NDIndex< D > &loc)
#define READFILEATTRIB(type, file, name, value)
Inform & endl(Inform &inf)
#define WRITESTRINGFILEATTRIB(file, name, value)
void setGlobalTrackStep(long long n)
step in multiple TRACK commands
void setSteptoLastInj(int n)
void readStepData(PartBunchBase< double, 3 > *, h5_ssize_t, h5_ssize_t)
long long getGlobalTrackStep() const