Skip to content

Commit d2d9aef

Browse files
committed
alpha and beta now supports complex values also
1 parent 27906b3 commit d2d9aef

File tree

6 files changed

+51
-12
lines changed

6 files changed

+51
-12
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
ADD_EXAMPLE(specialmatrices_dp_spmv)
2+
ADD_EXAMPLE(specialmatrices_cdp_spmv)
23
ADD_EXAMPLE(tridiagonal_dp_type)
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
program example_tridiagonal_matrix_cdp
2+
use stdlib_linalg_constants, only: dp
3+
use stdlib_specialmatrices, only: tridiagonal_cdp_type, tridiagonal, dense, spmv
4+
implicit none
5+
6+
integer, parameter :: n = 5
7+
type(tridiagonal_cdp_type) :: A
8+
complex(dp) :: dl(n-1), dv(n), du(n-1)
9+
complex(dp) :: x(n), y(n), y_dense(n)
10+
integer :: i
11+
complex(dp) :: alpha, beta
12+
13+
dl = [(cmplx(i,0.0_dp, dp), i=1, n - 1)]
14+
dv = [(cmplx(2*i,0.0_dp, dp), i=1, n )]
15+
du = [(cmplx(3*i,0.0_dp, dp), i=1, n - 1)]
16+
17+
A = tridiagonal(dl, dv, du)
18+
19+
x = (1.0_dp, 0.0_dp)
20+
y = (0.0_dp, 0.0_dp)
21+
y_dense = (0.0_dp, 0.0_dp)
22+
alpha = cmplx(2.0_dp, 3.0_dp)
23+
beta = cmplx(-1.0_dp, 5.0_dp)
24+
25+
y_dense = alpha * matmul(dense(A), x) + beta * y
26+
call spmv(A, x, y, alpha, beta)
27+
28+
print *, 'dense :', y_dense
29+
print *, 'Tridiagonal :', y
30+
end program example_tridiagonal_matrix_cdp

src/stdlib_extended_lapack.fypp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ contains
1111
pure module subroutine stdlib${ii}$_glagtm_${s1}$(trans, n, nrhs, alpha, dl, d, du, x, ldx, beta, b, ldb)
1212
character, intent(in) :: trans
1313
integer(${ik}$), intent(in) :: ldb, ldx, n, nrhs
14-
real(${k1}$), intent(in) :: alpha, beta
14+
${t1}$, intent(in) :: alpha, beta
1515
${t1}$, intent(inout) :: b(ldb,*)
1616
${t1}$, intent(in) :: d(*), dl(*), du(*), x(ldx,*)
1717

src/stdlib_extended_lapack_base.fypp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ module stdlib_extended_lapack_base
1212
pure module subroutine stdlib${ii}$_glagtm_${s1}$(trans, n, nrhs, alpha, dl, d, du, x, ldx, beta, b, ldb)
1313
character, intent(in) :: trans
1414
integer(${ik}$), intent(in) :: ldb, ldx, n, nrhs
15-
real(${k1}$), intent(in) :: alpha, beta
15+
${t1}$, intent(in) :: alpha, beta
1616
${t1}$, intent(inout) :: b(ldb,*)
1717
${t1}$, intent(in) :: d(*), dl(*), du(*), x(ldx,*)
1818
end subroutine stdlib${ii}$_glagtm_${s1}$

src/stdlib_specialmatrices.fypp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,8 @@ module stdlib_specialmatrices
146146
type(tridiagonal_${s1}$_type), intent(in) :: A
147147
${t1}$, intent(in), contiguous, target :: x${ranksuffix(rank)}$
148148
${t1}$, intent(inout), contiguous, target :: y${ranksuffix(rank)}$
149-
real(${k1}$), intent(in), optional :: alpha
150-
real(${k1}$), intent(in), optional :: beta
149+
${t1}$, intent(in), optional :: alpha
150+
${t1}$, intent(in), optional :: beta
151151
character(1), intent(in), optional :: op
152152
end subroutine
153153
#:endfor

