Move fns:: test to a submodule
This commit is contained in:
parent
f2e2767156
commit
b4f7a3045b
|
|
@ -627,9 +627,6 @@ impl Tube {
|
||||||
mod fns {
|
mod fns {
|
||||||
use crate::FloatExt2;
|
use crate::FloatExt2;
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
use approx::{abs_diff_eq, assert_abs_diff_eq};
|
|
||||||
|
|
||||||
pub struct TubeX {
|
pub struct TubeX {
|
||||||
pub min: f32,
|
pub min: f32,
|
||||||
pub max: 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) }
|
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]
|
#[cfg(test)]
|
||||||
fn test_tube_y() {
|
mod test {
|
||||||
let testee = TubeY { internal: 100.0, external: 150.0 };
|
use approx::{abs_diff_eq, assert_abs_diff_eq};
|
||||||
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 du_num = (testee.u(x + δ) - testee.u(x - δ)) / (2. * δ);
|
#[test]
|
||||||
let du_expl = testee.du(x);
|
fn test_tube_y() {
|
||||||
assert!(abs_diff_eq!(du_expl, du_num, epsilon = ε), "At x={}, du/dx:\nnumerical: {}\nexplicit: {}\n", x, du_num, du_expl);
|
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);
|
let du_num = (testee.u(x + δ) - testee.u(x - δ)) / (2. * δ);
|
||||||
assert!(abs_diff_eq!(dudx, 1.0, epsilon = ε), "At x={}:\ndu/dx * dx/du: {}\n", x, dudx);
|
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 dudx = du_expl * testee.dx(ux);
|
||||||
let d2u_expl = testee.d2u(x);
|
assert!(abs_diff_eq!(dudx, 1.0, epsilon = ε), "At x={}:\ndu/dx * dx/du: {}\n", x, dudx);
|
||||||
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 dx_num = (testee.x(u + δ) - testee.x(u - δ)) / (2. * δ);
|
let d2u_num = (testee.du(x + δ) - testee.du(x - δ)) / (2. * δ);
|
||||||
let dx_expl = testee.dx(u);
|
let d2u_expl = testee.d2u(x);
|
||||||
assert!(abs_diff_eq!(dx_expl, dx_num, epsilon = ε), "At u={}, dx/du:\nnumerical: {}\nexplicit: {}\n", u, dx_num, dx_expl);
|
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;
|
let dx_num = (testee.x(u + δ) - testee.x(u - δ)) / (2. * δ);
|
||||||
assert!(abs_diff_eq!(dudx, 1.0, epsilon = ε), "At u={}:\ndu/dx * dx/du: {}\n", u, dudx);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user