use crate::ri::tensor_b::ThreeCenterTensorB;
use crate::types::{AlignedMatrix, AlignedVec64};
pub fn compute_coulomb_ri(
b: &ThreeCenterTensorB,
density: &AlignedMatrix<f64>,
j_matrix: &mut AlignedMatrix<f64>,
d_aux: &mut AlignedVec64<f64>,
) {
let norbs = b.norbs;
let naux = b.naux;
assert_eq!(density.rows, norbs);
assert_eq!(density.cols, norbs);
assert_eq!(j_matrix.rows, norbs);
assert_eq!(j_matrix.cols, norbs);
assert_eq!(d_aux.len(), naux);
d_aux.fill(0.0);
for lam in 0..norbs {
for sig in 0..norbs {
let p_val = density.get(lam, sig);
if p_val.abs() > 1e-15 {
let slice = b.pair_slice(lam, sig);
for q in 0..naux {
d_aux[q] += slice[q] * p_val;
}
}
}
}
for mu in 0..norbs {
for nu in 0..norbs {
let slice = b.pair_slice(mu, nu);
let mut sum = 0.0;
for q in 0..naux {
sum += slice[q] * d_aux[q];
}
j_matrix.set(mu, nu, sum);
}
}
}
pub fn compute_exchange_ri(
b: &ThreeCenterTensorB,
density: &AlignedMatrix<f64>,
k_matrix: &mut AlignedMatrix<f64>,
w_mat: &mut AlignedMatrix<f64>,
) {
let norbs = b.norbs;
let naux = b.naux;
assert_eq!(density.rows, norbs);
assert_eq!(density.cols, norbs);
assert_eq!(k_matrix.rows, norbs);
assert_eq!(k_matrix.cols, norbs);
assert_eq!(w_mat.rows, norbs);
assert_eq!(w_mat.cols, norbs);
k_matrix.fill_zero();
for q in 0..naux {
for mu in 0..norbs {
for sig in 0..norbs {
let mut sum = 0.0;
for lam in 0..norbs {
sum += b.get(mu, lam, q) * density.get(lam, sig);
}
w_mat.set(mu, sig, sum);
}
}
for mu in 0..norbs {
for nu in 0..norbs {
let mut sum = 0.0;
for sig in 0..norbs {
sum += w_mat.get(mu, sig) * b.get(nu, sig, q);
}
k_matrix.set(mu, nu, k_matrix.get(mu, nu) + sum);
}
}
}
}