del-msh-cpu 0.1.45

mesh utility library for computer graphics research and prototyping
Documentation
pub fn elem2volume(
    elem2idx_offset: &[u32],
    idx2vtx: &[u32],
    vtx2xyz: &[f32],
    i_gauss_degree: usize,
    elem2volume: &mut [f32],
) {
    let num_elem = elem2idx_offset.len() - 1;
    assert_eq!(elem2volume.len(), num_elem);
    for i_elem in 0..elem2idx_offset.len() - 1 {
        let node2vtx =
            &idx2vtx[elem2idx_offset[i_elem] as usize..elem2idx_offset[i_elem + 1] as usize];
        match node2vtx.len() {
            4 => {
                let p0 = arrayref::array_ref![vtx2xyz, node2vtx[0] as usize * 3, 3];
                let p1 = arrayref::array_ref![vtx2xyz, node2vtx[1] as usize * 3, 3];
                let p2 = arrayref::array_ref![vtx2xyz, node2vtx[2] as usize * 3, 3];
                let p3 = arrayref::array_ref![vtx2xyz, node2vtx[3] as usize * 3, 3];
                elem2volume[i_elem] = del_geo_core::tet::volume(p0, p1, p2, p3);
            }
            5 => {
                let p0 = arrayref::array_ref![vtx2xyz, node2vtx[0] as usize * 3, 3];
                let p1 = arrayref::array_ref![vtx2xyz, node2vtx[1] as usize * 3, 3];
                let p2 = arrayref::array_ref![vtx2xyz, node2vtx[2] as usize * 3, 3];
                let p3 = arrayref::array_ref![vtx2xyz, node2vtx[3] as usize * 3, 3];
                let p4 = arrayref::array_ref![vtx2xyz, node2vtx[4] as usize * 3, 3];
                elem2volume[i_elem] =
                    del_geo_core::pyramid::volume(p0, p1, p2, p3, p4, i_gauss_degree);
            }
            6 => {
                let p0 = arrayref::array_ref![vtx2xyz, node2vtx[0] as usize * 3, 3];
                let p1 = arrayref::array_ref![vtx2xyz, node2vtx[1] as usize * 3, 3];
                let p2 = arrayref::array_ref![vtx2xyz, node2vtx[2] as usize * 3, 3];
                let p3 = arrayref::array_ref![vtx2xyz, node2vtx[3] as usize * 3, 3];
                let p4 = arrayref::array_ref![vtx2xyz, node2vtx[4] as usize * 3, 3];
                let p5 = arrayref::array_ref![vtx2xyz, node2vtx[5] as usize * 3, 3];
                elem2volume[i_elem] =
                    del_geo_core::prism::volume(p0, p1, p2, p3, p4, p5, i_gauss_degree);
            }
            _ => {
                unreachable!()
            }
        }
    }
}