Skip to content

Commit 59ffb20

Browse files
committed
Error handling tests.
1 parent 4310db5 commit 59ffb20

File tree

2 files changed

+46
-7
lines changed

2 files changed

+46
-7
lines changed

src/stdlib_linalg_matrix_functions.fypp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,20 @@ contains
4040

4141
! Deal with optional args.
4242
order_ = 10 ; if (present(order)) order_ = order
43+
print *, "inside expm :", order_
4344

4445
! Problem's dimension.
4546
m = size(A, 1) ; n = size(A, 2)
4647

4748
if (m /= n) then
48-
err = linalg_state_type(this,LINALG_VALUE_ERROR,'Invalid matrix size A=',[m, n])
49+
err0 = linalg_state_type(this,LINALG_VALUE_ERROR,'Invalid matrix size A=',[m, n])
4950
call linalg_error_handling(err0, err)
51+
return
5052
else if (order_ < 0) then
51-
err = linalg_state_type(this, LINALG_VALUE_ERROR, 'Order of Pade approximation &
53+
err0 = linalg_state_type(this, LINALG_VALUE_ERROR, 'Order of Pade approximation &
5254
needs to be positive, order=', order_)
5355
call linalg_error_handling(err0, err)
56+
return
5457
endif
5558

5659
! Compute the L-infinity norm.
@@ -100,11 +103,11 @@ contains
100103

101104
! Matrix squaring.
102105
block
103-
${rt}$ :: E_tmp(n, n)
104-
do k = 1, s
105-
E_tmp = E
106-
call gemm("N", "N", n, n, n, one_${ri}$, E_tmp, n, E_tmp, n, zero_${ri}$, E, n)
107-
enddo
106+
${rt}$ :: E_tmp(n, n)
107+
do k = 1, s
108+
E_tmp = E
109+
call gemm("N", "N", n, n, n, one_${ri}$, E_tmp, n, E_tmp, n, zero_${ri}$, E, n)
110+
enddo
108111
end block
109112
return
110113
contains

test/linalg/test_linalg_expm.fypp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ module test_linalg_expm
55
use testdrive, only: error_type, check, new_unittest, unittest_type
66
use stdlib_linalg_constants
77
use stdlib_linalg, only: expm, eye, mnorm
8+
use stdlib_linalg_state, only: linalg_state_type, linalg_error_handling, LINALG_ERROR, &
9+
LINALG_INTERNAL_ERROR, LINALG_VALUE_ERROR
810

911
implicit none (type,external)
1012

@@ -21,6 +23,7 @@ module test_linalg_expm
2123

2224
#:for rk,rt,ri in RC_KINDS_TYPES
2325
tests = [tests, new_unittest("expm_${ri}$",test_expm_${ri}$)]
26+
tests = [tests, new_unittest("Error-handling expm_${ri}$",test_error_handling_expm_${ri}$)]
2427
#:endfor
2528

2629
end subroutine test_expm_computation
@@ -61,6 +64,39 @@ module test_linalg_expm
6164
end subroutine test_expm_${ri}$
6265
#:endfor
6366

67+
!> Test error handler.
68+
#:for rk,rt,ri in RC_KINDS_TYPES
69+
subroutine test_error_handling_expm_${ri}$(error)
70+
type(error_type), allocatable, intent(out) :: error
71+
! Problem dimension.
72+
integer(ilp), parameter :: n = 5, m = 6
73+
! Test matrix.
74+
${rt}$ :: A(n, n), E(n, n)
75+
type(linalg_state_type) :: err
76+
integer(ilp) :: i
77+
78+
! Initialize matrix.
79+
A = 0.0_${rk}$
80+
do i = 1, n-1
81+
A(i, i+1) = m*1.0_${rk}$
82+
enddo
83+
84+
! Compute matrix exponential.
85+
E = expm(A, order=-1, err=err)
86+
! Check result.
87+
call check(error, err%error(), "Negative Pade order")
88+
if (allocated(error)) return
89+
90+
! Compute matrix exponential.
91+
E = expm(A(:n, :n-1), err=err)
92+
! Check result.
93+
call check(error, err%error(), "Invalid matrix size")
94+
if (allocated(error)) return
95+
96+
return
97+
end subroutine test_error_handling_expm_${ri}$
98+
#:endfor
99+
64100
end module test_linalg_expm
65101

66102
program test_expm

0 commit comments

Comments
 (0)