use russell_lab::{Matrix, Vector};
pub struct Hex32 {}
impl Hex32 {
pub const GEO_NDIM: usize = 3;
pub const NNODE: usize = 32;
pub const NEDGE: usize = 12;
pub const NFACE: usize = 6;
pub const EDGE_NNODE: usize = 4;
pub const FACE_NNODE: usize = 12;
pub const FACE_NEDGE: usize = 4;
#[rustfmt::skip]
pub const EDGE_NODE_IDS: [[usize; Hex32::EDGE_NNODE]; Hex32::NEDGE] = [
[0, 1, 8, 9],
[1, 2, 10, 11],
[2, 3, 12, 13],
[3, 0, 14, 15],
[4, 5, 16, 17],
[5, 6, 18, 19],
[6, 7, 20, 21],
[7, 4, 22, 23],
[0, 4, 24, 25],
[1, 5, 26, 27],
[2, 6, 28, 29],
[3, 7, 30, 31],
];
#[rustfmt::skip]
pub const FACE_NODE_IDS: [[usize; Hex32::FACE_NNODE]; Hex32::NFACE] = [
[0, 4, 7, 3, 24, 23, 31, 14, 25, 22, 30, 15],
[1, 2, 6, 5, 10, 28, 19, 27, 11, 29, 18, 26],
[0, 1, 5, 4, 8, 26, 17, 25, 9, 27, 16, 24],
[2, 3, 7, 6, 12, 30, 21, 29, 13, 31, 20, 28],
[0, 3, 2, 1, 15, 13, 11, 9, 14, 12, 10, 8],
[4, 5, 6, 7, 16, 18, 20, 22, 17, 19, 21, 23],
];
#[rustfmt::skip]
pub const FACE_EDGE_NODE_IDS: [[[usize; Hex32::EDGE_NNODE]; Hex32::FACE_NEDGE]; Hex32::NFACE] = [
[[0, 4, 24, 25], [4, 7, 23, 22], [7, 3, 31, 30], [3, 0, 14, 15]],
[[1, 2, 10, 11], [2, 6, 28, 29], [6, 5, 19, 18], [5, 1, 27, 26]],
[[0, 1, 8, 9], [1, 5, 26, 27], [5, 4, 17, 16], [4, 0, 25, 24]],
[[2, 3, 12, 13], [3, 7, 30, 31], [7, 6, 21, 20], [6, 2, 29, 28]],
[[0, 3, 15, 14], [3, 2, 13, 12], [2, 1, 11, 10], [1, 0, 9, 8]],
[[4, 5, 16, 17], [5, 6, 18, 19], [6, 7, 20, 21], [7, 4, 22, 23]],
];
#[rustfmt::skip]
pub const NODE_REFERENCE_COORDS: [[f64; Hex32::GEO_NDIM]; Hex32::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],
[-1.0/3.0, -1.0, -1.0], [ 1.0/3.0, -1.0, -1.0], [ 1.0, -1.0/3.0, -1.0], [ 1.0, 1.0/3.0, -1.0], [ 1.0/3.0, 1.0, -1.0], [-1.0/3.0, 1.0, -1.0], [ -1.0, 1.0/3.0, -1.0], [ -1.0, -1.0/3.0, -1.0],
[-1.0/3.0, -1.0, 1.0], [ 1.0/3.0, -1.0, 1.0], [ 1.0, -1.0/3.0, 1.0], [ 1.0, 1.0/3.0, 1.0], [ 1.0/3.0, 1.0, 1.0], [-1.0/3.0, 1.0, 1.0], [ -1.0, 1.0/3.0, 1.0], [ -1.0, -1.0/3.0, 1.0],
[-1.0, -1.0, -1.0/3.0], [-1.0, -1.0, 1.0/3.0], [ 1.0, -1.0, -1.0/3.0], [ 1.0, -1.0, 1.0/3.0], [ 1.0, 1.0, -1.0/3.0], [ 1.0, 1.0, 1.0/3.0], [-1.0, 1.0, -1.0/3.0], [-1.0, 1.0, 1.0/3.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;
let r3m = 1.0 - 3.0 * r;
let s3m = 1.0 - 3.0 * s;
let t3m = 1.0 - 3.0 * t;
let r3p = 1.0 + 3.0 * r;
let s3p = 1.0 + 3.0 * s;
let t3p = 1.0 + 3.0 * t;
let rr = 1.0 - r * r;
let ss = 1.0 - s * s;
let tt = 1.0 - t * t;
let rr9 = 9.0 * r * r;
let ss9 = 9.0 * s * s;
let tt9 = 9.0 * t * t;
interp[0] = (rm * sm * tm * (-19.0 + rr9 + ss9 + tt9)) / 64.0;
interp[1] = (rp * sm * tm * (-19.0 + rr9 + ss9 + tt9)) / 64.0;
interp[2] = (rp * sp * tm * (-19.0 + rr9 + ss9 + tt9)) / 64.0;
interp[3] = (rm * sp * tm * (-19.0 + rr9 + ss9 + tt9)) / 64.0;
interp[4] = (rm * sm * tp * (-19.0 + rr9 + ss9 + tt9)) / 64.0;
interp[5] = (rp * sm * tp * (-19.0 + rr9 + ss9 + tt9)) / 64.0;
interp[6] = (rp * sp * tp * (-19.0 + rr9 + ss9 + tt9)) / 64.0;
interp[7] = (rm * sp * tp * (-19.0 + rr9 + ss9 + tt9)) / 64.0;
interp[8] = (9.0 * r3m * rr * sm * tm) / 64.0;
interp[9] = (9.0 * r3p * rr * sm * tm) / 64.0;
interp[10] = (9.0 * rp * s3m * ss * tm) / 64.0;
interp[11] = (9.0 * rp * s3p * ss * tm) / 64.0;
interp[12] = (9.0 * r3p * rr * sp * tm) / 64.0;
interp[13] = (9.0 * r3m * rr * sp * tm) / 64.0;
interp[14] = (9.0 * rm * s3p * ss * tm) / 64.0;
interp[15] = (9.0 * rm * s3m * ss * tm) / 64.0;
interp[16] = (9.0 * r3m * rr * sm * tp) / 64.0;
interp[17] = (9.0 * r3p * rr * sm * tp) / 64.0;
interp[18] = (9.0 * rp * s3m * ss * tp) / 64.0;
interp[19] = (9.0 * rp * s3p * ss * tp) / 64.0;
interp[20] = (9.0 * r3p * rr * sp * tp) / 64.0;
interp[21] = (9.0 * r3m * rr * sp * tp) / 64.0;
interp[22] = (9.0 * rm * s3p * ss * tp) / 64.0;
interp[23] = (9.0 * rm * s3m * ss * tp) / 64.0;
interp[24] = (9.0 * rm * sm * t3m * tt) / 64.0;
interp[25] = (9.0 * rm * sm * t3p * tt) / 64.0;
interp[26] = (9.0 * rp * sm * t3m * tt) / 64.0;
interp[27] = (9.0 * rp * sm * t3p * tt) / 64.0;
interp[28] = (9.0 * rp * sp * t3m * tt) / 64.0;
interp[29] = (9.0 * rp * sp * t3p * tt) / 64.0;
interp[30] = (9.0 * rm * sp * t3m * tt) / 64.0;
interp[31] = (9.0 * rm * sp * t3p * tt) / 64.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;
let r3m = 1.0 - 3.0 * r;
let s3m = 1.0 - 3.0 * s;
let t3m = 1.0 - 3.0 * t;
let r3p = 1.0 + 3.0 * r;
let s3p = 1.0 + 3.0 * s;
let t3p = 1.0 + 3.0 * t;
let rr = 1.0 - r * r;
let ss = 1.0 - s * s;
let tt = 1.0 - t * t;
let rr9 = 9.0 * r * r;
let ss9 = 9.0 * s * s;
let tt9 = 9.0 * t * t;
deriv.set(
0,
0,
(9.0 * r * rm * sm * tm) / 32.0 - (sm * tm * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(
1,
0,
(9.0 * r * rp * sm * tm) / 32.0 + (sm * tm * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(
2,
0,
(9.0 * r * rp * sp * tm) / 32.0 + (sp * tm * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(
3,
0,
(9.0 * r * rm * sp * tm) / 32.0 - (sp * tm * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(
4,
0,
(9.0 * r * rm * sm * tp) / 32.0 - (sm * tp * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(
5,
0,
(9.0 * r * rp * sm * tp) / 32.0 + (sm * tp * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(
6,
0,
(9.0 * r * rp * sp * tp) / 32.0 + (sp * tp * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(
7,
0,
(9.0 * r * rm * sp * tp) / 32.0 - (sp * tp * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(8, 0, (-9.0 * r * r3m * sm * tm) / 32.0 - (27.0 * rr * sm * tm) / 64.0);
deriv.set(9, 0, (-9.0 * r * r3p * sm * tm) / 32.0 + (27.0 * rr * sm * tm) / 64.0);
deriv.set(10, 0, (9.0 * s3m * ss * tm) / 64.0);
deriv.set(11, 0, (9.0 * s3p * ss * tm) / 64.0);
deriv.set(12, 0, (-9.0 * r * r3p * sp * tm) / 32.0 + (27.0 * rr * sp * tm) / 64.0);
deriv.set(13, 0, (-9.0 * r * r3m * sp * tm) / 32.0 - (27.0 * rr * sp * tm) / 64.0);
deriv.set(14, 0, (-9.0 * s3p * ss * tm) / 64.0);
deriv.set(15, 0, (-9.0 * s3m * ss * tm) / 64.0);
deriv.set(16, 0, (-9.0 * r * r3m * sm * tp) / 32.0 - (27.0 * rr * sm * tp) / 64.0);
deriv.set(17, 0, (-9.0 * r * r3p * sm * tp) / 32.0 + (27.0 * rr * sm * tp) / 64.0);
deriv.set(18, 0, (9.0 * s3m * ss * tp) / 64.0);
deriv.set(19, 0, (9.0 * s3p * ss * tp) / 64.0);
deriv.set(20, 0, (-9.0 * r * r3p * sp * tp) / 32.0 + (27.0 * rr * sp * tp) / 64.0);
deriv.set(21, 0, (-9.0 * r * r3m * sp * tp) / 32.0 - (27.0 * rr * sp * tp) / 64.0);
deriv.set(22, 0, (-9.0 * s3p * ss * tp) / 64.0);
deriv.set(23, 0, (-9.0 * s3m * ss * tp) / 64.0);
deriv.set(24, 0, (-9.0 * sm * t3m * tt) / 64.0);
deriv.set(25, 0, (-9.0 * sm * t3p * tt) / 64.0);
deriv.set(26, 0, (9.0 * sm * t3m * tt) / 64.0);
deriv.set(27, 0, (9.0 * sm * t3p * tt) / 64.0);
deriv.set(28, 0, (9.0 * sp * t3m * tt) / 64.0);
deriv.set(29, 0, (9.0 * sp * t3p * tt) / 64.0);
deriv.set(30, 0, (-9.0 * sp * t3m * tt) / 64.0);
deriv.set(31, 0, (-9.0 * sp * t3p * tt) / 64.0);
deriv.set(
0,
1,
(9.0 * rm * s * sm * tm) / 32.0 - (rm * tm * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(
1,
1,
(9.0 * rp * s * sm * tm) / 32.0 - (rp * tm * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(
2,
1,
(9.0 * rp * s * sp * tm) / 32.0 + (rp * tm * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(
3,
1,
(9.0 * rm * s * sp * tm) / 32.0 + (rm * tm * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(
4,
1,
(9.0 * rm * s * sm * tp) / 32.0 - (rm * tp * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(
5,
1,
(9.0 * rp * s * sm * tp) / 32.0 - (rp * tp * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(
6,
1,
(9.0 * rp * s * sp * tp) / 32.0 + (rp * tp * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(
7,
1,
(9.0 * rm * s * sp * tp) / 32.0 + (rm * tp * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(8, 1, (-9.0 * r3m * rr * tm) / 64.0);
deriv.set(9, 1, (-9.0 * r3p * rr * tm) / 64.0);
deriv.set(10, 1, (-9.0 * rp * s * s3m * tm) / 32.0 - (27.0 * rp * ss * tm) / 64.0);
deriv.set(11, 1, (-9.0 * rp * s * s3p * tm) / 32.0 + (27.0 * rp * ss * tm) / 64.0);
deriv.set(12, 1, (9.0 * r3p * rr * tm) / 64.0);
deriv.set(13, 1, (9.0 * r3m * rr * tm) / 64.0);
deriv.set(14, 1, (-9.0 * rm * s * s3p * tm) / 32.0 + (27.0 * rm * ss * tm) / 64.0);
deriv.set(15, 1, (-9.0 * rm * s * s3m * tm) / 32.0 - (27.0 * rm * ss * tm) / 64.0);
deriv.set(16, 1, (-9.0 * r3m * rr * tp) / 64.0);
deriv.set(17, 1, (-9.0 * r3p * rr * tp) / 64.0);
deriv.set(18, 1, (-9.0 * rp * s * s3m * tp) / 32.0 - (27.0 * rp * ss * tp) / 64.0);
deriv.set(19, 1, (-9.0 * rp * s * s3p * tp) / 32.0 + (27.0 * rp * ss * tp) / 64.0);
deriv.set(20, 1, (9.0 * r3p * rr * tp) / 64.0);
deriv.set(21, 1, (9.0 * r3m * rr * tp) / 64.0);
deriv.set(22, 1, (-9.0 * rm * s * s3p * tp) / 32.0 + (27.0 * rm * ss * tp) / 64.0);
deriv.set(23, 1, (-9.0 * rm * s * s3m * tp) / 32.0 - (27.0 * rm * ss * tp) / 64.0);
deriv.set(24, 1, (-9.0 * rm * t3m * tt) / 64.0);
deriv.set(25, 1, (-9.0 * rm * t3p * tt) / 64.0);
deriv.set(26, 1, (-9.0 * rp * t3m * tt) / 64.0);
deriv.set(27, 1, (-9.0 * rp * t3p * tt) / 64.0);
deriv.set(28, 1, (9.0 * rp * t3m * tt) / 64.0);
deriv.set(29, 1, (9.0 * rp * t3p * tt) / 64.0);
deriv.set(30, 1, (9.0 * rm * t3m * tt) / 64.0);
deriv.set(31, 1, (9.0 * rm * t3p * tt) / 64.0);
deriv.set(
0,
2,
(9.0 * rm * sm * t * tm) / 32.0 - (rm * sm * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(
1,
2,
(9.0 * rp * sm * t * tm) / 32.0 - (rp * sm * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(
2,
2,
(9.0 * rp * sp * t * tm) / 32.0 - (rp * sp * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(
3,
2,
(9.0 * rm * sp * t * tm) / 32.0 - (rm * sp * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(
4,
2,
(9.0 * rm * sm * t * tp) / 32.0 + (rm * sm * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(
5,
2,
(9.0 * rp * sm * t * tp) / 32.0 + (rp * sm * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(
6,
2,
(9.0 * rp * sp * t * tp) / 32.0 + (rp * sp * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(
7,
2,
(9.0 * rm * sp * t * tp) / 32.0 + (rm * sp * (-19.0 + rr9 + ss9 + tt9)) / 64.0,
);
deriv.set(8, 2, (-9.0 * r3m * rr * sm) / 64.0);
deriv.set(9, 2, (-9.0 * r3p * rr * sm) / 64.0);
deriv.set(10, 2, (-9.0 * rp * s3m * ss) / 64.0);
deriv.set(11, 2, (-9.0 * rp * s3p * ss) / 64.0);
deriv.set(12, 2, (-9.0 * r3p * rr * sp) / 64.0);
deriv.set(13, 2, (-9.0 * r3m * rr * sp) / 64.0);
deriv.set(14, 2, (-9.0 * rm * s3p * ss) / 64.0);
deriv.set(15, 2, (-9.0 * rm * s3m * ss) / 64.0);
deriv.set(16, 2, (9.0 * r3m * rr * sm) / 64.0);
deriv.set(17, 2, (9.0 * r3p * rr * sm) / 64.0);
deriv.set(18, 2, (9.0 * rp * s3m * ss) / 64.0);
deriv.set(19, 2, (9.0 * rp * s3p * ss) / 64.0);
deriv.set(20, 2, (9.0 * r3p * rr * sp) / 64.0);
deriv.set(21, 2, (9.0 * r3m * rr * sp) / 64.0);
deriv.set(22, 2, (9.0 * rm * s3p * ss) / 64.0);
deriv.set(23, 2, (9.0 * rm * s3m * ss) / 64.0);
deriv.set(24, 2, (-9.0 * rm * sm * t * t3m) / 32.0 - (27.0 * rm * sm * tt) / 64.0);
deriv.set(25, 2, (-9.0 * rm * sm * t * t3p) / 32.0 + (27.0 * rm * sm * tt) / 64.0);
deriv.set(26, 2, (-9.0 * rp * sm * t * t3m) / 32.0 - (27.0 * rp * sm * tt) / 64.0);
deriv.set(27, 2, (-9.0 * rp * sm * t * t3p) / 32.0 + (27.0 * rp * sm * tt) / 64.0);
deriv.set(28, 2, (-9.0 * rp * sp * t * t3m) / 32.0 - (27.0 * rp * sp * tt) / 64.0);
deriv.set(29, 2, (-9.0 * rp * sp * t * t3p) / 32.0 + (27.0 * rp * sp * tt) / 64.0);
deriv.set(30, 2, (-9.0 * rm * sp * t * t3m) / 32.0 - (27.0 * rm * sp * tt) / 64.0);
deriv.set(31, 2, (-9.0 * rm * sp * t * t3p) / 32.0 + (27.0 * rm * sp * tt) / 64.0);
}
}