pub fn multiply(s: f64, p: [f64; 3]) -> [f64; 3] {
[s * p[0], s * p[1], s * p[2]]
}
pub fn modulus(p: [f64; 3]) -> f64 {
(p[0] * p[0] + p[1] * p[1] + p[2] * p[2]).sqrt()
}
pub fn modulus_and_unit_vector(p: [f64; 3]) -> (f64, [f64; 3]) {
let w = modulus(p);
if w == 0.0 {
(0.0, [0.0; 3])
} else {
let u = multiply(1.0 / w, p);
(w, u)
}
}
pub fn outer_product(a: [f64; 3], b: [f64; 3]) -> [f64; 3] {
[
a[1] * b[2] - a[2] * b[1],
a[2] * b[0] - a[0] * b[2],
a[0] * b[1] - a[1] * b[0],
]
}
pub fn inner_product(a: [f64; 3], b: [f64; 3]) -> f64 {
a[0] * b[0] + a[1] * b[1] + a[2] * b[2]
}
pub fn mat_mul_pvec(r: [[f64; 3]; 3], p: [f64; 3]) -> [f64; 3] {
let mut wrp = [0.0; 3];
for (r, wrp) in r.iter().zip(wrp.iter_mut()) {
let mut w = 0.0;
for (r, p) in r.iter().zip(p) {
w += r * p;
}
*wrp = w;
}
wrp
}
pub fn mat_mul_pvvec(r: [[f64; 3]; 3], pv: [[f64; 3]; 2]) -> [[f64; 3]; 2] {
let rp1 = mat_mul_pvec(r, pv[0]);
let rp2 = mat_mul_pvec(r, pv[1]);
[rp1, rp2]
}
pub fn multiply_matrices(a: [[f64; 3]; 3], b: [[f64; 3]; 3]) -> [[f64; 3]; 3] {
let mut wm = [[0.0; 3]; 3];
for (wm, a) in wm.iter_mut().zip(a.iter()) {
for j in 0..3 {
let mut w = 0.0;
for (k, b) in b.iter().enumerate() {
w += a[k] * b[j];
}
wm[j] = w;
}
}
wm
}
pub fn init_matrix(r: &mut [[f64; 3]; 3]) {
r[0][0] = 1.0;
r[0][1] = 0.0;
r[0][2] = 0.0;
r[1][0] = 0.0;
r[1][1] = 1.0;
r[1][2] = 0.0;
r[2][0] = 0.0;
r[2][1] = 0.0;
r[2][2] = 1.0;
}
pub fn rotate_x(phi: f64, r: &mut [[f64; 3]; 3]) {
let (s, c) = phi.sin_cos();
let a10 = c * r[1][0] + s * r[2][0];
let a11 = c * r[1][1] + s * r[2][1];
let a12 = c * r[1][2] + s * r[2][2];
let a20 = -s * r[1][0] + c * r[2][0];
let a21 = -s * r[1][1] + c * r[2][1];
let a22 = -s * r[1][2] + c * r[2][2];
r[1][0] = a10;
r[1][1] = a11;
r[1][2] = a12;
r[2][0] = a20;
r[2][1] = a21;
r[2][2] = a22;
}
pub fn rotate_z(psi: f64, r: &mut [[f64; 3]; 3]) {
let (s, c) = psi.sin_cos();
let a00 = c * r[0][0] + s * r[1][0];
let a01 = c * r[0][1] + s * r[1][1];
let a02 = c * r[0][2] + s * r[1][2];
let a10 = -s * r[0][0] + c * r[1][0];
let a11 = -s * r[0][1] + c * r[1][1];
let a12 = -s * r[0][2] + c * r[1][2];
r[0][0] = a00;
r[0][1] = a01;
r[0][2] = a02;
r[1][0] = a10;
r[1][1] = a11;
r[1][2] = a12;
}
pub fn copy_vector(p: [f64; 3]) -> [f64; 3] {
p
}
pub fn copy_matrix(r: [[f64; 3]; 3]) -> [[f64; 3]; 3] {
r
}