Skip to content

Commit 5221f13

Browse files
committed
Fix scalar multiplication for Hermitian matrices.
1 parent 1644315 commit 5221f13

File tree

3 files changed

+47
-11
lines changed

3 files changed

+47
-11
lines changed

src/stdlib_specialmatrices.fypp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,11 +452,21 @@ module stdlib_specialmatrices
452452
pure module function scalar_multiplication_hermtridiagonal_${s1}$(alpha, A) result(B)
453453
${t1}$, intent(in) :: alpha
454454
type(hermtridiagonal_${s1}$_type), intent(in) :: A
455-
type(hermtridiagonal_${s1}$_type) :: B
455+
type(tridiagonal_${s1}$_type) :: B
456456
end function
457457
pure module function scalar_multiplication_bis_hermtridiagonal_${s1}$(A, alpha) result(B)
458458
type(hermtridiagonal_${s1}$_type), intent(in) :: A
459459
${t1}$, intent(in) :: alpha
460+
type(tridiagonal_${s1}$_type) :: B
461+
end function
462+
pure module function real_scalar_multiplication_hermtridiagonal_${s1}$(alpha, A) result(B)
463+
real(${k1}$), intent(in) :: alpha
464+
type(hermtridiagonal_${s1}$_type), intent(in) :: A
465+
type(hermtridiagonal_${s1}$_type) :: B
466+
end function
467+
pure module function real_scalar_multiplication_bis_hermtridiagonal_${s1}$(A, alpha) result(B)
468+
type(hermtridiagonal_${s1}$_type), intent(in) :: A
469+
real(${k1}$), intent(in) :: alpha
460470
type(hermtridiagonal_${s1}$_type) :: B
461471
end function
462472
#:endif

src/stdlib_specialmatrices_tridiagonal.fypp

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -549,17 +549,33 @@ submodule (stdlib_specialmatrices) tridiagonal_matrices
549549
pure module function scalar_multiplication_hermtridiagonal_${s1}$(alpha, A) result(B)
550550
${t1}$, intent(in) :: alpha
551551
type(hermtridiagonal_${s1}$_type), intent(in) :: A
552-
type(hermtridiagonal_${s1}$_type) :: B
553-
B = hermtridiagonal(A%dv, A%du)
554-
B%dl = alpha*B%dl; B%dv = alpha*B%dv; B%du = conjg(B%dl)
552+
type(tridiagonal_${s1}$_type) :: B
553+
B = tridiagonal(A%dl, A%dv, A%du)
554+
B%dl = alpha*B%dl; B%dv = alpha*B%dv; B%du = alpha*B%du
555555
end function
556556

557557
pure module function scalar_multiplication_bis_hermtridiagonal_${s1}$(A, alpha) result(B)
558558
type(hermtridiagonal_${s1}$_type), intent(in) :: A
559559
${t1}$, intent(in) :: alpha
560+
type(tridiagonal_${s1}$_type) :: B
561+
B = tridiagonal(A%dl, A%dv, A%du)
562+
B%dl = alpha*B%dl; B%dv = alpha*B%dv; B%du = alpha*B%du
563+
end function
564+
565+
pure module function real_scalar_multiplication_hermtridiagonal_${s1}$(alpha, A) result(B)
566+
real(${k1}$), intent(in) :: alpha
567+
type(hermtridiagonal_${s1}$_type), intent(in) :: A
568+
type(hermtridiagonal_${s1}$_type) :: B
569+
B = hermtridiagonal(A%dv, A%du)
570+
B%dl = alpha*B%dl; B%dv = alpha*B%dv; B%du = alpha*B%du
571+
end function
572+
573+
pure module function real_scalar_multiplication_bis_hermtridiagonal_${s1}$(A, alpha) result(B)
574+
type(hermtridiagonal_${s1}$_type), intent(in) :: A
575+
real(${k1}$), intent(in) :: alpha
560576
type(hermtridiagonal_${s1}$_type) :: B
561577
B = hermtridiagonal(A%dv, A%du)
562-
B%dl = alpha*B%dl; B%dv = alpha*B%dv; B%du = conjg(B%dl)
578+
B%dl = alpha*B%dl; B%dv = alpha*B%dv; B%du = alpha*B%du
563579
end function
564580
#:endif
565581
#:endfor

test/linalg/test_linalg_specialmatrices.fypp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -400,9 +400,11 @@ contains
400400
integer, parameter :: wp = ${k1}$
401401
integer, parameter :: n = 5
402402
type(hermtridiagonal_${s1}$_type) :: A, B, C
403-
${t1}$, allocatable :: Amat(:, :), Bmat(:, :), Cmat(:, :)
403+
type(tridiagonal_${s1}$_type) :: D
404+
${t1}$, allocatable :: Amat(:, :), Bmat(:, :), Cmat(:, :), Dmat(:, :)
404405
${t1}$, allocatable :: dv(:), ev(:)
405-
${t1}$, parameter :: alpha = 2.0_dp
406+
${t1}$, parameter :: alpha = cmplx(2.0_wp, 2.0_wp, kind=wp)
407+
real(${k1}$), parameter :: beta = 2.0_wp
406408
integer :: i, j
407409
real(wp), allocatable :: data(:, :)
408410

@@ -428,12 +430,20 @@ contains
428430
if (allocated(error)) return
429431

430432
! Matrix scalar multiplication
431-
C = alpha * A ; Cmat = dense(C)
432-
call check(error, all_close(Cmat, alpha * Amat), .true.)
433+
D = alpha * A ; Dmat = dense(D)
434+
call check(error, all_close(Dmat, alpha * Amat), .true.)
433435
if (allocated(error)) return
434436

435-
C = A *alpha ; Cmat = dense(C)
436-
call check(error, all_close(Cmat, alpha * Amat), .true.)
437+
D = A * alpha ; Dmat = dense(D)
438+
call check(error, all_close(Dmat, alpha * Amat), .true.)
439+
if (allocated(error)) return
440+
441+
C = beta * A ; Cmat = dense(C)
442+
call check(error, all_close(Cmat, beta * Amat), .true.)
443+
if (allocated(error)) return
444+
445+
C = A * beta ; Cmat = dense(C)
446+
call check(error, all_close(Cmat, beta * Amat), .true.)
437447
if (allocated(error)) return
438448
end block
439449
#:endfor

0 commit comments

Comments
 (0)