Functional!
This commit is contained in:
parent
9ce8da5f38
commit
07034a6c7a
|
|
@ -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)
|
// Γ^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 g = &space.invmetric(pos); // с верхними индексами
|
||||||
let d = space.dmetric(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]))
|
// 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 {
|
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::<f32>())
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn dir_deriv(f: impl Fn(Vec2) -> Mat2, pos: Vec2, delta: Vec2) -> Mat2 {
|
fn dir_deriv(f: impl Fn(Vec2) -> Mat2, pos: Vec2, delta: Vec2) -> Mat2 {
|
||||||
|
|
@ -206,6 +194,40 @@ mod riemann {
|
||||||
fn diagonal(v: Vec2) -> Mat2 {
|
fn diagonal(v: Vec2) -> Mat2 {
|
||||||
mat2(v.x, 0.0, 0.0, v.y)
|
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 {
|
fn smoothstep(x: f32) -> f32 {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user