neutrons/
data.rs

1use ndarray::Array3;
2use palette::{Gradient, LinSrgba};
3use std::{ops::AddAssign, path::PathBuf};
4
5use crate::colours::slice;
6
7/// Simulation data.
8pub struct Data {
9    /// Scattering.
10    pub scatters: Array3<f64>,
11    /// Distance travelled.
12    pub travelled: Array3<f64>,
13    /// Total samples.
14    pub total: usize,
15    /// absorbed.
16    pub absorbed: usize,
17    /// Escaped.
18    pub escaped: usize,
19}
20
21impl Data {
22    /// Construct an empty object.
23    #[inline]
24    #[must_use]
25    pub fn new(num_voxels: [usize; 3]) -> Self {
26        Self {
27            scatters: Array3::zeros((num_voxels[0], num_voxels[1], num_voxels[2])),
28            travelled: Array3::zeros((num_voxels[0], num_voxels[1], num_voxels[2])),
29            total: 0,
30            absorbed: 0,
31            escaped: 0,
32        }
33    }
34
35    /// Save the data to file.
36    #[inline]
37    pub fn save(&self, colour_map: &Gradient<LinSrgba>, path: &PathBuf, step: usize) {
38        slice(
39            self.scatters.view(),
40            colour_map,
41            &path.join("scatters"),
42            &format!("{0:>3}", step),
43        );
44        slice(
45            self.travelled.view(),
46            colour_map,
47            &path.join("distance"),
48            &format!("{0:>3}", step),
49        );
50    }
51}
52
53impl AddAssign<&Self> for Data {
54    #[inline]
55    fn add_assign(&mut self, rhs: &Self) {
56        self.scatters += &rhs.scatters;
57        self.travelled += &rhs.travelled;
58        self.total += rhs.total;
59        self.absorbed += rhs.absorbed;
60        self.escaped += rhs.escaped;
61    }
62}