use russell_lab::{Matrix, Vector};
pub struct Qua9 {}
impl Qua9 {
pub const GEO_NDIM: usize = 2;
pub const NNODE: usize = 9;
pub const NEDGE: usize = 4;
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 N_INTERIOR_NODE: usize = 1;
pub const TRIANGULATE_NTRIANGLE: usize = 8;
#[rustfmt::skip]
pub const EDGE_NODE_IDS: [[usize; Qua9::EDGE_NNODE]; Qua9::NEDGE] = [
[1, 0, 4],
[2, 1, 5],
[3, 2, 6],
[0, 3, 7],
];
#[rustfmt::skip]
pub const EDGE_NODE_IDS_INWARD: [[usize; Qua9::EDGE_NNODE]; Qua9::NEDGE] = [
[0, 1, 4],
[1, 2, 5],
[2, 3, 6],
[3, 0, 7],
];
#[rustfmt::skip]
pub const NODE_REFERENCE_COORDS: [[f64; Qua9::GEO_NDIM]; Qua9::NNODE] = [
[-1.0, -1.0],
[ 1.0, -1.0],
[ 1.0, 1.0],
[-1.0, 1.0],
[ 0.0, -1.0],
[ 1.0, 0.0],
[ 0.0, 1.0],
[-1.0, 0.0],
[ 0.0, 0.0],
];
pub const INTERIOR_NODES: [usize; Qua9::N_INTERIOR_NODE] = [8];
#[rustfmt::skip]
pub const TRIANGULATE_TRIANGLES: [[usize; 3]; Qua9::TRIANGULATE_NTRIANGLE] = [
[0, 4, 7], [4, 8, 7], [4, 1, 8], [1, 5, 8], [7, 8, 3], [8, 6, 3], [8, 5, 6], [5, 2, 6], ];
pub fn calc_interp(interp: &mut Vector, ksi: &[f64]) {
let (r, s) = (ksi[0], ksi[1]);
interp[0] = r * (r - 1.0) * s * (s - 1.0) / 4.0;
interp[1] = r * (r + 1.0) * s * (s - 1.0) / 4.0;
interp[2] = r * (r + 1.0) * s * (s + 1.0) / 4.0;
interp[3] = r * (r - 1.0) * s * (s + 1.0) / 4.0;
interp[4] = -(r * r - 1.0) * s * (s - 1.0) / 2.0;
interp[5] = -r * (r + 1.0) * (s * s - 1.0) / 2.0;
interp[6] = -(r * r - 1.0) * s * (s + 1.0) / 2.0;
interp[7] = -r * (r - 1.0) * (s * s - 1.0) / 2.0;
interp[8] = (r * r - 1.0) * (s * s - 1.0);
}
pub fn calc_deriv(deriv: &mut Matrix, ksi: &[f64]) {
let (r, s) = (ksi[0], ksi[1]);
deriv.set(0, 0, (r + r - 1.0) * s * (s - 1.0) / 4.0);
deriv.set(1, 0, (r + r + 1.0) * s * (s - 1.0) / 4.0);
deriv.set(2, 0, (r + r + 1.0) * s * (s + 1.0) / 4.0);
deriv.set(3, 0, (r + r - 1.0) * s * (s + 1.0) / 4.0);
deriv.set(0, 1, r * (r - 1.0) * (s + s - 1.0) / 4.0);
deriv.set(1, 1, r * (r + 1.0) * (s + s - 1.0) / 4.0);
deriv.set(2, 1, r * (r + 1.0) * (s + s + 1.0) / 4.0);
deriv.set(3, 1, r * (r - 1.0) * (s + s + 1.0) / 4.0);
deriv.set(4, 0, -(r + r) * s * (s - 1.0) / 2.0);
deriv.set(5, 0, -(r + r + 1.0) * (s * s - 1.0) / 2.0);
deriv.set(6, 0, -(r + r) * s * (s + 1.0) / 2.0);
deriv.set(7, 0, -(r + r - 1.0) * (s * s - 1.0) / 2.0);
deriv.set(4, 1, -(r * r - 1.0) * (s + s - 1.0) / 2.0);
deriv.set(5, 1, -r * (r + 1.0) * (s + s) / 2.0);
deriv.set(6, 1, -(r * r - 1.0) * (s + s + 1.0) / 2.0);
deriv.set(7, 1, -r * (r - 1.0) * (s + s) / 2.0);
deriv.set(8, 0, 2.0 * r * (s * s - 1.0));
deriv.set(8, 1, 2.0 * s * (r * r - 1.0));
}
}