OpenMC/src/track_output.cpp

75 lines
2 KiB
C++
Raw Permalink Normal View History

2019-02-19 22:06:20 -06:00
#include "openmc/track_output.h"
#include "openmc/constants.h"
#include "openmc/hdf5_interface.h"
#include "openmc/position.h"
#include "openmc/settings.h"
#include "openmc/simulation.h"
#include "openmc/vector.h"
2019-02-19 22:06:20 -06:00
#include <fmt/core.h>
2019-02-19 22:06:20 -06:00
#include "xtensor/xtensor.hpp"
#include <cstddef> // for size_t
#include <string>
namespace openmc {
//==============================================================================
// Global variables
//==============================================================================
//==============================================================================
// Non-member functions
//==============================================================================
2020-01-14 02:14:09 +00:00
void add_particle_track(Particle& p)
2019-02-19 22:06:20 -06:00
{
p.tracks().emplace_back();
2019-02-19 22:06:20 -06:00
}
void write_particle_track(Particle& p)
2019-02-19 22:06:20 -06:00
{
p.tracks().back().push_back(p.r());
2019-02-19 22:06:20 -06:00
}
void finalize_particle_track(Particle& p)
2019-02-19 22:06:20 -06:00
{
std::string filename =
fmt::format("{}track_{}_{}_{}.h5", settings::path_output,
simulation::current_batch, simulation::current_gen, p.id());
2019-02-19 22:06:20 -06:00
// Determine number of coordinates for each particle
vector<int> n_coords;
for (auto& coords : p.tracks()) {
2019-02-19 22:06:20 -06:00
n_coords.push_back(coords.size());
}
#pragma omp critical (FinalizeParticleTrack)
2019-02-19 22:06:20 -06:00
{
2020-01-20 13:43:02 -06:00
hid_t file_id = file_open(filename, 'w');
2019-02-19 22:06:20 -06:00
write_attribute(file_id, "filetype", "track");
write_attribute(file_id, "version", VERSION_TRACK);
write_attribute(file_id, "n_particles", p.tracks().size());
2019-02-19 22:06:20 -06:00
write_attribute(file_id, "n_coords", n_coords);
for (auto i = 1; i <= p.tracks().size(); ++i) {
const auto& t {p.tracks()[i - 1]};
2019-02-19 22:06:20 -06:00
size_t n = t.size();
xt::xtensor<double, 2> data({n,3});
for (int j = 0; j < n; ++j) {
data(j, 0) = t[j].x;
data(j, 1) = t[j].y;
data(j, 2) = t[j].z;
}
2020-01-20 13:43:02 -06:00
std::string name = fmt::format("coordinates_{}", i);
2019-02-19 22:06:20 -06:00
write_dataset(file_id, name.c_str(), data);
}
file_close(file_id);
}
// Clear particle tracks
p.tracks().clear();
2019-02-19 22:06:20 -06:00
}
} // namespace openmc