diff --git a/src/bin/flat/tube/metric.rs b/src/bin/flat/tube/metric.rs index 8bd5724..96c6fe2 100644 --- a/src/bin/flat/tube/metric.rs +++ b/src/bin/flat/tube/metric.rs @@ -51,8 +51,12 @@ impl Metric for Tube { #[cfg(test)] mod test { + use approx::assert_abs_diff_eq; use glam::{Vec2, vec2}; + use itertools_num::linspace; use crate::riemann::{Decomp2, Metric}; + use crate::tube::Space; + use crate::types::Ray; use super::Tube; #[test] @@ -81,4 +85,118 @@ mod test { } } } + + #[test] + fn test_accelerator() { + let space = Space { + tube: Tube { + inner_radius: 30.0, + outer_radius: 50.0, + internal_halflength: 100.0, + external_halflength: 300.0, + }, + objs: vec![], + }; + let ε = 1e-3; + let off = 10.0; + let steps = 1024; + for ax in [-30.0 + ε, -25.0, -3.0, 17.0, 30.0 - ε] { + for bx in [0.0, ε, 1.0, 7.0, 30.0 - ε] { + let a = vec2(ax, -(space.tube.external_halflength + off)); + let b = vec2(bx, space.tube.external_halflength + off); + let Δ = vec2(bx - ax, 2.0 * (space.tube.internal_halflength + off)); + let dir = Δ / (steps as f32); + let traced = space.trace_iter(Ray { pos: a, dir }).nth(steps).unwrap(); + assert_abs_diff_eq!(traced.pos.x, b.x, epsilon=1.0e-2); + assert_abs_diff_eq!(traced.pos.y, b.y, epsilon=1.0e1); + assert_abs_diff_eq!(traced.dir.x, dir.x, epsilon=1.0e-3); + assert_abs_diff_eq!(traced.dir.y, dir.y, epsilon=1.0e-2); + } + } + } + + #[test] + #[ignore] + fn test_accelerator_slow() { + let space = Space { + tube: Tube { + inner_radius: 30.0, + outer_radius: 50.0, + internal_halflength: 100.0, + external_halflength: 300.0, + }, + objs: vec![], + }; + let ε = 1e-3; + let off = 10.0; + let steps = 4096; + for ax in linspace(-space.tube.inner_radius + ε, space.tube.inner_radius - ε, 20) { + for bx in linspace(-space.tube.inner_radius + ε, space.tube.inner_radius - ε, 20) { + let a = vec2(ax, -(space.tube.external_halflength + off)); + let b = vec2(bx, space.tube.external_halflength + off); + let Δ = vec2(bx - ax, 2.0 * (space.tube.internal_halflength + off)); + let dir = Δ / (steps as f32); + let traced = space.trace_iter(Ray { pos: a, dir }).nth(steps).unwrap(); + assert_abs_diff_eq!(traced.pos.x, b.x, epsilon=1.0e-2); + assert_abs_diff_eq!(traced.pos.y, b.y, epsilon=1.0e0); + assert_abs_diff_eq!(traced.dir.x, dir.x, epsilon=1.0e-3); + assert_abs_diff_eq!(traced.dir.y, dir.y, epsilon=1.0e-3); + } + } + } + + #[test] + #[ignore] // TODO make the metric smooth so that this passes + fn test_accelerator_inner_edge() { + let space = Space { + tube: Tube { + inner_radius: 30.0, + outer_radius: 50.0, + internal_halflength: 100.0, + external_halflength: 300.0, + }, + objs: vec![], + }; + let ε = 1e-3; + let off = 10.0; + let steps = 4096; + for x in [space.tube.inner_radius - ε, space.tube.inner_radius + ε] { + let a = vec2(x, -(space.tube.external_halflength + off)); + let b = vec2(x, space.tube.external_halflength + off); + let Δ = vec2(0.0, 2.0 * (space.tube.internal_halflength + off)); + let dir = Δ / (steps as f32); + let traced = space.trace_iter(Ray { pos: a, dir }).nth(steps).unwrap(); + assert_abs_diff_eq!(traced.pos.x, b.x, epsilon=1.0e0); + assert_abs_diff_eq!(traced.pos.y, b.y, epsilon=1.0e0); + assert_abs_diff_eq!(traced.dir.x, dir.x, epsilon=1.0e-2); + assert_abs_diff_eq!(traced.dir.y, dir.y, epsilon=1.0e-2); + } + } + + #[test] + fn test_accelerator_outer_edge() { + let space = Space { + tube: Tube { + inner_radius: 30.0, + outer_radius: 50.0, + internal_halflength: 100.0, + external_halflength: 300.0, + }, + objs: vec![], + }; + let ε = 1e-3; + let off = 10.0; + let steps = 4096; + for x in [space.tube.outer_radius + ε, space.tube.outer_radius - ε] { + let a = vec2(x, -(space.tube.external_halflength + off)); + let b = vec2(x, space.tube.external_halflength + off); + let Δ = vec2(0.0, 2.0 * (space.tube.external_halflength + off)); + let dir = Δ / (steps as f32); + let traced = space.trace_iter(Ray { pos: a, dir }).nth(steps).unwrap(); + assert_abs_diff_eq!(traced.pos.x, b.x, epsilon=2.0e0); + assert_abs_diff_eq!(traced.pos.y, b.y, epsilon=1.0e0); + assert_abs_diff_eq!(traced.dir.x, dir.x, epsilon=1.0e-2); + assert_abs_diff_eq!(traced.dir.y, dir.y, epsilon=1.0e-2); + } + } }