diff --git a/include/openmc/particle.h b/include/openmc/particle.h index 251781f579..1c3e64bf88 100644 --- a/include/openmc/particle.h +++ b/include/openmc/particle.h @@ -319,6 +319,8 @@ public: std::vector flux_derivs_; // Derivatives of the current particle's weight std::vector filter_matches_; + + std::vector> tracks_; }; } // namespace openmc diff --git a/include/openmc/track_output.h b/include/openmc/track_output.h index f32529bc2b..fc65a2eaab 100644 --- a/include/openmc/track_output.h +++ b/include/openmc/track_output.h @@ -9,9 +9,9 @@ namespace openmc { // Non-member functions //============================================================================== -void add_particle_track(); -void write_particle_track(const Particle& p); -void finalize_particle_track(const Particle& p); +void add_particle_track(Particle& p); +void write_particle_track(Particle& p); +void finalize_particle_track(Particle& p); } // namespace openmc diff --git a/src/particle.cpp b/src/particle.cpp index 2fd9425dff..a2518e00b8 100644 --- a/src/particle.cpp +++ b/src/particle.cpp @@ -152,7 +152,7 @@ Particle::transport() } // Prepare to write out particle track. - if (write_track_) add_particle_track(); + if (write_track_) add_particle_track(*this); // Every particle starts with no accumulated flux derivative. if (!model::active_tallies.empty()) @@ -382,7 +382,7 @@ Particle::transport() n_event = 0; // Enter new particle in particle track file - if (write_track_) add_particle_track(); + if (write_track_) add_particle_track(*this); } } diff --git a/src/simulation.cpp b/src/simulation.cpp index a8a3e5f28e..62f0bd2d22 100644 --- a/src/simulation.cpp +++ b/src/simulation.cpp @@ -141,7 +141,7 @@ void revive_particle_from_secondary(Particle* p) // n_event = 0; // Enter new particle in particle track file - if (p->write_track_) add_particle_track(); + if (p->write_track_) add_particle_track(*p); } void dispatch_xs_event(int i) @@ -1284,7 +1284,7 @@ void initialize_history(Particle* p, int64_t index_source) } // Prepare to write out particle track. - if (p->write_track_) add_particle_track(); + if (p->write_track_) add_particle_track(*p); // Every particle starts with no accumulated flux derivative. if (!model::active_tallies.empty()) diff --git a/src/track_output.cpp b/src/track_output.cpp index 50d6d1ef61..10e2498207 100644 --- a/src/track_output.cpp +++ b/src/track_output.cpp @@ -13,37 +13,27 @@ #include #include -// Explicit vector template specialization of threadprivate variable outside of -// the openmc namespace for the picky Intel compiler. -template class std::vector>; - namespace openmc { //============================================================================== // Global variables //============================================================================== -// Forward declaration needed in order to declare tracks as threadprivate -extern std::vector> tracks; -#pragma omp threadprivate(tracks) - -std::vector> tracks; - //============================================================================== // Non-member functions //============================================================================== -void add_particle_track() +void add_particle_track(Particle & p) { - tracks.emplace_back(); + p.tracks_.emplace_back(); } -void write_particle_track(const Particle& p) +void write_particle_track(Particle& p) { - tracks.back().push_back(p.r()); + p.tracks_.back().push_back(p.r()); } -void finalize_particle_track(const Particle& p) +void finalize_particle_track(Particle& p) { std::stringstream filename; filename << settings::path_output << "track_" << simulation::current_batch @@ -51,7 +41,7 @@ void finalize_particle_track(const Particle& p) // Determine number of coordinates for each particle std::vector n_coords; - for (auto& coords : tracks) { + for (auto& coords : p.tracks_) { n_coords.push_back(coords.size()); } @@ -60,10 +50,10 @@ void finalize_particle_track(const Particle& p) hid_t file_id = file_open(filename.str().c_str(), 'w'); write_attribute(file_id, "filetype", "track"); write_attribute(file_id, "version", VERSION_TRACK); - write_attribute(file_id, "n_particles", tracks.size()); + write_attribute(file_id, "n_particles", p.tracks_.size()); write_attribute(file_id, "n_coords", n_coords); - for (int i = 1; i <= tracks.size(); ++i) { - const auto& t {tracks[i-1]}; + for (int i = 1; i <= p.tracks_.size(); ++i) { + const auto& t {p.tracks_[i-1]}; size_t n = t.size(); xt::xtensor data({n,3}); for (int j = 0; j < n; ++j) { @@ -78,7 +68,7 @@ void finalize_particle_track(const Particle& p) } // Clear particle tracks - tracks.clear(); + p.tracks_.clear(); } } // namespace openmc