1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//! Event-specific code for particles crossing a cell's facet
//!
//! This module contains code that updates a particle according to the facet
//! it is crossing. See [MCSubfacetAdjacencyEvent] for more information.

use crate::{
    constants::CustomFloat,
    data::tallies::MCTallyEvent,
    geometry::facets::{MCSubfacetAdjacencyEvent, SubfacetAdjacency},
    particles::mc_particle::MCParticle,
};

/// Computes and transform accordingly a [MCParticle] object crossing a facet.
///
/// This function updates a particle's locational data according to one of the
/// four defined adjacency events ([MCSubfacetAdjacencyEvent]). Note that in a
/// sequential or a memory-shared parallelism context, there are no off-processor
/// transit as the mesh is not divided for management.
pub fn facet_crossing_event<T: CustomFloat>(
    particle: &mut MCParticle<T>,
    facet_adjacency: &SubfacetAdjacency,
) {
    match facet_adjacency.event {
        MCSubfacetAdjacencyEvent::TransitOnProcessor => {
            // particle enters an adjacent cell
            particle.domain = facet_adjacency.adjacent.domain.unwrap();
            particle.cell = facet_adjacency.adjacent.cell.unwrap();
            particle.facet = facet_adjacency.adjacent.facet.unwrap();
            particle.last_event = MCTallyEvent::FacetCrossingTransitExit;
        }
        MCSubfacetAdjacencyEvent::BoundaryEscape => {
            // particle escape the system
            particle.last_event = MCTallyEvent::FacetCrossingEscape;
        }
        MCSubfacetAdjacencyEvent::BoundaryReflection => {
            // particle reflect off a system boundary
            particle.last_event = MCTallyEvent::FacetCrossingReflection
        }
        MCSubfacetAdjacencyEvent::TransitOffProcessor => {
            // particle enters an adjacent cell that belongs to
            // a domain managed by another processor.
            particle.domain = facet_adjacency.adjacent.domain.unwrap();
            particle.cell = facet_adjacency.adjacent.cell.unwrap();
            particle.facet = facet_adjacency.adjacent.facet.unwrap();
            particle.last_event = MCTallyEvent::FacetCrossingCommunication;
        }
        MCSubfacetAdjacencyEvent::AdjacencyUndefined => panic!(),
    }
}