opensrdk_linear_algebra/matrix/gt/
trf.rs1use super::TridiagonalMatrix;
2use crate::matrix::MatrixError;
3use crate::number::*;
4use lapack::dgttrf;
5use lapack::zgttrf;
6use serde::Deserialize;
7use serde::Serialize;
8
9#[derive(Clone, Debug, Serialize, Deserialize)]
10pub struct GTTRF<T = f64>(pub Vec<T>, pub [Vec<T>; 3], pub Vec<i32>)
11where
12 T: Number;
13
14impl TridiagonalMatrix {
15 pub fn gttrf(self) -> Result<GTTRF, MatrixError> {
18 let (mut dl, mut d, mut du) = self.eject();
19 let n = d.len();
20 let mut du2 = vec![0.0; n.max(2) - 2];
21 let mut ipiv = vec![0; n];
22 let mut info = 0;
23
24 let n = n as i32;
25
26 unsafe { dgttrf(n, &mut dl, &mut d, &mut du, &mut du2, &mut ipiv, &mut info) }
27
28 if info != 0 {
29 return Err(MatrixError::LapackRoutineError {
30 routine: "dgttrf".to_owned(),
31 info,
32 });
33 }
34
35 let u = [d, du, du2];
36
37 Ok(GTTRF(dl, u, ipiv))
38 }
39}
40
41impl TridiagonalMatrix<c64> {
42 pub fn gttrf(self) -> Result<GTTRF<c64>, MatrixError> {
45 let (mut dl, mut d, mut du) = self.eject();
46 let n = d.len();
47 let mut du2 = vec![c64::default(); n.max(2) - 2];
48 let mut ipiv = vec![0; n];
49 let mut info = 0;
50
51 let n = n as i32;
52
53 unsafe { zgttrf(n, &mut dl, &mut d, &mut du, &mut du2, &mut ipiv, &mut info) }
54
55 if info != 0 {
56 return Err(MatrixError::LapackRoutineError {
57 routine: "dgttrf".to_owned(),
58 info,
59 });
60 }
61
62 let u = [d, du, du2];
63
64 Ok(GTTRF::<c64>(dl, u, ipiv))
65 }
66}