diff --git a/src/bin/flat.rs b/src/bin/flat.rs index 5818007..17c5eea 100644 --- a/src/bin/flat.rs +++ b/src/bin/flat.rs @@ -169,20 +169,8 @@ mod riemann { // Γ^i_k_l = .5 * g^i^m * (g_m_k,l + g_m_l,k - g_k_l,m) let g = &space.invmetric(pos); // с верхними индексами let d = space.dmetric(pos); - let mut ret: Tens2 = [Mat2::zero(); 2]; // ret[i][l][k] = sum((m) => .5f * g[m][i] * (d[k][l][m] + d[l][k][m] - d[m][k][l])) - for i in 0..2 { - for l in 0..2 { - for k in 0..2 { - let mut v = 0.0; - for m in 0..2 { - v += g[m][i] * (d[l][k][m] + d[k][m][l] - d[m][k][l]); - } - ret[i][l][k] = 0.5 * v; - } - } - } - ret + make_tens2(|i, l, k| 0.5 * (0..2).map(|m| g[m][i] * (d[l][k][m] + d[k][m][l] - d[m][k][l])).sum::()) } fn dir_deriv(f: impl Fn(Vec2) -> Mat2, pos: Vec2, delta: Vec2) -> Mat2 { @@ -206,6 +194,40 @@ mod riemann { fn diagonal(v: Vec2) -> Mat2 { mat2(v.x, 0.0, 0.0, v.y) } + + fn make_vec2(f: impl Fn(usize) -> f32) -> Vec2 { + vec2(f(0), f(1)) + } + + fn make_mat2(f: impl Fn(usize, usize) -> f32) -> Mat2 { + mat2(f(0, 0), f(0, 1), f(1, 0), f(1, 1)) + } + + fn make_tens2(f: impl Fn(usize, usize, usize) -> f32) -> Tens2 { + std::array::from_fn(|i| make_mat2(|j, k| f(i, j, k))) + } + + #[test] + fn m2() { + let m = make_mat2(|i, j| (i + 2 * j) as f32); + assert_eq!(m[0][0], 0.0); + assert_eq!(m[1][0], 1.0); + assert_eq!(m[0][1], 2.0); + assert_eq!(m[1][1], 3.0); + } + + #[test] + fn t2() { + let t = make_tens2(|i, j, k| (i + 2 * j + 4 * k) as f32); + assert_eq!(t[0][0][0], 0.0); + assert_eq!(t[1][0][0], 1.0); + assert_eq!(t[0][1][0], 2.0); + assert_eq!(t[1][1][0], 3.0); + assert_eq!(t[0][0][1], 4.0); + assert_eq!(t[1][0][1], 5.0); + assert_eq!(t[0][1][1], 6.0); + assert_eq!(t[1][1][1], 7.0); + } } fn smoothstep(x: f32) -> f32 {