From b3821256cbf893689abf550a0c55ac0770a9b890 Mon Sep 17 00:00:00 2001 From: John Tramm Date: Sun, 19 Jan 2020 20:39:36 +0000 Subject: [PATCH] Moved redundant particle queuing code into its own function. --- src/event.cpp | 162 +++++++++++++++++++-------------------------- src/simulation.cpp | 5 -- 2 files changed, 69 insertions(+), 98 deletions(-) diff --git a/src/event.cpp b/src/event.cpp index 2dfbb3ed5d..9e40100708 100644 --- a/src/event.cpp +++ b/src/event.cpp @@ -3,6 +3,29 @@ namespace openmc { +//============================================================================== +// Global variables +//============================================================================== + +namespace simulation { + +std::unique_ptr calculate_fuel_xs_queue; +std::unique_ptr calculate_nonfuel_xs_queue; +std::unique_ptr advance_particle_queue; +std::unique_ptr surface_crossing_queue; +std::unique_ptr collision_queue; +std::unique_ptr particles; + +int64_t calculate_fuel_xs_queue_length {0}; +int64_t calculate_nonfuel_xs_queue_length {0}; +int64_t advance_particle_queue_length {0}; +int64_t surface_crossing_queue_length {0}; +int64_t collision_queue_length {0}; + +int64_t max_particles_in_flight {100000}; + +} // namespace simulation + //============================================================================== // Non-member functions //============================================================================== @@ -27,37 +50,33 @@ void free_event_queues(void) simulation::particles.reset(); } +void enqueue_particle(QueueItem* queue, int64_t& length, Particle* p, int64_t buffer_idx, bool use_atomic) +{ + int64_t idx; + if (use_atomic) { + #pragma omp atomic capture + idx = length++; + } else { + idx = length++; + } + + queue[idx].idx = buffer_idx; + queue[idx].E = p->E_; + queue[idx].material = p->material_; + queue[idx].type = p->type_; +} + void dispatch_xs_event(int64_t i) { Particle* p = &simulation::particles[i]; int64_t idx; - if (p->material_ == MATERIAL_VOID) { - #pragma omp atomic capture - idx = simulation::calculate_nonfuel_xs_queue_length++; - simulation::calculate_nonfuel_xs_queue[idx].idx = i; - simulation::calculate_nonfuel_xs_queue[idx].E = p->E_; - simulation::calculate_nonfuel_xs_queue[idx].material = p->material_; - simulation::calculate_nonfuel_xs_queue[idx].type = p->type_; - } - else - { - if (model::materials[p->material_]->fissionable_) { - #pragma omp atomic capture - idx = simulation::calculate_fuel_xs_queue_length++; - simulation::calculate_fuel_xs_queue[idx].idx = i; - simulation::calculate_fuel_xs_queue[idx].E = p->E_; - simulation::calculate_fuel_xs_queue[idx].material = p->material_; - simulation::calculate_fuel_xs_queue[idx].type = p->type_; - } - else - { - #pragma omp atomic capture - idx = simulation::calculate_nonfuel_xs_queue_length++; - simulation::calculate_nonfuel_xs_queue[idx].idx = i; - simulation::calculate_nonfuel_xs_queue[idx].E = p->E_; - simulation::calculate_nonfuel_xs_queue[idx].material = p->material_; - simulation::calculate_nonfuel_xs_queue[idx].type = p->type_; - } + if (p->material_ == MATERIAL_VOID || + !model::materials[p->material_]->fissionable_) { + enqueue_particle(simulation::calculate_nonfuel_xs_queue.get(), + simulation::calculate_nonfuel_xs_queue_length, p, i, true); + } else { + enqueue_particle(simulation::calculate_fuel_xs_queue.get(), + simulation::calculate_fuel_xs_queue_length, p, i, true); } } @@ -68,49 +87,27 @@ void process_calculate_xs_events(QueueItem* queue, int64_t n) // Save last_ members, find grid index #pragma omp parallel for schedule(runtime) - for (auto i = 0; i < n; i++) { + for (int64_t i = 0; i < n; i++) { Particle* p = &simulation::particles[queue[i].idx]; p->event_calculate_xs(); + enqueue_particle(simulation::advance_particle_queue.get(), + simulation::advance_particle_queue_length, p, queue[i].idx, true); } - - int64_t start = simulation::advance_particle_queue_length; - int64_t end = start + n; - int64_t j = 0; - for (auto i = start; i < end; i++) { - simulation::advance_particle_queue[i].idx = queue[j].idx; - simulation::advance_particle_queue[i].E = simulation::particles[queue[j].idx].E_; - simulation::advance_particle_queue[i].material = simulation::particles[queue[j].idx].material_; - simulation::advance_particle_queue[i].type = simulation::particles[queue[j].idx].type_; - j++; - } - simulation::advance_particle_queue_length += n; } void process_advance_particle_events() { #pragma omp parallel for schedule(runtime) - for (auto i = 0; i < simulation::advance_particle_queue_length; i++) { - Particle* p = &simulation::particles[simulation::advance_particle_queue[i].idx]; + for (int64_t i = 0; i < simulation::advance_particle_queue_length; i++) { + int64_t buffer_idx = simulation::advance_particle_queue[i].idx; + Particle* p = &simulation::particles[buffer_idx]; p->event_advance(); - if( p->collision_distance_ > p->boundary_.distance ) - { - int64_t idx; - #pragma omp atomic capture - idx = simulation::surface_crossing_queue_length++; - simulation::surface_crossing_queue[idx].idx = simulation::advance_particle_queue[i].idx; - simulation::surface_crossing_queue[idx].E = p->E_; - simulation::surface_crossing_queue[idx].material = p->material_; - simulation::surface_crossing_queue[idx].type = p->type_; - } - else - { - int64_t idx; - #pragma omp atomic capture - idx = simulation::collision_queue_length++; - simulation::collision_queue[idx].idx = simulation::advance_particle_queue[i].idx; - simulation::collision_queue[idx].E = p->E_; - simulation::collision_queue[idx].material = p->material_; - simulation::collision_queue[idx].type = p->type_; + if (p->collision_distance_ > p->boundary_.distance) { + enqueue_particle(simulation::surface_crossing_queue.get(), + simulation::surface_crossing_queue_length, p, buffer_idx, true); + } else { + enqueue_particle(simulation::collision_queue.get(), + simulation::collision_queue_length, p, buffer_idx, true); } } } @@ -118,12 +115,13 @@ void process_advance_particle_events() void process_surface_crossing_events() { #pragma omp parallel for schedule(runtime) - for (auto i = 0; i < simulation::surface_crossing_queue_length; i++) { - Particle* p = &simulation::particles[simulation::surface_crossing_queue[i].idx]; + for (int64_t i = 0; i < simulation::surface_crossing_queue_length; i++) { + int64_t buffer_index = simulation::surface_crossing_queue[i].idx; + Particle* p = &simulation::particles[buffer_index]; p->event_cross_surface(); p->event_revive_from_secondary(); if (p->alive_) - dispatch_xs_event(simulation::surface_crossing_queue[i].idx); + dispatch_xs_event(buffer_index); } } @@ -131,12 +129,13 @@ void process_surface_crossing_events() void process_collision_events() { #pragma omp parallel for schedule(runtime) - for (auto i = 0; i < simulation::collision_queue_length; i++) { - Particle* p = &simulation::particles[simulation::collision_queue[i].idx]; + for (int64_t i = 0; i < simulation::collision_queue_length; i++) { + int64_t buffer_index = simulation::collision_queue[i].idx; + Particle* p = &simulation::particles[buffer_index]; p->event_collide(); p->event_revive_from_secondary(); if (p->alive_) - dispatch_xs_event(simulation::collision_queue[i].idx); + dispatch_xs_event(buffer_index); } } @@ -144,33 +143,10 @@ void process_collision_events() void process_death_events(int64_t n_particles) { #pragma omp parallel for schedule(runtime) - for (auto i = 0; i < n_particles; i++) { - Particle& p = simulation::particles[i]; - p.event_death(); + for (int64_t i = 0; i < n_particles; i++) { + Particle* p = &simulation::particles[i]; + p->event_death(); } } -//============================================================================== -// Global variables -//============================================================================== - -namespace simulation { - -std::unique_ptr calculate_fuel_xs_queue; -std::unique_ptr calculate_nonfuel_xs_queue; -std::unique_ptr advance_particle_queue; -std::unique_ptr surface_crossing_queue; -std::unique_ptr collision_queue; -std::unique_ptr particles; - -int64_t calculate_fuel_xs_queue_length {0}; -int64_t calculate_nonfuel_xs_queue_length {0}; -int64_t advance_particle_queue_length {0}; -int64_t surface_crossing_queue_length {0}; -int64_t collision_queue_length {0}; - -int64_t max_particles_in_flight {100000}; - -} // namespace simulation - } // namespace openmc diff --git a/src/simulation.cpp b/src/simulation.cpp index fef56dee85..b58f397397 100644 --- a/src/simulation.cpp +++ b/src/simulation.cpp @@ -624,11 +624,6 @@ void transport_event_based() #pragma omp parallel for schedule(runtime) for (auto i = 0; i < n_particles; i++) { initialize_history(&simulation::particles[i], source_offset + i + 1); - } - - // Add all particles to the XS lookup queue - #pragma omp parallel for schedule(runtime) - for (auto i = 0; i < n_particles; i++) { dispatch_xs_event(i); }