diff --git a/crates/coremem/src/sim/legacy/mod.rs b/crates/coremem/src/sim/legacy/mod.rs index edeadfb..0594faa 100644 --- a/crates/coremem/src/sim/legacy/mod.rs +++ b/crates/coremem/src/sim/legacy/mod.rs @@ -372,10 +372,6 @@ impl + Send + Sync> GenericSim for SimState { SimState::step(self); } } - - fn impulse_e_meters(&mut self, pos: Meters, amount: Vec3) { - *self.get_e_mut(pos) += amount.cast(); - } } #[allow(unused)] @@ -1236,6 +1232,22 @@ mod test { assert_eq!(state.time(), state.timestep()); } + struct ConstStim { + loc: Index, + feature_size: f32, + e: Vec3, + h: Vec3, + } + impl AbstractStimulus for ConstStim { + fn at(&self, _t_sec: f32, loc: Meters) -> (Vec3, Vec3) { + if loc.to_index(self.feature_size) == self.loc { + (self.e, self.h) + } else { + Default::default() + } + } + } + #[test] fn energy_conservation_over_time() { let mut state = SimState::>::new(Index((2001, 1, 1).into()), 1e-6); @@ -1244,9 +1256,12 @@ mod test { let sig = angle.sin(); let gate = 0.5*(1.0 - angle.cos()); //println!("{}", g.exp()); - state.impulse_ez(Index((1000, 0, 0).into()), gate*sig); - //dyn_state.impulse_by(index((x, 0, 0).into()), 1.5e-9*g.exp()); - state.step(); + state.step_multiple(1, &ConstStim { + loc: Index::new(0, 0, 1000), + feature_size: 1e-6, + e: Vec3::new_z(gate*sig/state.timestep()), + h: Vec3::zero(), + }); } let (energy_0, energy_1) = energy_now_and_then(&mut state, 800); // This has some sensitivity to courant number. But surprisingly, not much to f32 v.s. f64 @@ -1260,8 +1275,12 @@ mod test { let angle = (t as f32)/10.0*f32::two_pi(); let sig = angle.sin(); let gate = 1e9 * 0.5*(1.0 - angle.cos()); - state.impulse_ez(Index((10, 10, 10).into()), gate*sig); - state.step(); + state.step_multiple(1, &ConstStim { + loc: Index::new(10, 10, 10), + feature_size: 1e-6, + e: Vec3::new_z(gate*sig/state.timestep()), + h: Vec3::zero(), + }); } let (energy_0, energy_1) = energy_now_and_then(&mut state, 500); // Default boundary conditions reflect waves. @@ -1279,8 +1298,12 @@ mod test { let angle = 2.0*progress*f32::two_pi(); let sig = angle.sin(); let gate = (progress*f32::pi()).sin(); - state.impulse_ez(Index((100, 0, 0).into()), gate*sig); - state.step(); + state.step_multiple(1, &ConstStim { + loc: Index::new(100, 0, 0), + feature_size: 1e-6, + e: Vec3::new_z(gate*sig/state.timestep()), + h: Vec3::zero(), + }); } energy_now_and_then(&mut state, 1000) } diff --git a/crates/coremem/src/sim/mod.rs b/crates/coremem/src/sim/mod.rs index 3619d6f..7526eb4 100644 --- a/crates/coremem/src/sim/mod.rs +++ b/crates/coremem/src/sim/mod.rs @@ -126,23 +126,6 @@ pub trait GenericSim: SampleableSim { self.step_multiple(1, &NoopStimulus); } fn step_multiple(&mut self, num_steps: u32, s: &S); - - /// DEPRECATED. Use stimulus instead - fn impulse_e_meters(&mut self, pos: Meters, amount: Vec3); - - fn impulse_e(&mut self, pos: C, amt: Vec3) { - self.impulse_e_meters(pos.to_meters(self.feature_size()), amt) - } - - fn impulse_ex(&mut self, c: C, ex: f32) { - self.impulse_e(c, Vec3::new_x(ex)); - } - fn impulse_ey(&mut self, c: C, ey: f32) { - self.impulse_e(c, Vec3::new_y(ey)); - } - fn impulse_ez(&mut self, c: C, ez: f32) { - self.impulse_e(c, Vec3::new_z(ez)); - } } /// Conceptually, one cell looks like this (in 2d): diff --git a/crates/coremem/src/sim/spirv/mod.rs b/crates/coremem/src/sim/spirv/mod.rs index b69ed36..56b292f 100644 --- a/crates/coremem/src/sim/spirv/mod.rs +++ b/crates/coremem/src/sim/spirv/mod.rs @@ -160,12 +160,6 @@ where ); self.step_no += num_steps as u64; } - - fn impulse_e_meters(&mut self, pos: Meters, amount: Vec3) { - let idx = pos.to_index(self.feature_size()); - let flat_idx = self.flat_index(idx).unwrap(); - self.e[flat_idx] += amount.cast(); - } } impl SpirvSim