OPALX (Object Oriented Parallel Accelerator Library for Exascal) MINIorX
OPALX
H5PartWrapperForPT.cpp
Go to the documentation of this file.
1//
2// Class H5PartWrapperForPT
3// A class that manages all calls to H5Part for the Parallel-T tracker.
4//
5// Copyright (c) 200x-2021, Paul Scherrer Institut, Villigen PSI, Switzerland
6// All rights reserved
7//
8// This file is part of OPAL.
9//
10// OPAL is free software: you can redistribute it and/or modify
11// it under the terms of the GNU General Public License as published by
12// the Free Software Foundation, either version 3 of the License, or
13// (at your option) any later version.
14//
15// You should have received a copy of the GNU General Public License
16// along with OPAL. If not, see <https://www.gnu.org/licenses/>.
17//
19
21#include "PartBunch/PartBunch.h"
22
23#include "OPALconfig.h"
24#include "Physics/Physics.h"
25#include "Physics/Units.h"
27#include "Utilities/Options.h"
28#include "Utilities/Util.h"
29#include "h5core/h5_types.h"
30
31#include <cmath>
32#include <set>
33#include <sstream>
34
35H5PartWrapperForPT::H5PartWrapperForPT(const std::string& fileName, h5_int32_t flags)
36 : H5PartWrapper(fileName, flags) {
37}
38
40 const std::string& fileName, int restartStep, std::string sourceFile, h5_int32_t flags)
41 : H5PartWrapper(fileName, restartStep, sourceFile, flags) {
42 if (restartStep == -1) {
43 restartStep = H5GetNumSteps(file_m) - 1;
45 }
46}
47
50
52 h5_int64_t numFileAttributes = H5GetNumFileAttribs(file_m);
53
54 const h5_size_t lengthAttributeName = 256;
55 char attributeName[lengthAttributeName];
56 h5_int64_t attributeType;
57 h5_size_t numAttributeElements;
58 std::set<std::string> attributeNames;
59
60 for (h5_int64_t i = 0; i < numFileAttributes; ++i) {
61 REPORTONERROR(H5GetFileAttribInfo(
62 file_m, i, attributeName, lengthAttributeName, &attributeType, &numAttributeElements));
63
64 attributeNames.insert(attributeName);
65 }
66
67 if (attributeNames.find("dump frequency") != attributeNames.end()) {
68 h5_int64_t dumpfreq;
69 READFILEATTRIB(Int64, file_m, "dump frequency", &dumpfreq);
71 }
72
73 if (attributeNames.find("dPhiGlobal") != attributeNames.end()) {
74 h5_float64_t dphi;
75 READFILEATTRIB(Float64, file_m, "dPhiGlobal", &dphi);
77 }
78
79 if (attributeNames.find("nAutoPhaseCavities") != attributeNames.end()) {
80 auto opal = OpalData::getInstance();
81 h5_float64_t phase;
82 h5_int64_t numAutoPhaseCavities = 0;
83 if (!H5HasFileAttrib(file_m, "nAutoPhaseCavities")
84 || H5ReadFileAttribInt64(file_m, "nAutoPhaseCavities", &numAutoPhaseCavities)
85 != H5_SUCCESS) {
86 numAutoPhaseCavities = 0;
87 } else {
88 for (long i = 0; i < numAutoPhaseCavities; ++i) {
89 std::string elementName = "Cav-" + std::to_string(i + 1) + "-name";
90 std::string elementPhase = "Cav-" + std::to_string(i + 1) + "-value";
91
92 char name[128];
93 READFILEATTRIB(String, file_m, elementName.c_str(), name);
94 READFILEATTRIB(Float64, file_m, elementPhase.c_str(), &phase);
95
96 opal->setMaxPhase(name, phase);
97 }
98 }
99 }
100}
101
103 PartBunch_t* bunch, h5_ssize_t firstParticle, h5_ssize_t lastParticle) {
104 h5_ssize_t numStepsInSource = H5GetNumSteps(file_m);
105 h5_ssize_t readStep = numStepsInSource - 1;
106 REPORTONERROR(H5SetStep(file_m, readStep));
107
108 readStepHeader(bunch);
109 readStepData(bunch, firstParticle, lastParticle);
110}
111
113 double actualT;
114 READSTEPATTRIB(Float64, file_m, "TIME", &actualT);
115 bunch->setT(actualT);
116
117 double spos;
118 READSTEPATTRIB(Float64, file_m, "SPOS", &spos);
119 bunch->set_sPos(spos);
120
121 h5_int64_t ltstep;
122 READSTEPATTRIB(Int64, file_m, "LocalTrackStep", &ltstep);
123 bunch->setLocalTrackStep((long long)(ltstep + 1));
124
125 h5_int64_t gtstep;
126 READSTEPATTRIB(Int64, file_m, "GlobalTrackStep", &gtstep);
127 bunch->setGlobalTrackStep((long long)(gtstep + 1));
128
129 Vector_t<double, 3> RefPartR;
130 READSTEPATTRIB(Float64, file_m, "RefPartR", (h5_float64_t*)&RefPartR);
131 bunch->RefPartR_m = RefPartR;
132
133 Vector_t<double, 3> RefPartP;
134 READSTEPATTRIB(Float64, file_m, "RefPartP", (h5_float64_t*)&RefPartP);
135 bunch->RefPartP_m = RefPartP;
136
137 Vector_t<double, 3> TaitBryant;
138 READSTEPATTRIB(Float64, file_m, "TaitBryantAngles", (h5_float64_t*)&TaitBryant);
139 Quaternion rotTheta(std::cos(0.5 * TaitBryant[0]), 0, std::sin(0.5 * TaitBryant[0]), 0);
140 Quaternion rotPhi(std::cos(0.5 * TaitBryant[1]), std::sin(0.5 * TaitBryant[1]), 0, 0);
141 Quaternion rotPsi(std::cos(0.5 * TaitBryant[2]), 0, 0, std::sin(0.5 * TaitBryant[2]));
142 Quaternion rotation = rotTheta * (rotPhi * rotPsi);
143 // ADA bunch->toLabTrafo_m = CoordinateSystemTrafo(-rotation.conjugate().rotate(RefPartR),
144 // rotation);
145}
146
148 PartBunch_t* bunch, h5_ssize_t firstParticle, h5_ssize_t lastParticle) {
149 h5_ssize_t numParticles = getNumParticles();
150 if (lastParticle >= numParticles || firstParticle > lastParticle) {
151 throw OpalException(
152 "H5PartWrapperForPT::readStepData",
153 "the provided particle numbers don't match the number of particles in the file");
154 }
155
156 REPORTONERROR(H5PartSetView(file_m, firstParticle, lastParticle));
157
158 numParticles = lastParticle - firstParticle + 1;
159
160 std::vector<char> buffer(numParticles * sizeof(h5_float64_t));
161 char* buffer_ptr = Util::c_data(buffer);
162 h5_float64_t* f64buffer = reinterpret_cast<h5_float64_t*>(buffer_ptr);
163 h5_int32_t* i32buffer = reinterpret_cast<h5_int32_t*>(buffer_ptr);
164
165 READDATA(Float64, file_m, "x", f64buffer);
166 for (long int n = 0; n < numParticles; ++n) {
167 // \todo bunch->R(n)(0) = f64buffer[n];
168 // bunch->Bin(n) = 0;
169 }
170
171 READDATA(Float64, file_m, "y", f64buffer);
172 for (long int n = 0; n < numParticles; ++n) {
173 // bunch->R(n)(1) = f64buffer[n];
174 }
175
176 READDATA(Float64, file_m, "z", f64buffer);
177 for (long int n = 0; n < numParticles; ++n) {
178 // bunch->R(n)(2) = f64buffer[n];
179 }
180
181 READDATA(Float64, file_m, "px", f64buffer);
182 for (long int n = 0; n < numParticles; ++n) {
183 // bunch->P(n)(0) = f64buffer[n];
184 }
185
186 READDATA(Float64, file_m, "py", f64buffer);
187 for (long int n = 0; n < numParticles; ++n) {
188 // bunch->P(n)(1) = f64buffer[n];
189 }
190
191 READDATA(Float64, file_m, "pz", f64buffer);
192 for (long int n = 0; n < numParticles; ++n) {
193 // bunch->P(n)(2) = f64buffer[n];
194 }
195
196 READDATA(Float64, file_m, "q", f64buffer);
197 for (long int n = 0; n < numParticles; ++n) {
198 // bunch->Q(n) = f64buffer[n];
199 }
200
201 READDATA(Int32, file_m, "id", i32buffer);
202 for (long int n = 0; n < numParticles; ++n) {
203 // bunch->ID(n) = i32buffer[n];
204 }
205
206 REPORTONERROR(H5PartSetView(file_m, -1, -1));
207}
208
210 std::stringstream OPAL_version;
211 OPAL_version << OPAL_PROJECT_NAME << " " << OPAL_PROJECT_VERSION << " # git rev. "
213 WRITESTRINGFILEATTRIB(file_m, "OPAL_version", OPAL_version.str().c_str());
214
215 WRITESTRINGFILEATTRIB(file_m, "idUnit", "1");
216 WRITESTRINGFILEATTRIB(file_m, "xUnit", "m");
217 WRITESTRINGFILEATTRIB(file_m, "yUnit", "m");
218 WRITESTRINGFILEATTRIB(file_m, "zUnit", "m");
219
220 WRITESTRINGFILEATTRIB(file_m, "pxUnit", "#beta#gamma");
221 WRITESTRINGFILEATTRIB(file_m, "pyUnit", "#beta#gamma");
222 WRITESTRINGFILEATTRIB(file_m, "pzUnit", "#beta#gamma");
223
224 WRITESTRINGFILEATTRIB(file_m, "ptypeUnit", "1");
225 WRITESTRINGFILEATTRIB(file_m, "poriginUnit", "1");
226 WRITESTRINGFILEATTRIB(file_m, "qUnit", "C");
227
228 if (Options::ebDump) {
229 WRITESTRINGFILEATTRIB(file_m, "ExUnit", "MV/m");
230 WRITESTRINGFILEATTRIB(file_m, "EyUnit", "MV/m");
231 WRITESTRINGFILEATTRIB(file_m, "EzUnit", "MV/m");
232
233 WRITESTRINGFILEATTRIB(file_m, "BxUnit", "T");
234 WRITESTRINGFILEATTRIB(file_m, "ByUnit", "T");
235 WRITESTRINGFILEATTRIB(file_m, "BzUnit", "T");
236 }
237
238 if (Options::rhoDump) {
239 WRITESTRINGFILEATTRIB(file_m, "rhoUnit", "C/m^3");
240 }
241
242 WRITESTRINGFILEATTRIB(file_m, "TaitBryantAnglesUnit", "rad");
243
244 WRITESTRINGFILEATTRIB(file_m, "SPOSUnit", "m");
245 WRITESTRINGFILEATTRIB(file_m, "TIMEUnit", "s");
246 WRITESTRINGFILEATTRIB(file_m, "#gammaUnit", "1");
247 WRITESTRINGFILEATTRIB(file_m, "ENERGYUnit", "MeV");
248 WRITESTRINGFILEATTRIB(file_m, "#varepsilonUnit", "m rad");
249 WRITESTRINGFILEATTRIB(file_m, "#varepsilon-geomUnit", "m rad");
250
251 WRITESTRINGFILEATTRIB(file_m, "#sigmaUnit", "1");
252 WRITESTRINGFILEATTRIB(file_m, "RMSXUnit", "m");
253 WRITESTRINGFILEATTRIB(file_m, "centroidUnit", "m");
254 WRITESTRINGFILEATTRIB(file_m, "RMSPUnit", "#beta#gamma");
255 WRITESTRINGFILEATTRIB(file_m, "MEANPUnit", "#beta#gamma");
256
257 WRITESTRINGFILEATTRIB(file_m, "minXUnit", "m");
258 WRITESTRINGFILEATTRIB(file_m, "maxXUnit", "m");
259 WRITESTRINGFILEATTRIB(file_m, "minPUnit", "#beta#gamma");
260 WRITESTRINGFILEATTRIB(file_m, "maxPUnit", "#beta#gamma");
261
262 WRITESTRINGFILEATTRIB(file_m, "dEUnit", "MeV");
263
264 WRITESTRINGFILEATTRIB(file_m, "MASSUnit", "GeV");
265 WRITESTRINGFILEATTRIB(file_m, "CHARGEUnit", "C");
266
267 WRITESTRINGFILEATTRIB(file_m, "E-refUnit", "MV/m");
268 WRITESTRINGFILEATTRIB(file_m, "B-refUnit", "T");
269
270 WRITESTRINGFILEATTRIB(file_m, "StepUnit", "1");
271 WRITESTRINGFILEATTRIB(file_m, "LocalTrackStepUnit", "1");
272 WRITESTRINGFILEATTRIB(file_m, "GlobalTrackStepUnit", "1");
273 WRITESTRINGFILEATTRIB(file_m, "NumBunchUnit", "1");
274 WRITESTRINGFILEATTRIB(file_m, "NumPartUnit", "1");
275
276 WRITESTRINGFILEATTRIB(file_m, "RefPartRUnit", "m");
277 WRITESTRINGFILEATTRIB(file_m, "RefPartPUnit", "#beta#gamma");
278 WRITESTRINGFILEATTRIB(file_m, "SteptoLastInjUnit", "1");
279
280 WRITESTRINGFILEATTRIB(file_m, "dump frequencyUnit", "1")
281 WRITESTRINGFILEATTRIB(file_m, "dPhiGlobalUnit", "rad")
282
283
284 h5_int64_t dumpfreq = Options::psDumpFreq;
285 WRITEFILEATTRIB(Int64, file_m, "dump frequency", &dumpfreq, 1);
286
288 h5_float64_t dphi = OpalData::getInstance()->getGlobalPhaseShift();
289 WRITEFILEATTRIB(Float64, file_m, "dPhiGlobal", &dphi, 1);
290}
291
293 PartBunch_t* bunch, const std::map<std::string, double>& additionalStepAttributes) {
294
295 if (bunch->getTotalNum() == 0)
296 return;
297
298 open(H5_O_APPENDONLY);
299 bunch->calcBeamParameters();
300 writeStepHeader(bunch, additionalStepAttributes);
301 writeStepData(bunch);
302 close();
303}
304
306 PartBunch_t* bunch, const std::map<std::string, double>& additionalStepAttributes) {
307 double actPos = bunch->get_sPos();
308 double t = bunch->getT();
309 Vector_t<double, 3> rmin = bunch->get_origin();
310 Vector_t<double, 3> rmax = bunch->get_maxExtent();
311 Vector_t<double, 3> centroid = bunch->get_centroid();
312
313 Vector_t<double, 3> maxP(0.0);
314 Vector_t<double, 3> minP(0.0);
315
316 Vector_t<double, 3> xsigma = bunch->get_rrms();
317 Vector_t<double, 3> psigma = bunch->get_prms();
318 Vector_t<double, 3> vareps = bunch->get_norm_emit();
319 Vector_t<double, 3> geomvareps = bunch->get_emit();
320 Vector_t<double, 3> RefPartR = bunch->RefPartR_m;
321 Vector_t<double, 3> RefPartP = bunch->RefPartP_m;
323 TaitBryant; // ADA = Util::getTaitBryantAngles(bunch->toLabTrafo_m.getRotation());
324 Vector_t<double, 3> pmean = bunch->get_pmean();
325
326 double meanEnergy = bunch->get_meanKineticEnergy();
327 double energySpread = bunch->getdE();
328 double I_0 =
329 4.0 * Physics::pi * Physics::epsilon_0 * Physics::c * bunch->getM() / bunch->getQ();
330 double sigma = ((xsigma[0] * xsigma[0]) + (xsigma[1] * xsigma[1]))
331 / (2.0 * bunch->get_gamma() * I_0
332 * (geomvareps[0] * geomvareps[0] + geomvareps[1] * geomvareps[1]));
333
334 h5_int64_t localTrackStep = (h5_int64_t)bunch->getLocalTrackStep();
335 h5_int64_t globalTrackStep = (h5_int64_t)bunch->getGlobalTrackStep();
336
337 double mass = Units::eV2GeV * bunch->getM();
338 double charge = bunch->getCharge();
339
340 h5_int64_t numBunch = 1;
341 h5_int64_t SteptoLastInj = 0;
342
343 // ADA bunch->get_PBounds(minP, maxP);
344
345 /* ------------------------------------------------------------------------ */
346
347 REPORTONERROR(H5SetStep(file_m, numSteps_m));
348
349 char const* OPALFlavour = "opal-t";
350 WRITESTRINGSTEPATTRIB(file_m, "OPAL_flavour", OPALFlavour);
351 WRITESTEPATTRIB(Float64, file_m, "SPOS", &actPos, 1);
352 WRITESTEPATTRIB(Float64, file_m, "RefPartR", (h5_float64_t*)&RefPartR, 3);
353 WRITESTEPATTRIB(Float64, file_m, "centroid", (h5_float64_t*)&centroid, 3);
354 WRITESTEPATTRIB(Float64, file_m, "RMSX", (h5_float64_t*)&xsigma, 3);
355
356 WRITESTEPATTRIB(Float64, file_m, "RefPartP", (h5_float64_t*)&RefPartP, 3);
357 WRITESTEPATTRIB(Float64, file_m, "MEANP", (h5_float64_t*)&pmean, 3);
358 WRITESTEPATTRIB(Float64, file_m, "RMSP", (h5_float64_t*)&psigma, 3);
359 WRITESTEPATTRIB(Float64, file_m, "TaitBryantAngles", (h5_float64_t*)&TaitBryant, 3);
360
361 WRITESTEPATTRIB(Float64, file_m, "#varepsilon", (h5_float64_t*)&vareps, 3);
362 WRITESTEPATTRIB(Float64, file_m, "#varepsilon-geom", (h5_float64_t*)&geomvareps, 3);
363
364 WRITESTEPATTRIB(Float64, file_m, "minX", (h5_float64_t*)&rmin, 3);
365 WRITESTEPATTRIB(Float64, file_m, "maxX", (h5_float64_t*)&rmax, 3);
366
367 WRITESTEPATTRIB(Float64, file_m, "minP", (h5_float64_t*)&minP, 3);
368 WRITESTEPATTRIB(Float64, file_m, "maxP", (h5_float64_t*)&maxP, 3);
369
370 WRITESTEPATTRIB(Int64, file_m, "Step", &numSteps_m, 1);
371 WRITESTEPATTRIB(Int64, file_m, "LocalTrackStep", &localTrackStep, 1);
372 WRITESTEPATTRIB(Int64, file_m, "GlobalTrackStep", &globalTrackStep, 1);
373
374 WRITESTEPATTRIB(Float64, file_m, "#sigma", &sigma, 1);
375
376 WRITESTEPATTRIB(Float64, file_m, "TIME", &t, 1);
377
378 WRITESTEPATTRIB(Float64, file_m, "ENERGY", &meanEnergy, 1);
379 WRITESTEPATTRIB(Float64, file_m, "dE", &energySpread, 1);
380
382 WRITESTEPATTRIB(Float64, file_m, "MASS", &mass, 1);
383
384 WRITESTEPATTRIB(Float64, file_m, "CHARGE", &charge, 1);
385
386 WRITESTEPATTRIB(Int64, file_m, "NumBunch", &numBunch, 1);
387
388 WRITESTEPATTRIB(Int64, file_m, "SteptoLastInj", &SteptoLastInj, 1);
389
390 try {
391 Vector_t<double, 3> referenceB(
392 additionalStepAttributes.at("B-ref_x"), additionalStepAttributes.at("B-ref_z"),
393 additionalStepAttributes.at("B-ref_y"));
394 Vector_t<double, 3> referenceE(
395 additionalStepAttributes.at("E-ref_x"), additionalStepAttributes.at("E-ref_z"),
396 additionalStepAttributes.at("E-ref_y"));
397
398 WRITESTEPATTRIB(Float64, file_m, "B-ref", (h5_float64_t*)&referenceB, 3);
399 WRITESTEPATTRIB(Float64, file_m, "E-ref", (h5_float64_t*)&referenceE, 3);
400 } catch (std::out_of_range& m) {
401 *ippl::Error << m.what() << endl;
402
403 throw OpalException(
404 "H5PartWrapperForPC::writeStepHeader", "some additional step attribute not found");
405 }
406
407 ++numSteps_m;
408}
409
411
412 size_t numLocalParticles = bunch->getLocalNum();
413
414 auto rViewDevice = bunch->getParticleContainer()->R.getView();
415 auto rView = Kokkos::create_mirror_view(rViewDevice);
416 Kokkos::deep_copy(rView,rViewDevice);
417
418 REPORTONERROR(H5PartSetNumParticles(file_m, (h5_size_t)numLocalParticles));
419 std::vector<char> buffer(numLocalParticles * sizeof(h5_float64_t));
420 char* buffer_ptr = Util::c_data(buffer);
421 h5_float64_t* f64buffer = reinterpret_cast<h5_float64_t*>(buffer_ptr);
422 // h5_int64_t* i64buffer = reinterpret_cast<h5_int64_t*>(buffer_ptr);
423 h5_int32_t* i32buffer = reinterpret_cast<h5_int32_t*>(buffer_ptr);
424
425 for (size_t i = 0; i < numLocalParticles; ++i)
426 f64buffer[i] = rView(i)(0);
427 WRITEDATA(Float64, file_m, "x", f64buffer);
428
429 for (size_t i = 0; i < numLocalParticles; ++i)
430 f64buffer[i] = rView(i)(1);
431 WRITEDATA(Float64, file_m, "y", f64buffer);
432
433 for (size_t i = 0; i < numLocalParticles; ++i)
434 f64buffer[i] = rView(i)(1);
435 WRITEDATA(Float64, file_m, "z", f64buffer);
436
437 auto pViewDevice = bunch->getParticleContainer()->P.getView();
438 auto pView = Kokkos::create_mirror_view(pViewDevice);
439 Kokkos::deep_copy(pView,pViewDevice);
440
441 for (long unsigned i = 0; i < numLocalParticles; i++)
442 f64buffer[i] = pView(i)(0);
443 WRITEDATA(Float64, file_m, "px", f64buffer);
444
445 for (size_t i = 0; i < numLocalParticles; ++i)
446 f64buffer[i] = pView(i)(1);
447 WRITEDATA(Float64, file_m, "py", f64buffer);
448
449 for (size_t i = 0; i < numLocalParticles; ++i)
450 f64buffer[i] = pView(i)(2);
451 WRITEDATA(Float64, file_m, "pz", f64buffer);
452
453 auto qViewDevice = bunch->getParticleContainer()->Q.getView();
454 auto qView = Kokkos::create_mirror_view(qViewDevice);
455 Kokkos::deep_copy(qView,qViewDevice);
456
457 for (size_t i = 0; i < numLocalParticles; ++i)
458 f64buffer[i] = qView(i);
459 WRITEDATA(Float64, file_m, "q", f64buffer);
460
461
462 /*
463
464 auto idViewDevice = bunch->getParticleContainer()->ID.getView();
465 auto idView = Kokkos::create_mirror_view(idViewDevice);
466 Kokkos::deep_copy(idView,idViewDevice);
467
468 for (long unsigned i = 0; i < numLocalParticles; i++)
469 i64buffer[i] = idView(i);
470 WRITEDATA(Int64, file_m, "id", i64buffer);
471 */
472
473 auto binViewDevice = bunch->getParticleContainer()->Bin.getView();
474 auto binView = Kokkos::create_mirror_view(binViewDevice);
475 Kokkos::deep_copy(binView,binViewDevice);
476
477 for (size_t i = 0; i < numLocalParticles; ++i)
478 i32buffer[i] = binView(i);
479 WRITEDATA(Int32, file_m, "bin", i32buffer);
480
481 auto spViewDevice = bunch->getParticleContainer()->Sp.getView();
482 auto spView = Kokkos::create_mirror_view(spViewDevice);
483 Kokkos::deep_copy(spView,spViewDevice);
484
485
486 for (size_t i = 0; i < numLocalParticles; ++i)
487 i32buffer[i] = spView(i);
488 WRITEDATA(Int32, file_m, "sp", i32buffer);
489
490 if (Options::ebDump) {
491
492 auto EViewDevice = bunch->getParticleContainer()->E.getView();
493 auto EView = Kokkos::create_mirror_view(EViewDevice);
494 Kokkos::deep_copy(EView,EViewDevice);
495
496 for (size_t i = 0; i < numLocalParticles; ++i)
497 f64buffer[i] = EView(i)(0);
498 WRITEDATA(Float64, file_m, "Ex", f64buffer);
499
500 for (size_t i = 0; i < numLocalParticles; ++i)
501 f64buffer[i] = EView(i)(1);
502 WRITEDATA(Float64, file_m, "Ey", f64buffer);
503
504 for (size_t i = 0; i < numLocalParticles; ++i)
505 f64buffer[i] = EView(i)(2);
506 WRITEDATA(Float64, file_m, "Ez", f64buffer);
507
508 auto BViewDevice = bunch->getParticleContainer()->B.getView();
509 auto BView = Kokkos::create_mirror_view(BViewDevice);
510 Kokkos::deep_copy(BView,BViewDevice);
511
512 for (size_t i = 0; i < numLocalParticles; ++i)
513 f64buffer[i] = BView(i)(0);
514 WRITEDATA(Float64, file_m, "Bx", f64buffer);
515
516 for (size_t i = 0; i < numLocalParticles; ++i)
517 f64buffer[i] = BView(i)(1);
518 WRITEDATA(Float64, file_m, "By", f64buffer);
519
520 for (size_t i = 0; i < numLocalParticles; ++i)
521 f64buffer[i] = BView(i)(2);
522 WRITEDATA(Float64, file_m, "Bz", f64buffer);
523 }
524
525 /*
527 if (Options::rhoDump) {
528 NDIndex<3> idx = bunch->getFieldLayout().getLocalNDIndex();
529 NDIndex<3> elem;
530 h5_err_t herr = H5Block3dSetView(
531 file_m, idx[0].min(), idx[0].max(), idx[1].min(), idx[1].max(), idx[2].min(),
532 idx[2].max());
533 reportOnError(herr, __FILE__, __LINE__);
534
535 std::unique_ptr<h5_float64_t[]> data(
536 new h5_float64_t[(idx[0].max() + 1) * (idx[1].max() + 1) * (idx[2].max() + 1)]);
537
538 int ii = 0;
539 // h5block uses the fortran convention of storing data:
540 // INTEGER, DIMENSION(2,3) :: a
541 // => {a(1,1), a(2,1), a(1,2), a(2,2), a(1,3), a(2,3)}
542 for (int i = idx[2].min(); i <= idx[2].max(); ++i) {
543 for (int j = idx[1].min(); j <= idx[1].max(); ++j) {
544 for (int k = idx[0].min(); k <= idx[0].max(); ++k) {
545 data[ii] = bunch->getRho(k, j, i);
546 ++ii;
547 }
548 }
549 }
550 herr = H5Block3dWriteScalarFieldFloat64(file_m, "rho", data.get());
551 reportOnError(herr, __FILE__, __LINE__);
552
554 herr = H5Block3dSetFieldOrigin(
555 file_m, "rho", (h5_float64_t)bunch->get_origin()(0),
556 (h5_float64_t)bunch->get_origin()(1), (h5_float64_t)bunch->get_origin()(2));
557 reportOnError(herr, __FILE__, __LINE__);
558
559 herr = H5Block3dSetFieldSpacing(
560 file_m, "rho", (h5_float64_t)bunch->get_hr()(0), (h5_float64_t)bunch->get_hr()(1),
561 (h5_float64_t)bunch->get_hr()(2));
562 reportOnError(herr, __FILE__, __LINE__);
563 }
564 */
565}
#define OPAL_PROJECT_VERSION
Definition OPALconfig.h:5
#define OPAL_PROJECT_NAME
Definition OPALconfig.h:2
PartBunch< PLayout_t< double, 3 >, double, 3 > PartBunch_t
ippl::Vector< T, Dim > Vector_t
#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)
constexpr double epsilon_0
The permittivity of vacuum in As/Vm.
Definition Physics.h:51
constexpr double c
The velocity of light in m/s.
Definition Physics.h:45
constexpr double pi
The value of.
Definition Physics.h:30
constexpr double eV2GeV
Definition Units.h:71
int psDumpFreq
The frequency to dump the phase space, i.e.dump data when steppsDumpFreq==0.
Definition Options.cpp:39
bool rhoDump
Definition Options.cpp:63
bool ebDump
Definition Options.cpp:65
T * c_data(std::vector< T, A > &v)
Definition Util.h:225
std::string getGitRevision()
Definition Util.cpp:32
void setRestartDumpFreq(const int &N)
set the dump frequency as found in restart file
Definition OpalData.cpp:340
double getGlobalPhaseShift()
units: (sec)
Definition OpalData.cpp:450
void setGlobalPhaseShift(double shift)
units: (sec)
Definition OpalData.cpp:445
static OpalData * getInstance()
Definition OpalData.cpp:195
void setRestartStep(int s)
store the location where to restart
Definition OpalData.cpp:319
double get_sPos() const
Vector_t< T, Dim > get_prms() const
void setT(double t)
void setLocalTrackStep(long long n)
step in a TRACK command
void calcBeamParameters()
Vector_t< T, Dim > get_maxExtent() const
double getdE() const
Vector_t< T, Dim > get_pmean() const
double getQ() const
Access to reference data.
double getT() const
double getCharge() const
get the total charge per simulation particle
Vector_t< T, Dim > get_rrms() const
Vector_t< T, Dim > get_origin() const
Vector_t< T, Dim > RefPartR_m
std::shared_ptr< ParticleContainer_t > getParticleContainer()
Definition PartBunch.h:248
double get_meanKineticEnergy()
long long getLocalTrackStep() const
void set_sPos(double s)
size_t getLocalNum() const
double getM() const
Vector_t< T, Dim > get_emit() const
double get_gamma() const
Vector_t< T, Dim > get_centroid() const
void setGlobalTrackStep(long long n)
step in multiple TRACK commands
long long getGlobalTrackStep() const
size_t getTotalNum() const
Vector_t< T, Dim > RefPartP_m
Vector_t< T, Dim > get_norm_emit() const
size_t getNumParticles() const
void open(h5_int32_t flags)
h5_int64_t numSteps_m
H5PartWrapper(const std::string &fileName, h5_int32_t flags=H5_O_WRONLY)
h5_file_t file_m
virtual void readStep(PartBunch_t *, h5_ssize_t firstParticle, h5_ssize_t lastParticle)
virtual void writeStep(PartBunch_t *, const std::map< std::string, double > &additionalStepAttributes)
H5PartWrapperForPT(const std::string &fileName, h5_int32_t flags=H5_O_WRONLY)
void readStepData(PartBunch_t *, h5_ssize_t, h5_ssize_t)
void readStepHeader(PartBunch_t *)
void writeStepHeader(PartBunch_t *, const std::map< std::string, double > &)
void writeStepData(PartBunch_t *)
The base class for all OPAL exceptions.