use crate::basic::sparse::conj::Conjugate;
use nalgebra::*;
use nalgebra_sparse::CscMatrix;
#[allow(non_snake_case, dead_code)]
pub fn dSbus_dV_old(
Ybus: &CscMatrix<Complex<f64>>,
v: &DVector<Complex<f64>>,
Vnorm: &DVector<Complex<f64>>,
) -> (CscMatrix<Complex<f64>>, CscMatrix<Complex<f64>>) {
let diagpattern = CscMatrix::identity(v.len());
let ibus = Ybus * v;
let mut diagVnorm = diagpattern.clone();
let mut diagV = diagpattern.clone();
let mut diagIbus = diagpattern.clone();
diagVnorm.values_mut().copy_from_slice(Vnorm.as_slice());
diagV.values_mut().copy_from_slice(v.as_slice());
diagIbus.values_mut().copy_from_slice(ibus.as_slice());
let dS_dVm = &diagV * (Ybus * &diagVnorm).conjugate() + diagIbus.conjugate() * &diagVnorm;
let dS_dVa = &diagV * (diagIbus - Ybus * &diagV).conjugate() * Complex::<f64>::i();
(dS_dVm, dS_dVa)
}
#[allow(non_snake_case)]
pub fn dSbus_dV(
Ybus: &CscMatrix<Complex<f64>>,
v: &DVector<Complex<f64>>,
Vnorm: &DVector<Complex<f64>>,
) -> (CscMatrix<Complex<f64>>, CscMatrix<Complex<f64>>) {
let n = Ybus.ncols();
let ibus = Ybus * v;
let col_offsets = Ybus.col_offsets();
let row_indices = Ybus.row_indices();
let y_vals = Ybus.values();
let nnz = y_vals.len();
let mut dsm_vals = vec![Complex::new(0.0, 0.0); nnz];
let mut dsa_vals = vec![Complex::new(0.0, 0.0); nnz];
let v_slice = v.as_slice();
let vnorm_slice = Vnorm.as_slice();
let ibus_slice = ibus.as_slice();
let j_unit = Complex::new(0.0, 1.0);
for j in 0..n {
let start = col_offsets[j] as usize;
let end = col_offsets[j + 1] as usize;
for idx in start..end {
let i = row_indices[idx] as usize;
let y_ij = y_vals[idx];
if i == j {
dsm_vals[idx] = v_slice[i] * (y_ij * vnorm_slice[i]).conj()
+ ibus_slice[i].conj() * vnorm_slice[i];
dsa_vals[idx] = j_unit * v_slice[i] * (ibus_slice[i] - y_ij * v_slice[i]).conj();
} else {
dsm_vals[idx] = v_slice[i] * (y_ij * vnorm_slice[j]).conj();
dsa_vals[idx] = j_unit * v_slice[i] * (-y_ij * v_slice[j]).conj();
}
}
}
let dS_dVm =
CscMatrix::try_from_csc_data(n, n, col_offsets.to_vec(), row_indices.to_vec(), dsm_vals)
.unwrap();
let dS_dVa =
CscMatrix::try_from_csc_data(n, n, col_offsets.to_vec(), row_indices.to_vec(), dsa_vals)
.unwrap();
(dS_dVm, dS_dVa)
}