use russell_lab::{Matrix, Vector};
pub struct Qua12 {}
impl Qua12 {
pub const GEO_NDIM: usize = 2;
pub const NNODE: usize = 12;
pub const NEDGE: usize = 4;
pub const NFACE: usize = 0;
pub const EDGE_NNODE: usize = 4;
pub const FACE_NNODE: usize = 0;
pub const FACE_NEDGE: usize = 0;
pub const TRIANGULATE_NTRIANGLE: usize = 18;
pub const TRIANGULATE_EXTRA_NNODE: usize = 4;
#[rustfmt::skip]
pub const EDGE_NODE_IDS: [[usize; Qua12::EDGE_NNODE]; Qua12::NEDGE] = [
[1, 0, 8, 4],
[2, 1, 9, 5],
[3, 2, 10, 6],
[0, 3, 11, 7]
];
#[rustfmt::skip]
pub const EDGE_NODE_IDS_INWARD: [[usize; Qua12::EDGE_NNODE]; Qua12::NEDGE] = [
[0, 1, 4, 8],
[1, 2, 5, 9],
[2, 3, 6, 10],
[3, 0, 7, 11]
];
#[rustfmt::skip]
pub const NODE_REFERENCE_COORDS: [[f64; Qua12::GEO_NDIM]; Qua12::NNODE] = [
[-1.0 , -1.0 ],
[ 1.0 , -1.0 ],
[ 1.0 , 1.0 ],
[-1.0 , 1.0 ],
[-1.0 / 3.0 , -1.0 ],
[ 1.0 , -1.0 / 3.0 ],
[ 1.0 / 3.0 , 1.0 ],
[-1.0 , 1.0 / 3.0 ],
[ 1.0 / 3.0 , -1.0 ],
[ 1.0 , 1.0 / 3.0 ],
[-1.0 / 3.0 , 1.0 ],
[-1.0 , -1.0 / 3.0 ],
];
#[rustfmt::skip]
pub const TRIANGULATE_TRIANGLES: [[usize; 3]; Qua12::TRIANGULATE_NTRIANGLE] = [
[ 0, 4, 11], [ 4, 12, 11], [ 4, 8, 12], [ 8, 13, 12], [ 8, 1, 13], [ 1, 5, 13], [11, 12, 7], [12, 15, 7], [12, 13, 15], [13, 14, 15], [13, 5, 14], [ 5, 9, 14], [ 7, 15, 3], [15, 10, 3], [15, 14, 10], [14, 6, 10], [14, 9, 6], [ 9, 2, 6], ];
#[rustfmt::skip]
pub const TRIANGULATE_EXTRA_COORDS: [[f64; Qua12::GEO_NDIM]; Qua12::TRIANGULATE_EXTRA_NNODE] = [
[-1.0 / 3.0 , -1.0 / 3.0 ], [ 1.0 / 3.0 , -1.0 / 3.0 ], [ 1.0 / 3.0 , 1.0 / 3.0 ], [-1.0 / 3.0 , 1.0 / 3.0 ], ];
pub fn calc_interp(interp: &mut Vector, ksi: &[f64]) {
let (r, s) = (ksi[0], ksi[1]);
let rm = 1.0 - r;
let rp = 1.0 + r;
let sm = 1.0 - s;
let sp = 1.0 + s;
interp[0] = rm * sm * (9.0 * (r * r + s * s) - 10.0) / 32.0;
interp[1] = rp * sm * (9.0 * (r * r + s * s) - 10.0) / 32.0;
interp[2] = rp * sp * (9.0 * (r * r + s * s) - 10.0) / 32.0;
interp[3] = rm * sp * (9.0 * (r * r + s * s) - 10.0) / 32.0;
interp[4] = 9.0 * (1.0 - r * r) * (1.0 - 3.0 * r) * sm / 32.0;
interp[5] = 9.0 * (1.0 - s * s) * (1.0 - 3.0 * s) * rp / 32.0;
interp[6] = 9.0 * (1.0 - r * r) * (1.0 + 3.0 * r) * sp / 32.0;
interp[7] = 9.0 * (1.0 - s * s) * (1.0 + 3.0 * s) * rm / 32.0;
interp[8] = 9.0 * (1.0 - r * r) * (1.0 + 3.0 * r) * sm / 32.0;
interp[9] = 9.0 * (1.0 - s * s) * (1.0 + 3.0 * s) * rp / 32.0;
interp[10] = 9.0 * (1.0 - r * r) * (1.0 - 3.0 * r) * sp / 32.0;
interp[11] = 9.0 * (1.0 - s * s) * (1.0 - 3.0 * s) * rm / 32.0;
}
pub fn calc_deriv(deriv: &mut Matrix, ksi: &[f64]) {
let (r, s) = (ksi[0], ksi[1]);
let rm = 1.0 - r;
let rp = 1.0 + r;
let sm = 1.0 - s;
let sp = 1.0 + s;
deriv.set(0, 0, sm * (9.0 * (2.0 * r - 3.0 * r * r - s * s) + 10.0) / 32.0);
deriv.set(1, 0, sm * (9.0 * (2.0 * r + 3.0 * r * r + s * s) - 10.0) / 32.0);
deriv.set(2, 0, sp * (9.0 * (2.0 * r + 3.0 * r * r + s * s) - 10.0) / 32.0);
deriv.set(3, 0, sp * (9.0 * (2.0 * r - 3.0 * r * r - s * s) + 10.0) / 32.0);
deriv.set(4, 0, 9.0 * sm * (9.0 * r * r - 2.0 * r - 3.0) / 32.0);
deriv.set(5, 0, 9.0 * (1.0 - s * s) * (1.0 - 3.0 * s) / 32.0);
deriv.set(6, 0, 9.0 * sp * (-9.0 * r * r - 2.0 * r + 3.0) / 32.0);
deriv.set(7, 0, -9.0 * (1.0 - s * s) * (1.0 + 3.0 * s) / 32.0);
deriv.set(8, 0, 9.0 * sm * (-9.0 * r * r - 2.0 * r + 3.0) / 32.0);
deriv.set(9, 0, 9.0 * (1.0 - s * s) * (1.0 + 3.0 * s) / 32.0);
deriv.set(10, 0, 9.0 * sp * (9.0 * r * r - 2.0 * r - 3.0) / 32.0);
deriv.set(11, 0, -9.0 * (1.0 - s * s) * (1.0 - 3.0 * s) / 32.0);
deriv.set(0, 1, rm * (9.0 * (2.0 * s - 3.0 * s * s - r * r) + 10.0) / 32.0);
deriv.set(1, 1, rp * (9.0 * (2.0 * s - 3.0 * s * s - r * r) + 10.0) / 32.0);
deriv.set(2, 1, rp * (9.0 * (2.0 * s + 3.0 * s * s + r * r) - 10.0) / 32.0);
deriv.set(3, 1, rm * (9.0 * (2.0 * s + 3.0 * s * s + r * r) - 10.0) / 32.0);
deriv.set(4, 1, -9.0 * (1.0 - r * r) * (1.0 - 3.0 * r) / 32.0);
deriv.set(5, 1, 9.0 * rp * (9.0 * s * s - 2.0 * s - 3.0) / 32.0);
deriv.set(6, 1, 9.0 * (1.0 - r * r) * (1.0 + 3.0 * r) / 32.0);
deriv.set(7, 1, 9.0 * rm * (-9.0 * s * s - 2.0 * s + 3.0) / 32.0);
deriv.set(8, 1, -9.0 * (1.0 - r * r) * (1.0 + 3.0 * r) / 32.0);
deriv.set(9, 1, 9.0 * rp * (-9.0 * s * s - 2.0 * s + 3.0) / 32.0);
deriv.set(10, 1, 9.0 * (1.0 - r * r) * (1.0 - 3.0 * r) / 32.0);
deriv.set(11, 1, 9.0 * rm * (9.0 * s * s - 2.0 * s - 3.0) / 32.0);
}
}