diff --git a/crates/coremem/src/sim/spirv/mod.rs b/crates/coremem/src/sim/spirv/mod.rs index 8ddc4b6..978f22d 100644 --- a/crates/coremem/src/sim/spirv/mod.rs +++ b/crates/coremem/src/sim/spirv/mod.rs @@ -1,7 +1,7 @@ use std::borrow::Cow; use serde::{Deserialize, Serialize}; -use log::{info, trace, warn}; +use log::{info, warn}; use crate::diagnostics::SyncDiagnostics; use crate::geom::Index; @@ -67,8 +67,8 @@ impl Clone for SpirvSim { mat: self.mat.clone(), step_no: self.step_no.clone(), // backends can be expensive to clone. - // we require that the caller explicitly init the backend if they need this. - // TODO: this probably shouldn't be a `Clone` method, but like "read_only_clone()". + // instead we default-init them and they're expected to acquire their resources on + // first query. backend: Default::default(), diag: self.diag.clone(), } @@ -197,18 +197,6 @@ where M: Send + Sync + Material + Clone + Into>, B: Send + Sync + SimBackend, { - // TODO: remove this test-only backdoor - #[allow(unused)] // used for test - fn apply_stimulus(&mut self, stim: &dyn Stimulus) { - trace!("apply_stimulus begin"); - iterate_stim(stim, self.size(), self.feature_size(), self.time(), self.meta().time_step().cast(), |pos_idx, value_e, value_h| { - let flat_idx = self.flat_index(pos_idx).unwrap(); - self.e[flat_idx] += value_e.cast(); - self.h[flat_idx] += value_h.cast(); - }); - trace!("apply_stimulus end"); - } - fn eval_stimulus<'a, S: Stimulus>(&self, stim: &'a S) -> Cow<'a, RenderedStimulus> { @@ -226,27 +214,6 @@ where } } -// used for test -fn iterate_stim( - stim: &S, dim: Index, feature_size: f32, t_sec: f32, timestep: R, mut f: F -) -where - R: Real, - S: Stimulus + ?Sized, - F: FnMut(Index, Vec3, Vec3), -{ - // TODO: parallelize - for z in 0..dim.z() { - for y in 0..dim.y() { - for x in 0..dim.x() { - let pos_idx = Index::new(x, y, z); - let densities = stim.at(t_sec.cast(), feature_size.cast(), pos_idx); - let (value_e, value_h) = (densities.e() * timestep, densities.h() * timestep); - f(pos_idx, value_e, value_h) - } - } - } -} #[cfg(test)] mod test { @@ -559,10 +526,10 @@ mod test { } } - dut_state.apply_stimulus(&RngStimulus::new(seed)); + let stim = RngStimulus::new(seed); for step in 0..steps { println!("step {}", step); - dut_state.step(); + dut_state.step_multiple(1, &stim); } } @@ -585,33 +552,33 @@ mod test { mod same { use super::*; use crate::stim::{NoopStimulus, RngStimulus}; - fn test_same_explicit( + fn test_same_explicit>( mut cpu_state: SpirvSim, CpuBackend>, mut wgpu_state: SpirvSim, WgpuBackend>, + stim: &S, step_iters: u64, steps_per_iter: u32 ) { for _ in 0..step_iters { - cpu_state.step_multiple(steps_per_iter, &NoopStimulus); - wgpu_state.step_multiple(steps_per_iter, &NoopStimulus); + cpu_state.step_multiple(steps_per_iter, stim); + wgpu_state.step_multiple(steps_per_iter, stim); assert_simstate_eq(&wgpu_state, &cpu_state); } } fn test_same(seed: u64, step_iters: u64, steps_per_iter: u32, size: Index) { - let mut cpu_state = SpirvSim::new_with_backend(size, 1e-3, CpuBackend::default()); - cpu_state.apply_stimulus(&RngStimulus::new(seed)); + let cpu_state = SpirvSim::new_with_backend(size, 1e-3, CpuBackend::default()); - let mut wgpu_state = SpirvSim::new_with_backend(size, 1e-3, WgpuBackend::default()); - wgpu_state.apply_stimulus(&RngStimulus::new(seed)); + let wgpu_state = SpirvSim::new_with_backend(size, 1e-3, WgpuBackend::default()); + let stim = RngStimulus::new(seed); - test_same_explicit(cpu_state, wgpu_state, step_iters, steps_per_iter); + test_same_explicit(cpu_state, wgpu_state, &stim, step_iters, steps_per_iter); } #[test] fn same_no_step_no_stim() { let cpu_state = SpirvSim::new_with_backend(Index::new(8, 8, 8), 1e-3, CpuBackend::default()); let wgpu_state = SpirvSim::new_with_backend(Index::new(8, 8, 8), 1e-3, WgpuBackend::default()); - test_same_explicit(cpu_state, wgpu_state, 1, 1); + test_same_explicit(cpu_state, wgpu_state, &NoopStimulus, 1, 1); } #[test] @@ -661,11 +628,9 @@ mod test { } } - // TODO: we should apply this on every frame? - cpu_state.apply_stimulus(&RngStimulus::new(seed)); - wgpu_state.apply_stimulus(&RngStimulus::new(seed)); + let stim = RngStimulus::new(seed); - test_same_explicit(cpu_state, wgpu_state, step_iters, steps_per_iter); + test_same_explicit(cpu_state, wgpu_state, &stim, step_iters, steps_per_iter); } #[test] @@ -708,10 +673,9 @@ mod test { } } - cpu_state.apply_stimulus(&RngStimulus::new(seed)); - wgpu_state.apply_stimulus(&RngStimulus::new(seed)); + let stim = RngStimulus::new(seed); - test_same_explicit(cpu_state, wgpu_state, step_iters, steps_per_iter); + test_same_explicit(cpu_state, wgpu_state, &stim, step_iters, steps_per_iter); } #[test] @@ -736,10 +700,9 @@ mod test { ref_state.put_material(Index::new(1, 1, 1), mat.clone()); dut_state.put_material(Index::new(1, 1, 1), mat.clone()); - ref_state.apply_stimulus(&RngStimulus::new(seed)); - dut_state.apply_stimulus(&RngStimulus::new(seed)); + let stim = RngStimulus::new(seed); - test_same_explicit(ref_state, dut_state, steps, 1); + test_same_explicit(ref_state, dut_state, &stim, steps, 1); } #[test] @@ -753,10 +716,9 @@ mod test { ref_state.put_material(Index::new(1, 1, 0), mat.clone()); dut_state.put_material(Index::new(1, 1, 0), mat.clone()); - ref_state.apply_stimulus(&RngStimulus::new(seed)); - dut_state.apply_stimulus(&RngStimulus::new(seed)); + let stim = RngStimulus::new(seed); - test_same_explicit(ref_state, dut_state, steps, 1); + test_same_explicit(ref_state, dut_state, &stim, steps, 1); }