spirv test: mb_ferromagnet tests both e and h fields
we have to lessen the bounds a little bit. no surprise: *not testing h* caused them to differ substantially. i'd like to test more strenuously, but that would likely require enabling R64 on the gpu side.
This commit is contained in:
@@ -705,8 +705,8 @@ mod test {
|
||||
) {
|
||||
use rand::{Rng as _, SeedableRng as _};
|
||||
let mut rng = rand::rngs::StdRng::seed_from_u64(seed);
|
||||
let mut ref_state = SpirvSim::new_with_backend(size, 1e-3, CpuBackend::default());
|
||||
let mut dut_state = SpirvSim::new_with_backend(size, 1e-3, WgpuBackend::default());
|
||||
let mut cpu_state = SpirvSim::new_with_backend(size, 1e-3, CpuBackend::default());
|
||||
let mut wgpu_state = SpirvSim::new_with_backend(size, 1e-3, WgpuBackend::default());
|
||||
|
||||
for z in 0..size.z() {
|
||||
for y in 0..size.y() {
|
||||
@@ -716,17 +716,17 @@ mod test {
|
||||
rng.gen_range(0.0..1e6),
|
||||
rng.gen_range(0.0..1e6),
|
||||
);
|
||||
ref_state.put_material(Index::new(x, y, z), AnisomorphicConductor::new(cond.cast()));
|
||||
dut_state.put_material(Index::new(x, y, z), AnisomorphicConductor::new(cond.cast()));
|
||||
cpu_state.put_material(Index::new(x, y, z), AnisomorphicConductor::new(cond.cast()));
|
||||
wgpu_state.put_material(Index::new(x, y, z), AnisomorphicConductor::new(cond.cast()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: we should apply this on every frame?
|
||||
ref_state.apply_stimulus(&RngStimulus::new(seed));
|
||||
dut_state.apply_stimulus(&RngStimulus::new(seed));
|
||||
cpu_state.apply_stimulus(&RngStimulus::new(seed));
|
||||
wgpu_state.apply_stimulus(&RngStimulus::new(seed));
|
||||
|
||||
test_same_explicit(ref_state, dut_state, step_iters, steps_per_iter);
|
||||
test_same_explicit(cpu_state, wgpu_state, step_iters, steps_per_iter);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -744,8 +744,8 @@ mod test {
|
||||
) {
|
||||
use rand::{Rng as _, SeedableRng as _};
|
||||
let mut rng = rand::rngs::StdRng::seed_from_u64(seed);
|
||||
let mut ref_state = SpirvSim::new_with_backend(size, 1e-3, CpuBackend::default());
|
||||
let mut dut_state = SpirvSim::new_with_backend(size, 1e-3, WgpuBackend::default());
|
||||
let mut cpu_state = SpirvSim::new_with_backend(size, 1e-3, CpuBackend::default());
|
||||
let mut wgpu_state = SpirvSim::new_with_backend(size, 1e-3, WgpuBackend::default());
|
||||
|
||||
for z in 0..size.z() {
|
||||
for y in 0..size.y() {
|
||||
@@ -760,21 +760,19 @@ mod test {
|
||||
let slope = rng.gen_range(0.0..0.9*f32::mu0_inv());
|
||||
let b_end = b_start + b_range;
|
||||
let m_max = b_range * slope;
|
||||
ref_state.put_material(Index::new(x, y, z), coremem_cross::mat::MBPgram::new(
|
||||
let mat = coremem_cross::mat::MBPgram::new(
|
||||
b_start.cast(), b_end.cast(), m_max.cast()
|
||||
));
|
||||
dut_state.put_material(Index::new(x, y, z), coremem_cross::mat::MBPgram::new(
|
||||
b_start.cast(), b_end.cast(), m_max.cast()
|
||||
));
|
||||
);
|
||||
cpu_state.put_material(Index::new(x, y, z), mat.clone());
|
||||
wgpu_state.put_material(Index::new(x, y, z), mat.clone());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: use new (not new_e)
|
||||
ref_state.apply_stimulus(&RngStimulus::new_e(seed));
|
||||
dut_state.apply_stimulus(&RngStimulus::new_e(seed));
|
||||
cpu_state.apply_stimulus(&RngStimulus::new(seed));
|
||||
wgpu_state.apply_stimulus(&RngStimulus::new(seed));
|
||||
|
||||
test_same_explicit(ref_state, dut_state, step_iters, steps_per_iter);
|
||||
test_same_explicit(cpu_state, wgpu_state, step_iters, steps_per_iter);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -783,22 +781,22 @@ mod test {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn mb_ferromagnet_100_steps_larger() {
|
||||
test_same_mb_ferromagnet(0x1234, 10, 10, Index::new(96, 16, 8));
|
||||
fn mb_ferromagnet_50_steps_larger() {
|
||||
test_same_mb_ferromagnet(0x1234, 10, 5, Index::new(96, 16, 8));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn step_multiple_with_stim() {
|
||||
let size = Index::new(4, 12, 8);
|
||||
let mut ref_state: SpirvSim<R32, FullyGenericMaterial<R32>, CpuBackend> =
|
||||
let mut cpu_state: SpirvSim<R32, FullyGenericMaterial<R32>, CpuBackend> =
|
||||
SpirvSim::new(size, 1e-3);
|
||||
let mut dut_state: SpirvSim<R32, FullyGenericMaterial<R32>, WgpuBackend> =
|
||||
let mut wgpu_state: SpirvSim<R32, FullyGenericMaterial<R32>, WgpuBackend> =
|
||||
SpirvSim::new(size, 1e-3);
|
||||
let stim = stim::Fields::new_e(Vec3::new(1.0e15, 2.0e15, -3.0e15).cast::<R32>());
|
||||
for _ in 0..5 {
|
||||
ref_state.step_multiple(100, &stim);
|
||||
dut_state.step_multiple(100, &stim);
|
||||
assert_simstate_eq(&dut_state, &ref_state);
|
||||
cpu_state.step_multiple(100, &stim);
|
||||
wgpu_state.step_multiple(100, &stim);
|
||||
assert_simstate_eq(&wgpu_state, &cpu_state);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user