44 const std::string& inputBasename,
size_t numContainers,
size_t index) {
45 if (numContainers <= 1) {
48 return inputBasename +
"_c" + std::to_string(index);
54 const std::vector<H5PartWrapper*>& h5wrappers,
bool restart,
size_t numParticleContainers) {
56 throw OpalException(
"DataSink::DataSink()",
"Can not restart when HDF5 is disabled");
59 this->
init(restart, h5wrappers, numParticleContainers);
72 const size_t n = beam.getNumParticleContainers();
73 std::vector<std::array<Vector_t<double, 3>, 2>> v(n);
74 for (
size_t i = 0; i < n; ++i) {
88 const size_t n = beam.getNumParticleContainers();
89 if (fdextPerContainer.size() < n) {
91 "DataSink::dumpH5",
"fdextPerContainer size ("
92 + std::to_string(fdextPerContainer.size())
93 +
") < num containers (" + std::to_string(n) +
").");
96 for (
size_t i = 0; i < n; ++i) {
100 auto pc = beam.getParticleContainer(i);
101 if (!pc || pc->getTotalNum() == 0) {
111 double refPt,
double refPz,
double refR,
double refTheta,
double refZ,
double azimuth,
112 double elevation,
bool local)
const {
118 beam, FDext, meanEnergy, refPr, refPt, refPz, refR, refTheta, refZ, azimuth, elevation,
124 const double& azimuth)
const {
130 const losses_t& losses,
const double& azimuth)
const {
131 const size_t n = beam.getNumParticleContainers();
132 if (fdextPerContainer.size() < n) {
134 "DataSink::dumpSDDS",
"fdextPerContainer size ("
135 + std::to_string(fdextPerContainer.size())
136 +
") < num containers (" + std::to_string(n) +
").");
141 for (
size_t i = 0; i < n; ++i) {
145 auto pc = beam.getParticleContainer(i);
150 size_t npOutside = 0;
151 if (pc->getTotalNum() > 0) {
160 statWriters_m[i]->write(beam, fd, losses, azimuth, npOutside, i);
164 auto primary = beam.getParticleContainer(0);
165 if (primary && primary->getTotalNum() > 0) {
187 "DataSink::changeH5Wrappers",
"Expected " + std::to_string(
h5Writers_m.size())
189 + std::to_string(h5wrappers.size()) +
".");
192 for (
size_t i = 0; i < h5wrappers.size(); ++i) {
204 const PartBunch_t& beam,
long long& step,
size_t& impact,
double& sey_num,
205 size_t numberOfFieldEmittedParticles,
bool nEmissionMode, std::string fn) {
208 double Npart_d = 0.0;
209 if (!nEmissionMode) {
210 const auto pc = beam.getParticleContainers()[0];
213 Npart_d = -1.0 * charge / pc->getChargePerParticle();
215 Npart = beam.getParticleContainers()[0]->getTotalNum();
217 if (ippl::Comm->rank() == 0) {
218 std::string ffn = fn + std::string(
".dat");
220 std::unique_ptr<Inform> ofp(
new Inform(
nullptr, ffn.c_str(), Inform::APPEND, 0));
223 fid << std::setiosflags(std::ios::scientific);
225 if (!nEmissionMode) {
227 fid <<
"#Time/ns" << std::setw(18) <<
"#Geometry impacts" << std::setw(18)
228 <<
"tot_sey" << std::setw(18) <<
"TotalCharge" << std::setw(18) <<
"PartNum"
229 <<
" numberOfFieldEmittedParticles " << endl;
231 fid << t << std::setw(18) << impact << std::setw(18) << sey_num << std::setw(18)
232 << charge << std::setw(18) << Npart_d << std::setw(18)
233 << numberOfFieldEmittedParticles << endl;
236 fid <<
"#Time/ns" << std::setw(18) <<
"#Geometry impacts" << std::setw(18)
237 <<
"tot_sey" << std::setw(18) <<
"ParticleNumber"
238 <<
" numberOfFieldEmittedParticles " << endl;
240 fid << t << std::setw(18) << impact << std::setw(18) << sey_num << std::setw(18)
241 << double(Npart) << std::setw(18) << numberOfFieldEmittedParticles << endl;
247 long long step,
double time,
bool preMerge,
const std::vector<std::size_t>& binCounts,
248 const std::vector<double>& binWidths,
double xMin,
const std::string& fileName) {
249 if (ippl::Comm->rank() != 0) {
253 Inform m(
"DataSink::dumpBinConfig");
255 if (binCounts.size() != binWidths.size()) {
256 m << level4 <<
"Invalid bin configuration: binCounts.size() = " << binCounts.size()
257 <<
", binWidths.size() = " << binWidths.size() << endl;
259 "DataSink::dumpBinConfig",
"binCounts and binWidths must have the same length.");
263 m << level4 <<
"Creating BinConfigWriter for JSON binning output file \"" << fileName
268 m << level5 <<
"Dumping bin configuration snapshot: step=" << step <<
", time=" << time
269 <<
", preMerge=" << (preMerge ? 1 : 0) <<
", nBins=" << binCounts.size() <<
", xMin=" << xMin
276 unsigned int linesToRewind = 0;
283 linesToRewind = std::max(linesToRewind, li);
288 if (linesToRewind > 0) {
297 bool restart,
const std::vector<H5PartWrapper*>& h5wrappers,
size_t numParticleContainers) {
304 for (
size_t i = 0; i < numParticleContainers; ++i) {
314 if (h5wrappers.size() != numParticleContainers) {
317 "HDF5 enabled: expected " + std::to_string(numParticleContainers)
318 +
" H5PartWrapper(s), got " + std::to_string(h5wrappers.size()) +
".");
323 }
else if (!h5wrappers.empty()) {
324 throw OpalException(
"DataSink::init",
"H5 wrappers passed while HDF5 is disabled.");
ippl::Vector< T, Dim > Vector_t
void writeGeomToVtk(std::string fn)
std::vector< sddsWriter_t > sddsWriter_m
StatWriter::losses_t losses_t
void dumpH5(PartBunch_t &beam, Vector_t< double, 3 > FDext[]) const
Write H5 phase-space data for all particle containers.
void changeH5Wrappers(const std::vector< H5PartWrapper * > &h5wrappers)
void writeGeomToVtk(BoundaryGeometry &bg, std::string fn)
std::unique_ptr< SDDSWriter > sddsWriter_t
void writeImpactStatistics(const PartBunch_t &beam, long long int &step, size_t &impact, double &sey_num, size_t numberOfFieldEmittedParticles, bool nEmissionMode, std::string fn)
std::vector< h5Writer_t > h5Writers_m
void storeCavityInformation()
Write cavity information from H5 file.
static std::string diagnosticStemForContainer(const std::string &inputBasename, size_t numContainers, size_t index)
IpplTimings::TimerRef StatMarkerTimer_m
Timer to track statistics write time.
void init(bool restart, const std::vector< H5PartWrapper * > &h5wrappers, size_t numParticleContainers)
std::unique_ptr< H5Writer > h5Writer_t
unsigned int lossWrCounter_m
needed to create index for vtk file
void dumpBinConfig(long long step, double time, bool preMerge, const std::vector< std::size_t > &binCounts, const std::vector< double > &binWidths, double xMin, const std::string &fileName)
Append a binning configuration snapshot to a JSON file.
std::unique_ptr< BinConfigWriter > binConfigWriter_m
DataSink()
Default constructor.
std::vector< statWriter_t > statWriters_m
std::unique_ptr< StatWriter > statWriter_t
void dumpSDDS(PartBunch_t &beam, const std::vector< std::array< Vector_t< double, 3 >, 2 > > &fdextPerContainer, const double &azimuth) const
Write SDDS statistics with per-container external fields.
std::string getInputBasename()
get input file name without extension
static OpalData * getInstance()
void gatherLoadBalanceStatistics()
double getTotalCharge() const
Get the total charge across all particle containers.
void calcBeamParameters()
Update moments and set rmin_m / rmax_m from the primary (first) container.
double getT() const
Get the current simulation time.
size_t calcNumPartsOutside(Vector_t< double, Dim >)
Stub; logs and returns 0.
bool enableVTK
If true VTK files are written.
bool enableHDF5
If true HDF5 files are written.