diff --git a/src/bin/flat/main.rs b/src/bin/flat/main.rs index 04be948..a3e28bb 100644 --- a/src/bin/flat/main.rs +++ b/src/bin/flat/main.rs @@ -627,9 +627,6 @@ impl Tube { mod fns { use crate::FloatExt2; - #[cfg(test)] - use approx::{abs_diff_eq, assert_abs_diff_eq}; - pub struct TubeX { pub min: f32, pub max: f32, @@ -667,44 +664,49 @@ mod fns { pub fn d2u(&self, x: f32) -> f32 { extend_const(x, |x| -2.0 * x.signum() * self.a() * self.root(x).powi(-3), self.external, 0.0) } } - #[test] - fn test_tube_y() { - let testee = TubeY { internal: 100.0, external: 150.0 }; - let ε = 1.0e-4f32; - let δ = 1.0 / 8.0; // Mathematically, you want this to be small. Computationally, you don’t. - let margin = 1.0 / 16.0; - let mul = 1.0 + margin; - assert_abs_diff_eq!(testee.u(testee.external), testee.internal, epsilon = ε); - assert_abs_diff_eq!(testee.u(-testee.external), -testee.internal, epsilon = ε); - assert_abs_diff_eq!(testee.du(testee.external), 1., epsilon = ε); - assert_abs_diff_eq!(testee.du(-testee.external), 1., epsilon = ε); - for x in itertools_num::linspace(-mul * testee.external, mul * testee.external, 100) { - let ux = testee.u(x); - let xux = testee.x(ux); - assert!(abs_diff_eq!(x, xux, epsilon = ε), "At x={}:\nu(x): {}\nx(u(x)): {}\n", x, ux, xux); + #[cfg(test)] + mod test { + use approx::{abs_diff_eq, assert_abs_diff_eq}; - let du_num = (testee.u(x + δ) - testee.u(x - δ)) / (2. * δ); - let du_expl = testee.du(x); - assert!(abs_diff_eq!(du_expl, du_num, epsilon = ε), "At x={}, du/dx:\nnumerical: {}\nexplicit: {}\n", x, du_num, du_expl); + #[test] + fn test_tube_y() { + let testee = super::TubeY { internal: 100.0, external: 150.0 }; + let ε = 1.0e-4f32; + let δ = 1.0 / 8.0; // Mathematically, you want this to be small. Computationally, you don’t. + let margin = 1.0 / 16.0; + let mul = 1.0 + margin; + assert_abs_diff_eq!(testee.u(testee.external), testee.internal, epsilon = ε); + assert_abs_diff_eq!(testee.u(-testee.external), -testee.internal, epsilon = ε); + assert_abs_diff_eq!(testee.du(testee.external), 1., epsilon = ε); + assert_abs_diff_eq!(testee.du(-testee.external), 1., epsilon = ε); + for x in itertools_num::linspace(-mul * testee.external, mul * testee.external, 100) { + let ux = testee.u(x); + let xux = testee.x(ux); + assert!(abs_diff_eq!(x, xux, epsilon = ε), "At x={}:\nu(x): {}\nx(u(x)): {}\n", x, ux, xux); - let dudx = du_expl * testee.dx(ux); - assert!(abs_diff_eq!(dudx, 1.0, epsilon = ε), "At x={}:\ndu/dx * dx/du: {}\n", x, dudx); + let du_num = (testee.u(x + δ) - testee.u(x - δ)) / (2. * δ); + let du_expl = testee.du(x); + assert!(abs_diff_eq!(du_expl, du_num, epsilon = ε), "At x={}, du/dx:\nnumerical: {}\nexplicit: {}\n", x, du_num, du_expl); - let d2u_num = (testee.du(x + δ) - testee.du(x - δ)) / (2. * δ); - let d2u_expl = testee.d2u(x); - assert!(abs_diff_eq!(d2u_expl, d2u_num, epsilon = ε), "At x={}, d^2u/dx^2:\nnumerical: {}\nexplicit: {}\n", x, d2u_num, d2u_expl); - } - for u in itertools_num::linspace(-mul * testee.internal, mul * testee.internal, 100) { - let xu = testee.x(u); - let uxu = testee.u(xu); - assert!(abs_diff_eq!(u, uxu, epsilon = ε), "At u={}:\nx(u): {}\nu(x(u)): {}\n", u, xu, uxu); + let dudx = du_expl * testee.dx(ux); + assert!(abs_diff_eq!(dudx, 1.0, epsilon = ε), "At x={}:\ndu/dx * dx/du: {}\n", x, dudx); - let dx_num = (testee.x(u + δ) - testee.x(u - δ)) / (2. * δ); - let dx_expl = testee.dx(u); - assert!(abs_diff_eq!(dx_expl, dx_num, epsilon = ε), "At u={}, dx/du:\nnumerical: {}\nexplicit: {}\n", u, dx_num, dx_expl); + let d2u_num = (testee.du(x + δ) - testee.du(x - δ)) / (2. * δ); + let d2u_expl = testee.d2u(x); + assert!(abs_diff_eq!(d2u_expl, d2u_num, epsilon = ε), "At x={}, d^2u/dx^2:\nnumerical: {}\nexplicit: {}\n", x, d2u_num, d2u_expl); + } + for u in itertools_num::linspace(-mul * testee.internal, mul * testee.internal, 100) { + let xu = testee.x(u); + let uxu = testee.u(xu); + assert!(abs_diff_eq!(u, uxu, epsilon = ε), "At u={}:\nx(u): {}\nu(x(u)): {}\n", u, xu, uxu); - let dudx = testee.du(xu) * dx_expl; - assert!(abs_diff_eq!(dudx, 1.0, epsilon = ε), "At u={}:\ndu/dx * dx/du: {}\n", u, dudx); + let dx_num = (testee.x(u + δ) - testee.x(u - δ)) / (2. * δ); + let dx_expl = testee.dx(u); + assert!(abs_diff_eq!(dx_expl, dx_num, epsilon = ε), "At u={}, dx/du:\nnumerical: {}\nexplicit: {}\n", u, dx_num, dx_expl); + + let dudx = testee.du(xu) * dx_expl; + assert!(abs_diff_eq!(dudx, 1.0, epsilon = ε), "At u={}:\ndu/dx * dx/du: {}\n", u, dudx); + } } } }