use super::{daxpy::daxpy, ddot::ddot};
#[no_mangle]
#[inline(always)]
pub fn dgesl(a: &mut Vec<Vec<f64>>, n: usize, ipvt: &[usize], b: &mut [f64], job: usize) {
let mut t: f64;
let mut j: usize;
if job == 0 {
for k in 1..n + 1 {
t = ddot(k - 1, &a[k], b, 1, 1);
b[k] = (b[k] - t) / a[k][k];
}
for k in (1..n).rev() {
(*b)[k] += ddot(n - k, &a[k][k..], &b[k..], 1, 1);
j = ipvt[k];
if j != k {
t = b[j];
b[j] = b[k];
b[k] = t;
}
}
return;
}
for k in 1..n {
j = ipvt[k];
t = b[j];
if j != k {
b[j] = b[k];
b[k] = t;
}
daxpy(n - k, &mut a[k][k..], &mut b[k..], 1, 1, &t);
}
for k in (1..n + 1).rev() {
b[k] /= a[k][k];
t = -b[k];
daxpy(k - 1, &mut a[k], b, 1, 1, &t);
}
}