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