use molrs::types::F;
#[inline]
fn in_box(x: F, pbc_min: F, pbc_length: F) -> F {
let mut v = x - pbc_min;
v -= (v / pbc_length).floor() * pbc_length;
v + pbc_min
}
#[inline]
pub fn axis_cell(
x: F,
pbc_min: F,
pbc_length: F,
cell_length: F,
ncells: usize,
periodic: bool,
) -> usize {
let xt = if periodic {
in_box(x, pbc_min, pbc_length)
} else {
x
};
let raw = ((xt - pbc_min) / cell_length).floor();
if raw < 0.0 {
0
} else {
(raw as usize).min(ncells - 1)
}
}
#[inline(always)]
pub fn setcell(
pos: &[F; 3],
pbc_min: &[F; 3],
pbc_length: &[F; 3],
cell_length: &[F; 3],
ncells: &[usize; 3],
periodic: &[bool; 3],
) -> [usize; 3] {
[
axis_cell(
pos[0],
pbc_min[0],
pbc_length[0],
cell_length[0],
ncells[0],
periodic[0],
),
axis_cell(
pos[1],
pbc_min[1],
pbc_length[1],
cell_length[1],
ncells[1],
periodic[1],
),
axis_cell(
pos[2],
pbc_min[2],
pbc_length[2],
cell_length[2],
ncells[2],
periodic[2],
),
]
}
#[inline]
pub fn index_cell(cell: &[usize; 3], ncells: &[usize; 3]) -> usize {
cell[0] * ncells[1] * ncells[2] + cell[1] * ncells[2] + cell[2]
}
pub fn icell_to_cell(icell: usize, ncells: &[usize; 3]) -> [usize; 3] {
let k = icell % ncells[2];
let rem = icell / ncells[2];
let j = rem % ncells[1];
let i = rem / ncells[1];
[i, j, k]
}
#[inline]
pub fn cell_ind(idx: isize, ncells: usize) -> usize {
idx.rem_euclid(ncells as isize) as usize
}
#[inline]
pub fn delta_vector(xi: &[F; 3], xj: &[F; 3], pbc_length: &[F; 3], periodic: &[bool; 3]) -> [F; 3] {
let mut d = [xi[0] - xj[0], xi[1] - xj[1], xi[2] - xj[2]];
for k in 0..3 {
if periodic[k] {
d[k] -= (d[k] / pbc_length[k]).round() * pbc_length[k];
}
}
d
}