use russell_lab::{Matrix, Vector};
pub struct Hex8 {}
impl Hex8 {
pub const GEO_NDIM: usize = 3;
pub const NNODE: usize = 8;
pub const NEDGE: usize = 12;
pub const NFACE: usize = 6;
pub const EDGE_NNODE: usize = 2;
pub const FACE_NNODE: usize = 4;
pub const FACE_NEDGE: usize = 4;
#[rustfmt::skip]
pub const EDGE_NODE_IDS: [[usize; Hex8::EDGE_NNODE]; Hex8::NEDGE] = [
[0, 1],
[1, 2],
[2, 3],
[3, 0],
[4, 5],
[5, 6],
[6, 7],
[7, 4],
[0, 4],
[1, 5],
[2, 6],
[3, 7],
];
#[rustfmt::skip]
pub const FACE_NODE_IDS: [[usize; Hex8::FACE_NNODE]; Hex8::NFACE] = [
[0, 4, 7, 3],
[1, 2, 6, 5],
[0, 1, 5, 4],
[2, 3, 7, 6],
[0, 3, 2, 1],
[4, 5, 6, 7],
];
#[rustfmt::skip]
pub const FACE_EDGE_NODE_IDS: [[[usize; Hex8::EDGE_NNODE]; Hex8::FACE_NEDGE]; Hex8::NFACE] = [
[[0, 4], [4, 7], [7, 3], [3, 0]],
[[1, 2], [2, 6], [6, 5], [5, 1]],
[[0, 1], [1, 5], [5, 4], [4, 0]],
[[2, 3], [3, 7], [7, 6], [6, 2]],
[[0, 3], [3, 2], [2, 1], [1, 0]],
[[4, 5], [5, 6], [6, 7], [7, 4]],
];
#[rustfmt::skip]
pub const NODE_REFERENCE_COORDS: [[f64; Hex8::GEO_NDIM]; Hex8::NNODE] = [
[-1.0, -1.0, -1.0],
[ 1.0, -1.0, -1.0],
[ 1.0, 1.0, -1.0],
[-1.0, 1.0, -1.0],
[-1.0, -1.0, 1.0],
[ 1.0, -1.0, 1.0],
[ 1.0, 1.0, 1.0],
[-1.0, 1.0, 1.0],
];
pub fn calc_interp(interp: &mut Vector, ksi: &[f64]) {
let (r, s, t) = (ksi[0], ksi[1], ksi[2]);
let rm = 1.0 - r;
let sm = 1.0 - s;
let tm = 1.0 - t;
let rp = 1.0 + r;
let sp = 1.0 + s;
let tp = 1.0 + t;
interp[0] = rm * sm * tm / 8.0;
interp[1] = rp * sm * tm / 8.0;
interp[2] = rp * sp * tm / 8.0;
interp[3] = rm * sp * tm / 8.0;
interp[4] = rm * sm * tp / 8.0;
interp[5] = rp * sm * tp / 8.0;
interp[6] = rp * sp * tp / 8.0;
interp[7] = rm * sp * tp / 8.0;
}
pub fn calc_deriv(deriv: &mut Matrix, ksi: &[f64]) {
let (r, s, t) = (ksi[0], ksi[1], ksi[2]);
let rm = 1.0 - r;
let sm = 1.0 - s;
let tm = 1.0 - t;
let rp = 1.0 + r;
let sp = 1.0 + s;
let tp = 1.0 + t;
deriv.set(0, 0, -sm * tm / 8.0);
deriv.set(1, 0, sm * tm / 8.0);
deriv.set(2, 0, sp * tm / 8.0);
deriv.set(3, 0, -sp * tm / 8.0);
deriv.set(4, 0, -sm * tp / 8.0);
deriv.set(5, 0, sm * tp / 8.0);
deriv.set(6, 0, sp * tp / 8.0);
deriv.set(7, 0, -sp * tp / 8.0);
deriv.set(0, 1, -rm * tm / 8.0);
deriv.set(1, 1, -rp * tm / 8.0);
deriv.set(2, 1, rp * tm / 8.0);
deriv.set(3, 1, rm * tm / 8.0);
deriv.set(4, 1, -rm * tp / 8.0);
deriv.set(5, 1, -rp * tp / 8.0);
deriv.set(6, 1, rp * tp / 8.0);
deriv.set(7, 1, rm * tp / 8.0);
deriv.set(0, 2, -rm * sm / 8.0);
deriv.set(1, 2, -rp * sm / 8.0);
deriv.set(2, 2, -rp * sp / 8.0);
deriv.set(3, 2, -rm * sp / 8.0);
deriv.set(4, 2, rm * sm / 8.0);
deriv.set(5, 2, rp * sm / 8.0);
deriv.set(6, 2, rp * sp / 8.0);
deriv.set(7, 2, rm * sp / 8.0);
}
}