use integral::{Basis, Engine, Shell};
#[test]
fn single_spherical_shell_overlap_is_identity() {
for l in 0..=6 {
let sh = Shell::new_spherical(l, [0.2, -0.1, 0.3], vec![0.9], vec![1.0]).unwrap();
let basis = Basis::new(vec![sh]);
let n = basis.nao();
assert_eq!(n, 2 * l + 1);
let s = basis.overlap();
for i in 0..n {
for j in 0..n {
let expect = if i == j { 1.0 } else { 0.0 };
let got = s[i * n + j];
assert!(
(got - expect).abs() < 1e-12,
"l={l} S[{i},{j}]={got} expected {expect}"
);
}
}
}
}
#[test]
fn mixed_basis_dimensions() {
let basis = Basis::new(vec![
Shell::new(2, [0.0, 0.0, 0.0], vec![1.0], vec![1.0]).unwrap(), Shell::new_spherical(2, [0.5, 0.0, 0.0], vec![0.8], vec![1.0]).unwrap(), Shell::new_spherical(3, [0.0, 0.4, 0.0], vec![0.7], vec![1.0]).unwrap(), ]);
assert_eq!(basis.nao(), 6 + 5 + 7);
assert_eq!(basis.nao_cart(), 6 + 6 + 10);
let s = basis.overlap();
assert_eq!(s.len(), 18 * 18);
}
#[test]
fn spherical_eri_consistent_across_engines() {
let cs = [
[0.0, 0.0, 0.0],
[0.6, -0.3, 0.2],
[-0.4, 0.5, -0.1],
[0.2, 0.3, 0.7],
];
let es = [0.9, 1.3, 0.7, 1.1];
for &ls in &[[2usize, 1, 2, 0], [3, 2, 1, 1], [2, 2, 2, 2], [4, 0, 3, 1]] {
let basis = Basis::new(
(0..4)
.map(|k| Shell::new_spherical(ls[k], cs[k], vec![es[k]], vec![1.0]).unwrap())
.collect(),
);
let os = basis.eri_block_with(Engine::OsHgp, 0, 1, 2, 3);
let rys = basis.eri_block_with(Engine::Rys, 0, 1, 2, 3);
assert_eq!(os.len(), rys.len());
let peak = rys.iter().fold(0.0f64, |m, &r| m.max(r.abs()));
let mut worst = 0.0f64;
for (a, b) in os.iter().zip(&rys) {
worst = worst.max((a - b).abs());
}
assert!(
worst <= 1e-9 * peak.max(1.0) + 1e-10,
"ls={ls:?}: spherical engines disagree, worst={worst:e} peak={peak:e}"
);
}
}
#[test]
fn spherical_d_block_has_2lplus1_per_index() {
let cart = Basis::new(vec![
Shell::new(2, [0.0, 0.0, 0.0], vec![1.0], vec![1.0]).unwrap(),
Shell::new(0, [0.5, 0.2, 0.1], vec![0.6], vec![1.0]).unwrap(),
]);
let sph = Basis::new(vec![
Shell::new_spherical(2, [0.0, 0.0, 0.0], vec![1.0], vec![1.0]).unwrap(),
Shell::new(0, [0.5, 0.2, 0.1], vec![0.6], vec![1.0]).unwrap(),
]);
let cb = cart.eri_block(0, 1, 0, 1);
let sb = sph.eri_block(0, 1, 0, 1);
assert_eq!(cb.len(), 36);
assert_eq!(sb.len(), 25);
}