use crate::types::AlignedVec64;
#[derive(Debug, Clone)]
pub struct ThreeCenterTensorB {
pub norbs: usize,
pub naux: usize,
pub data: AlignedVec64<f64>,
}
impl ThreeCenterTensorB {
pub fn allocate(norbs: usize, naux: usize) -> Self {
let total_size = norbs * norbs * naux;
Self {
norbs,
naux,
data: AlignedVec64::zeroed(total_size),
}
}
#[inline(always)]
pub fn offset(&self, mu: usize, nu: usize, q: usize) -> usize {
(mu * self.norbs + nu) * self.naux + q
}
#[inline(always)]
pub fn get(&self, mu: usize, nu: usize, q: usize) -> f64 {
self.data[self.offset(mu, nu, q)]
}
#[inline(always)]
pub fn set(&mut self, mu: usize, nu: usize, q: usize, val: f64) {
let idx = self.offset(mu, nu, q);
self.data[idx] = val;
}
#[inline(always)]
pub fn pair_slice(&self, mu: usize, nu: usize) -> &[f64] {
let start = (mu * self.norbs + nu) * self.naux;
&self.data[start..(start + self.naux)]
}
#[inline(always)]
pub fn reconstruct_4center(&self, mu: usize, nu: usize, lam: usize, sig: usize) -> f64 {
let s1 = self.pair_slice(mu, nu);
let s2 = self.pair_slice(lam, sig);
let mut sum = 0.0;
for q in 0..self.naux {
sum += s1[q] * s2[q];
}
sum
}
}