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