pub fn from_polygon_mesh(elem2idx: &[usize], idx2vtx: &[usize]) -> (Vec<[usize; 3]>, Vec<usize>) {
let mut num_tri = 0_usize;
for i_elem in 0..elem2idx.len() - 1 {
assert!(elem2idx[i_elem + 1] >= elem2idx[i_elem]);
let num_node = elem2idx[i_elem + 1] - elem2idx[i_elem];
num_tri += num_node - 2;
}
let mut tri2vtx = Vec::<[usize; 3]>::with_capacity(num_tri);
let mut new2old = Vec::<usize>::with_capacity(num_tri);
for i_elem in 0..elem2idx.len() - 1 {
let num_node = elem2idx[i_elem + 1] - elem2idx[i_elem];
let idx0 = elem2idx[i_elem];
for i_node in 0..num_node - 2 {
tri2vtx.push([
idx2vtx[idx0],
idx2vtx[idx0 + 1 + i_node],
idx2vtx[idx0 + 2 + i_node],
]);
new2old.push(i_elem);
}
}
(tri2vtx, new2old)
}
pub fn from_quad_mesh(quad2vtx: &[[usize; 4]]) -> Vec<[usize; 3]> {
let mut tri2vtx = Vec::with_capacity(quad2vtx.len() * 2);
for q in quad2vtx {
tri2vtx.push([q[0], q[1], q[2]]);
tri2vtx.push([q[0], q[2], q[3]]);
}
tri2vtx
}
pub fn from_grid(nx: usize, ny: usize) -> Vec<[usize; 3]> {
let mx = nx - 1;
let my = ny - 1;
let ncell = mx * my;
let mut tri2vtx = Vec::<[usize; 3]>::with_capacity(ncell * 2);
for imy in 0..my {
for imx in 0..mx {
let ivx0 = imx + imy * nx;
let ivx1 = imx + 1 + imy * nx;
let ivx2 = imx + 1 + (imy + 1) * nx;
let ivx3 = imx + (imy + 1) * nx;
tri2vtx.push([ivx0, ivx1, ivx2]);
tri2vtx.push([ivx0, ivx2, ivx3]);
}
}
assert_eq!(tri2vtx.len(), ncell * 2);
tri2vtx
}
pub fn find_node_tri(tri2vtx: &[usize; 3], i_vtx: usize) -> usize {
if tri2vtx[0] == i_vtx {
return 0;
}
if tri2vtx[1] == i_vtx {
return 1;
}
if tri2vtx[2] == i_vtx {
return 2;
}
panic!("vertex {} not found in triangle", i_vtx);
}
pub fn elem2elem(
elem2vtx: &[usize],
num_node: usize,
num_vtx: usize,
is_simplex_indexing: bool,
) -> Vec<usize> {
let (face2idx, idx2node) = if is_simplex_indexing {
(
del_geo_core::tri::FACE2IDX.to_vec(),
del_geo_core::tri::IDX2NODE.to_vec(),
)
} else {
crate::elem2elem::face2node_of_polygon_element(num_node)
};
match num_node {
2 => crate::elem2elem::from_uniform_mesh::<_, 2, 2>(
elem2vtx.as_chunks::<2>().0,
&face2idx,
&idx2node,
num_vtx,
)
.into_flattened(),
3 => crate::elem2elem::from_uniform_mesh::<_, 3, 3>(
elem2vtx.as_chunks::<3>().0,
&face2idx,
&idx2node,
num_vtx,
)
.into_flattened(),
4 => crate::elem2elem::from_uniform_mesh::<_, 4, 4>(
elem2vtx.as_chunks::<4>().0,
&face2idx,
&idx2node,
num_vtx,
)
.into_flattened(),
_ => panic!("unsupported num_node: {num_node}"),
}
}