use russell_lab::{Matrix, Vector};
pub struct Tet10 {}
impl Tet10 {
pub const GEO_NDIM: usize = 3;
pub const NNODE: usize = 10;
pub const NEDGE: usize = 6;
pub const NFACE: usize = 4;
pub const EDGE_NNODE: usize = 3;
pub const FACE_NNODE: usize = 6;
pub const FACE_NEDGE: usize = 3;
#[rustfmt::skip]
pub const EDGE_NODE_IDS: [[usize; Tet10::EDGE_NNODE]; Tet10::NEDGE] = [
[0, 1, 4],
[1, 2, 5],
[2, 0, 6],
[0, 3, 7],
[1, 3, 8],
[2, 3, 9],
];
#[rustfmt::skip]
pub const FACE_NODE_IDS: [[usize; Tet10::FACE_NNODE]; Tet10::NFACE] = [
[0, 3, 2, 7, 9, 6],
[0, 1, 3, 4, 8, 7],
[0, 2, 1, 6, 5, 4],
[1, 2, 3, 5, 9, 8],
];
#[rustfmt::skip]
pub const FACE_EDGE_NODE_IDS: [[[usize; Tet10::EDGE_NNODE]; Tet10::FACE_NEDGE]; Tet10::NFACE] = [
[[0, 3, 7], [3, 2, 9], [2, 0, 6]],
[[0, 1, 4], [1, 3, 8], [3, 0, 7]],
[[0, 2, 6], [2, 1, 5], [1, 0, 4]],
[[1, 2, 5], [2, 3, 9], [3, 1, 8]],
];
#[rustfmt::skip]
pub const NODE_REFERENCE_COORDS: [[f64; Tet10::GEO_NDIM]; Tet10::NNODE] = [
[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.5, 0.0], [0.0, 0.0, 0.5], [0.5, 0.0, 0.5], [0.0, 0.5, 0.5], ];
pub fn calc_interp(interp: &mut Vector, ksi: &[f64]) {
let (r, s, t) = (ksi[0], ksi[1], ksi[2]);
let u = 1.0 - r - s - t;
interp[0] = u * (2.0 * u - 1.0);
interp[1] = r * (2.0 * r - 1.0);
interp[2] = s * (2.0 * s - 1.0);
interp[3] = t * (2.0 * t - 1.0);
interp[4] = 4.0 * u * r;
interp[5] = 4.0 * r * s;
interp[6] = 4.0 * s * u;
interp[7] = 4.0 * u * t;
interp[8] = 4.0 * r * t;
interp[9] = 4.0 * s * t;
}
pub fn calc_deriv(deriv: &mut Matrix, ksi: &[f64]) {
let (r, s, t) = (ksi[0], ksi[1], ksi[2]);
deriv.set(0, 0, 4.0 * (r + s + t) - 3.0);
deriv.set(1, 0, 4.0 * r - 1.0);
deriv.set(2, 0, 0.0);
deriv.set(3, 0, 0.0);
deriv.set(4, 0, 4.0 - 8.0 * r - 4.0 * s - 4.0 * t);
deriv.set(5, 0, 4.0 * s);
deriv.set(6, 0, -4.0 * s);
deriv.set(7, 0, -4.0 * t);
deriv.set(8, 0, 4.0 * t);
deriv.set(9, 0, 0.0);
deriv.set(0, 1, 4.0 * (r + s + t) - 3.0);
deriv.set(1, 1, 0.0);
deriv.set(2, 1, 4.0 * s - 1.0);
deriv.set(3, 1, 0.0);
deriv.set(4, 1, -4.0 * r);
deriv.set(5, 1, 4.0 * r);
deriv.set(6, 1, 4.0 - 4.0 * r - 8.0 * s - 4.0 * t);
deriv.set(7, 1, -4.0 * t);
deriv.set(8, 1, 0.0);
deriv.set(9, 1, 4.0 * t);
deriv.set(0, 2, 4.0 * (r + s + t) - 3.0);
deriv.set(1, 2, 0.0);
deriv.set(2, 2, 0.0);
deriv.set(3, 2, 4.0 * t - 1.0);
deriv.set(4, 2, -4.0 * r);
deriv.set(5, 2, 0.0);
deriv.set(6, 2, -4.0 * s);
deriv.set(7, 2, 4.0 - 4.0 * r - 4.0 * s - 8.0 * t);
deriv.set(8, 2, 4.0 * r);
deriv.set(9, 2, 4.0 * s);
}
}