5
5
#:set KINDS_TYPES = R_KINDS_TYPES+C_KINDS_TYPES
6
6
submodule (stdlib_specialmatrices) tridiagonal_matrices
7
7
use stdlib_linalg_lapack, only: lagtm
8
+
9
+ character(len=*), parameter :: this = "tridiagonal matrices"
8
10
contains
9
11
10
12
!--------------------------------
@@ -14,42 +16,120 @@ submodule (stdlib_specialmatrices) tridiagonal_matrices
14
16
!--------------------------------
15
17
16
18
#:for k1, t1, s1 in (KINDS_TYPES)
17
- pure module function initialize_tridiagonal_${s1}$(dl, dv, du) result(A)
19
+ pure module function initialize_tridiagonal_pure_${s1}$(dl, dv, du) result(A)
20
+ !! Construct a `tridiagonal` matrix from the rank-1 arrays
21
+ !! `dl`, `dv` and `du`.
22
+ ${t1}$, intent(in) :: dl(:), dv(:), du(:)
23
+ !! tridiagonal matrix elements.
24
+ type(tridiagonal_${s1}$_type) :: A
25
+ !! Corresponding tridiagonal matrix.
26
+
27
+ ! Internal variables.
28
+ integer(ilp) :: n
29
+ type(linalg_state_type) :: err0
30
+
31
+ ! Sanity check.
32
+ n = size(dv, kind=ilp)
33
+ if (n <= 0) then
34
+ err0 = linalg_state_type(this, LINALG_VALUE_ERROR, "Matrix size needs to be positive, n = ", n, ".")
35
+ call linalg_error_handling(err0)
36
+ endif
37
+ if (size(dl, kind=ilp) /= n-1) then
38
+ err0 = linalg_state_type(this, LINALG_VALUE_ERROR, "Vector dl does not have the correct length.")
39
+ call linalg_error_handling(err0)
40
+ endif
41
+ if (size(du, kind=ilp) /= n-1) then
42
+ err0 = linalg_state_type(this, LINALG_VALUE_ERROR, "Vector du does not have the correct length.")
43
+ call linalg_error_handling(err0)
44
+ endif
45
+
46
+ ! Description of the matrix.
47
+ A%n = n
48
+ ! Matrix elements.
49
+ A%dl = dl ; A%dv = dv ; A%du = du
50
+ end function
51
+
52
+ pure module function initialize_constant_tridiagonal_pure_${s1}$(dl, dv, du, n) result(A)
53
+ !! Construct a `tridiagonal` matrix with constant elements.
54
+ ${t1}$, intent(in) :: dl, dv, du
55
+ !! tridiagonal matrix elements.
56
+ integer(ilp), intent(in) :: n
57
+ !! Matrix dimension.
58
+ type(tridiagonal_${s1}$_type) :: A
59
+ !! Corresponding tridiagonal matrix.
60
+
61
+ ! Internal variables.
62
+ integer(ilp) :: i
63
+ type(linalg_state_type) :: err0
64
+
65
+ ! Description of the matrix.
66
+ A%n = n
67
+ if (n <= 0) then
68
+ err0 = linalg_state_type(this, LINALG_VALUE_ERROR, "Matrix size needs to be positive, n = ", n, ".")
69
+ call linalg_error_handling(err0)
70
+ endif
71
+ ! Matrix elements.
72
+ A%dl = [(dl, i = 1, n-1)]
73
+ A%dv = [(dv, i = 1, n)]
74
+ A%du = [(du, i = 1, n-1)]
75
+ end function
76
+
77
+ module function initialize_tridiagonal_impure_${s1}$(dl, dv, du, err) result(A)
18
78
!! Construct a `tridiagonal` matrix from the rank-1 arrays
19
79
!! `dl`, `dv` and `du`.
20
80
${t1}$, intent(in) :: dl(:), dv(:), du(:)
21
81
!! tridiagonal matrix elements.
82
+ type(linalg_state_type), intent(out) :: err
83
+ !! Error handling.
22
84
type(tridiagonal_${s1}$_type) :: A
23
85
!! Corresponding tridiagonal matrix.
24
86
25
87
! Internal variables.
26
88
integer(ilp) :: n
89
+ type(linalg_state_type) :: err0
27
90
28
91
! Sanity check.
29
- n = size(dv)
30
- if (size(dl) /= n-1) error stop "Vector dl does not have the correct length."
31
- if (size(du) /= n-1) error stop "Vector du does not have the correct length."
92
+ n = size(dv, kind=ilp)
93
+ if (n <= 0) then
94
+ err0 = linalg_state_type(this, LINALG_VALUE_ERROR, "Matrix size needs to be positive, n = ", n, ".")
95
+ call linalg_error_handling(err0, err)
96
+ endif
97
+ if (size(dl, kind=ilp) /= n-1) then
98
+ err0 = linalg_state_type(this, LINALG_VALUE_ERROR, "Vector dl does not have the correct length.")
99
+ call linalg_error_handling(err0, err)
100
+ endif
101
+ if (size(du, kind=ilp) /= n-1) then
102
+ err0 = linalg_state_type(this, LINALG_VALUE_ERROR, "Vector du does not have the correct length.")
103
+ call linalg_error_handling(err0, err)
104
+ endif
32
105
33
106
! Description of the matrix.
34
107
A%n = n
35
108
! Matrix elements.
36
109
A%dl = dl ; A%dv = dv ; A%du = du
37
110
end function
38
111
39
- pure module function initialize_constant_tridiagonal_ ${s1}$(dl, dv, du, n) result(A)
112
+ module function initialize_constant_tridiagonal_impure_ ${s1}$(dl, dv, du, n, err ) result(A)
40
113
!! Construct a `tridiagonal` matrix with constant elements.
41
114
${t1}$, intent(in) :: dl, dv, du
42
115
!! tridiagonal matrix elements.
43
116
integer(ilp), intent(in) :: n
44
117
!! Matrix dimension.
118
+ type(linalg_state_type), intent(out) :: err
119
+ !! Error handling
45
120
type(tridiagonal_${s1}$_type) :: A
46
121
!! Corresponding tridiagonal matrix.
47
122
48
123
! Internal variables.
49
124
integer(ilp) :: i
125
+ type(linalg_state_type) :: err0
50
126
51
127
! Description of the matrix.
52
128
A%n = n
129
+ if (n <= 0) then
130
+ err0 = linalg_state_type(this, LINALG_VALUE_ERROR, "Matrix size needs to be positive, n = ", n, ".")
131
+ call linalg_error_handling(err0, err)
132
+ endif
53
133
! Matrix elements.
54
134
A%dl = [(dl, i = 1, n-1)]
55
135
A%dv = [(dv, i = 1, n)]
0 commit comments