2
2
//! for tridiagonal matrix
3
3
4
4
use lapacke;
5
- use ndarray:: * ;
6
5
use num_traits:: Zero ;
7
6
8
7
use super :: NormType ;
@@ -11,20 +10,18 @@ use super::{into_result, Pivot, Transpose};
11
10
use crate :: error:: * ;
12
11
use crate :: layout:: MatrixLayout ;
13
12
use crate :: opnorm:: * ;
14
- use crate :: tridiagonal:: { LUFactorizedTriDiagonal , TriDiagonal } ;
13
+ use crate :: tridiagonal:: { LUFactorizedTridiagonal , Tridiagonal } ;
15
14
use crate :: types:: * ;
16
15
17
16
/// Wraps `*gttrf`, `*gtcon` and `*gttrs`
18
- pub trait TriDiagonal_ : Scalar + Sized {
17
+ pub trait Tridiagonal_ : Scalar + Sized {
19
18
/// Computes the LU factorization of a tridiagonal `m x n` matrix `a` using
20
19
/// partial pivoting with row interchanges.
21
- unsafe fn lu_tridiagonal (
22
- a : & mut TriDiagonal < Self > ,
23
- ) -> Result < ( Array1 < Self > , Self :: Real , Pivot ) > ;
20
+ unsafe fn lu_tridiagonal ( a : & mut Tridiagonal < Self > ) -> Result < ( Vec < Self > , Self :: Real , Pivot ) > ;
24
21
/// Estimates the the reciprocal of the condition number of the tridiagonal matrix in 1-norm.
25
- unsafe fn rcond_tridiagonal ( lu : & LUFactorizedTriDiagonal < Self > ) -> Result < Self :: Real > ;
22
+ unsafe fn rcond_tridiagonal ( lu : & LUFactorizedTridiagonal < Self > ) -> Result < Self :: Real > ;
26
23
unsafe fn solve_tridiagonal (
27
- lu : & LUFactorizedTriDiagonal < Self > ,
24
+ lu : & LUFactorizedTridiagonal < Self > ,
28
25
bl : MatrixLayout ,
29
26
t : Transpose ,
30
27
b : & mut [ Self ] ,
@@ -33,37 +30,30 @@ pub trait TriDiagonal_: Scalar + Sized {
33
30
34
31
macro_rules! impl_tridiagonal {
35
32
( $scalar: ty, $gttrf: path, $gtcon: path, $gttrs: path) => {
36
- impl TriDiagonal_ for $scalar {
33
+ impl Tridiagonal_ for $scalar {
37
34
unsafe fn lu_tridiagonal(
38
- a: & mut TriDiagonal <Self >,
39
- ) -> Result <( Array1 <Self >, Self :: Real , Pivot ) > {
35
+ a: & mut Tridiagonal <Self >,
36
+ ) -> Result <( Vec <Self >, Self :: Real , Pivot ) > {
40
37
let ( n, _) = a. l. size( ) ;
41
38
let anom = a. opnorm_one( ) ?;
42
- let dl = a. dl. as_slice_mut( ) . unwrap( ) ;
43
- let d = a. d. as_slice_mut( ) . unwrap( ) ;
44
- let du = a. du. as_slice_mut( ) . unwrap( ) ;
45
39
let mut du2 = vec![ Zero :: zero( ) ; ( n - 2 ) as usize ] ;
46
40
let mut ipiv = vec![ 0 ; n as usize ] ;
47
- let info = $gttrf( n, dl, d, du, & mut du2, & mut ipiv) ;
48
- into_result( info, ( arr1 ( & du2) , anom, ipiv) )
41
+ let info = $gttrf( n, & mut a . dl, & mut a . d, & mut a . du, & mut du2, & mut ipiv) ;
42
+ into_result( info, ( du2, anom, ipiv) )
49
43
}
50
44
51
- unsafe fn rcond_tridiagonal( lu: & LUFactorizedTriDiagonal <Self >) -> Result <Self :: Real > {
45
+ unsafe fn rcond_tridiagonal( lu: & LUFactorizedTridiagonal <Self >) -> Result <Self :: Real > {
52
46
let ( n, _) = lu. a. l. size( ) ;
53
- let dl = lu. a. dl. as_slice( ) . unwrap( ) ;
54
- let d = lu. a. d. as_slice( ) . unwrap( ) ;
55
- let du = lu. a. du. as_slice( ) . unwrap( ) ;
56
- let du2 = lu. du2. as_slice( ) . unwrap( ) ;
57
47
let ipiv = & lu. ipiv;
58
48
let anorm = lu. anom;
59
49
let mut rcond = Self :: Real :: zero( ) ;
60
50
let info = $gtcon(
61
51
NormType :: One as u8 ,
62
52
n,
63
- dl,
64
- d,
65
- du,
66
- du2,
53
+ & lu . a . dl,
54
+ & lu . a . d,
55
+ & lu . a . du,
56
+ & lu . du2,
67
57
ipiv,
68
58
anorm,
69
59
& mut rcond,
@@ -72,28 +62,24 @@ macro_rules! impl_tridiagonal {
72
62
}
73
63
74
64
unsafe fn solve_tridiagonal(
75
- lu: & LUFactorizedTriDiagonal <Self >,
65
+ lu: & LUFactorizedTridiagonal <Self >,
76
66
bl: MatrixLayout ,
77
67
t: Transpose ,
78
68
b: & mut [ Self ] ,
79
69
) -> Result <( ) > {
80
70
let ( n, _) = lu. a. l. size( ) ;
81
71
let ( _, nrhs) = bl. size( ) ;
82
- let dl = lu. a. dl. as_slice( ) . unwrap( ) ;
83
- let d = lu. a. d. as_slice( ) . unwrap( ) ;
84
- let du = lu. a. du. as_slice( ) . unwrap( ) ;
85
- let du2 = lu. du2. as_slice( ) . unwrap( ) ;
86
72
let ipiv = & lu. ipiv;
87
73
let ldb = bl. lda( ) ;
88
74
let info = $gttrs(
89
75
lu. a. l. lapacke_layout( ) ,
90
76
t as u8 ,
91
77
n,
92
78
nrhs,
93
- dl,
94
- d,
95
- du,
96
- du2,
79
+ & lu . a . dl,
80
+ & lu . a . d,
81
+ & lu . a . du,
82
+ & lu . du2,
97
83
ipiv,
98
84
b,
99
85
ldb,
0 commit comments