#![allow(clippy::unreadable_literal, clippy::excessive_precision)]
use integral::math::am::n_cart;
use integral::math::solid_harmonics::c2s_matrix;
fn sign_fix(row: &mut [f64]) {
for &v in row.iter() {
if v.abs() > 1e-12 {
if v < 0.0 {
for x in row.iter_mut() {
*x = -*x;
}
}
break;
}
}
}
#[test]
fn c2s_matches_mpmath_reference() {
let mut ref_rows = C2S_REF.iter();
for l in 0..=6 {
let mat = c2s_matrix(l);
let nc = n_cart(l);
for p in 0..(2 * l + 1) {
let mut row: Vec<f64> = mat[p * nc..(p + 1) * nc].to_vec();
sign_fix(&mut row);
let refr = ref_rows.next().expect("missing reference row");
assert_eq!(refr.len(), nc, "l={l} row={p}: width mismatch");
for (i, (&a, &b)) in row.iter().zip(refr.iter()).enumerate() {
assert!(
(a - b).abs() < 1e-12,
"l={l} row={p} col={i}: rust={a} mpmath={b} (Δ={:e})",
(a - b).abs()
);
}
}
}
assert!(
ref_rows.next().is_none(),
"reference has more rows than c2s produced"
);
}
pub const C2S_REF: &[&[f64]] = &[
&[1.0000000000000000],
&[1.0000000000000000, 0.0, 0.0],
&[0.0, 1.0000000000000000, 0.0],
&[0.0, 0.0, 1.0000000000000000],
&[0.0, 1.0925484305920791, 0.0, 0.0, 0.0, 0.0],
&[0.0, 0.0, 0.0, 0.0, 1.0925484305920791, 0.0],
&[
0.31539156525252001,
0.0,
0.0,
0.31539156525252001,
0.0,
-0.63078313050504001,
],
&[0.0, 0.0, 1.0925484305920791, 0.0, 0.0, 0.0],
&[
0.54627421529603954,
0.0,
0.0,
-0.54627421529603954,
0.0,
0.0,
],
&[
0.0,
1.7701307697799305,
0.0,
0.0,
0.0,
0.0,
-0.59004358992664351,
0.0,
0.0,
0.0,
],
&[
0.0,
0.0,
0.0,
0.0,
2.8906114426405541,
0.0,
0.0,
0.0,
0.0,
0.0,
],
&[
0.0,
0.45704579946446574,
0.0,
0.0,
0.0,
0.0,
0.45704579946446574,
0.0,
-1.8281831978578629,
0.0,
],
&[
0.0,
0.0,
1.1195289977703462,
0.0,
0.0,
0.0,
0.0,
1.1195289977703462,
0.0,
-0.74635266518023078,
],
&[
0.45704579946446574,
0.0,
0.0,
0.45704579946446574,
0.0,
-1.8281831978578629,
0.0,
0.0,
0.0,
0.0,
],
&[
0.0,
0.0,
1.4453057213202770,
0.0,
0.0,
0.0,
0.0,
-1.4453057213202770,
0.0,
0.0,
],
&[
0.59004358992664351,
0.0,
0.0,
-1.7701307697799305,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
],
&[
0.0,
2.5033429417967045,
0.0,
0.0,
0.0,
0.0,
-2.5033429417967045,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
],
&[
0.0,
0.0,
0.0,
0.0,
5.3103923093397916,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-1.7701307697799305,
0.0,
0.0,
0.0,
],
&[
0.0,
0.94617469575756002,
0.0,
0.0,
0.0,
0.0,
0.94617469575756002,
0.0,
-5.6770481745453601,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
],
&[
0.0,
0.0,
0.0,
0.0,
2.0071396306718675,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
2.0071396306718675,
0.0,
-2.6761861742291567,
0.0,
],
&[
0.31735664074561291,
0.0,
0.0,
0.63471328149122582,
0.0,
-2.5388531259649033,
0.0,
0.0,
0.0,
0.0,
0.31735664074561291,
0.0,
-2.5388531259649033,
0.0,
0.84628437532163443,
],
&[
0.0,
0.0,
2.0071396306718675,
0.0,
0.0,
0.0,
0.0,
2.0071396306718675,
0.0,
-2.6761861742291567,
0.0,
0.0,
0.0,
0.0,
0.0,
],
&[
0.47308734787878001,
0.0,
0.0,
0.0,
0.0,
-2.8385240872726801,
0.0,
0.0,
0.0,
0.0,
-0.47308734787878001,
0.0,
2.8385240872726801,
0.0,
0.0,
],
&[
0.0,
0.0,
1.7701307697799305,
0.0,
0.0,
0.0,
0.0,
-5.3103923093397916,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
],
&[
0.62583573544917613,
0.0,
0.0,
-3.7550144126950568,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.62583573544917613,
0.0,
0.0,
0.0,
0.0,
],
&[
0.0,
3.2819102842008505,
0.0,
0.0,
0.0,
0.0,
-6.5638205684017010,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.65638205684017010,
0.0,
0.0,
0.0,
0.0,
0.0,
],
&[
0.0,
0.0,
0.0,
0.0,
8.3026492595241651,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-8.3026492595241651,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
],
&[
0.0,
1.4677148983057512,
0.0,
0.0,
0.0,
0.0,
0.97847659887050078,
0.0,
-11.741719186446009,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-0.48923829943525039,
0.0,
3.9139063954820031,
0.0,
0.0,
0.0,
],
&[
0.0,
0.0,
0.0,
0.0,
4.7935367849733238,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
4.7935367849733238,
0.0,
-9.5870735699466475,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
],
&[
0.0,
0.45294665119569692,
0.0,
0.0,
0.0,
0.0,
0.90589330239139384,
0.0,
-5.4353598143483631,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.45294665119569692,
0.0,
-5.4353598143483631,
0.0,
3.6235732095655754,
0.0,
],
&[
0.0,
0.0,
1.7542548368013539,
0.0,
0.0,
0.0,
0.0,
3.5085096736027079,
0.0,
-4.6780128981369439,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
1.7542548368013539,
0.0,
-4.6780128981369439,
0.0,
0.93560257962738877,
],
&[
0.45294665119569692,
0.0,
0.0,
0.90589330239139384,
0.0,
-5.4353598143483631,
0.0,
0.0,
0.0,
0.0,
0.45294665119569692,
0.0,
-5.4353598143483631,
0.0,
3.6235732095655754,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
],
&[
0.0,
0.0,
2.3967683924866619,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-4.7935367849733238,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-2.3967683924866619,
0.0,
4.7935367849733238,
0.0,
0.0,
],
&[
0.48923829943525039,
0.0,
0.0,
-0.97847659887050078,
0.0,
-3.9139063954820031,
0.0,
0.0,
0.0,
0.0,
-1.4677148983057512,
0.0,
11.741719186446009,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
],
&[
0.0,
0.0,
2.0756623148810413,
0.0,
0.0,
0.0,
0.0,
-12.453973889286248,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
2.0756623148810413,
0.0,
0.0,
0.0,
0.0,
],
&[
0.65638205684017010,
0.0,
0.0,
-6.5638205684017010,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
3.2819102842008505,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
],
&[
0.0,
4.0991046311514859,
0.0,
0.0,
0.0,
0.0,
-13.663682103838286,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
4.0991046311514859,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
],
&[
0.0,
0.0,
0.0,
0.0,
11.833095811158760,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-23.666191622317520,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
2.3666191622317520,
0.0,
0.0,
0.0,
0.0,
0.0,
],
&[
0.0,
2.0182596029148966,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-20.182596029148966,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-2.0182596029148966,
0.0,
20.182596029148966,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
],
&[
0.0,
0.0,
0.0,
0.0,
8.2908473356343115,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
5.5272315570895410,
0.0,
-22.108926228358164,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-2.7636157785447705,
0.0,
7.3696420761193880,
0.0,
0.0,
0.0,
],
&[
0.0,
0.92120525951492350,
0.0,
0.0,
0.0,
0.0,
1.8424105190298470,
0.0,
-14.739284152238776,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.92120525951492350,
0.0,
-14.739284152238776,
0.0,
14.739284152238776,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
],
&[
0.0,
0.0,
0.0,
0.0,
2.9131068125936569,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
5.8262136251873139,
0.0,
-11.652427250374628,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
2.9131068125936569,
0.0,
-11.652427250374628,
0.0,
4.6609709001498511,
0.0,
],
&[
0.31784601133814213,
0.0,
0.0,
0.95353803401442639,
0.0,
-5.7212282040865583,
0.0,
0.0,
0.0,
0.0,
0.95353803401442639,
0.0,
-11.442456408173117,
0.0,
7.6283042721154111,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.31784601133814213,
0.0,
-5.7212282040865583,
0.0,
7.6283042721154111,
0.0,
-1.0171072362820548,
],
&[
0.0,
0.0,
2.9131068125936569,
0.0,
0.0,
0.0,
0.0,
5.8262136251873139,
0.0,
-11.652427250374628,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
2.9131068125936569,
0.0,
-11.652427250374628,
0.0,
4.6609709001498511,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
],
&[
0.46060262975746175,
0.0,
0.0,
0.46060262975746175,
0.0,
-7.3696420761193880,
0.0,
0.0,
0.0,
0.0,
-0.46060262975746175,
0.0,
0.0,
0.0,
7.3696420761193880,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-0.46060262975746175,
0.0,
7.3696420761193880,
0.0,
-7.3696420761193880,
0.0,
0.0,
],
&[
0.0,
0.0,
2.7636157785447705,
0.0,
0.0,
0.0,
0.0,
-5.5272315570895410,
0.0,
-7.3696420761193880,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-8.2908473356343115,
0.0,
22.108926228358164,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
],
&[
0.50456490072872416,
0.0,
0.0,
-2.5228245036436208,
0.0,
-5.0456490072872416,
0.0,
0.0,
0.0,
0.0,
-2.5228245036436208,
0.0,
30.273894043723450,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.50456490072872416,
0.0,
-5.0456490072872416,
0.0,
0.0,
0.0,
0.0,
],
&[
0.0,
0.0,
2.3666191622317520,
0.0,
0.0,
0.0,
0.0,
-23.666191622317520,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
11.833095811158760,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
],
&[
0.68318410519191432,
0.0,
0.0,
-10.247761577878715,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
10.247761577878715,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-0.68318410519191432,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
],
];