src/stdlib_specialmatrices_tridiagonal.fypp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -155,15 +155,15 @@ submodule (stdlib_specialmatrices) tridiagonal_matrices
155155
type(tridiagonal_${s1}$_type), intent(in) :: A
156156
${t1}$, intent(in), contiguous, target :: x${ranksuffix(rank)}$
157157
${t1}$, intent(inout), contiguous, target :: y${ranksuffix(rank)}$
158-
real(${k1}$), intent(in), optional :: alpha
159-
real(${k1}$), intent(in), optional :: beta
158+
${t1}$, intent(in), optional :: alpha
159+
${t1}$, intent(in), optional :: beta
160160
character(1), intent(in), optional :: op
161161

162162
! Internal variables.
163-
real(${k1}$) :: alpha_, beta_
163+
${t1}$ :: alpha_, beta_
164164
integer(ilp) :: n, nrhs, ldx, ldy
165165
character(1) :: op_
166-
logical :: alpha_special, beta_special
166+
logical :: is_alpha_special, is_beta_special
167167

168168
#:if rank == 1
169169
${t1}$, pointer :: xmat(:, :), ymat(:, :)
@@ -174,8 +174,8 @@ submodule (stdlib_specialmatrices) tridiagonal_matrices
174174
beta_ = 0.0_${k1}$ ; if (present(beta)) beta_ = beta
175175
op_ = "N" ; if (present(op)) op_ = op
176176

177-
alpha_special = (alpha_ == 1.0_${k1}$ .or. alpha_ == 0.0_${k1}$ .or. alpha_ == -1.0_${k1}$)
178-
beta_special = (beta_ == 1.0_${k1}$ .or. beta_ == 0.0_${k1}$ .or. beta_ == -1.0_${k1}$)
177+
is_alpha_special = (alpha_ == 1.0_${k1}$ .or. alpha_ == 0.0_${k1}$ .or. alpha_ == -1.0_${k1}$)
178+
is_beta_special = (beta_ == 1.0_${k1}$ .or. beta_ == 0.0_${k1}$ .or. beta_ == -1.0_${k1}$)
179179

180180
! Prepare Lapack arguments.
181181
n = A%n ; ldx = n ; ldy = n ;
@@ -184,18 +184,26 @@ submodule (stdlib_specialmatrices) tridiagonal_matrices
184184
#:if rank == 1
185185
! Pointer trick.
186186
xmat(1:n, 1:nrhs) => x ; ymat(1:n, 1:nrhs) => y
187-
if(alpha_special .and. beta_special) then
187+
#:if t1.startswith('complex')
188+
call glagtm(op_, n, nrhs, alpha_, A%dl, A%dv, A%du, xmat, ldx, beta_, ymat, ldy)
189+
#:else
190+
if(is_alpha_special .and. is_beta_special) then
188191
call lagtm(op_, n, nrhs, alpha_, A%dl, A%dv, A%du, xmat, ldx, beta_, ymat, ldy)
189192
else
190193
call glagtm(op_, n, nrhs, alpha_, A%dl, A%dv, A%du, xmat, ldx, beta_, ymat, ldy)
191194
end if
195+
#:endif
192196
#:else
193-
if(alpha_special .and. beta_special) then
197+
#:if t1.startswith('complex')
198+
call glagtm(op_, n, nrhs, alpha_, A%dl, A%dv, A%du, x, ldx, beta_, y, ldy)
199+
#:else
200+
if(is_alpha_special .and. is_beta_special) then
194201
call lagtm(op_, n, nrhs, alpha_, A%dl, A%dv, A%du, x, ldx, beta_, y, ldy)
195202
else
196203
call glagtm(op_, n, nrhs, alpha_, A%dl, A%dv, A%du, x, ldx, beta_, y, ldy)
197204
end if
198205
#:endif
206+
#:endif
199207
end subroutine
200208
#:endfor
201209
#:endfor

0 commit comments

Comments
 (0)