Skip to content

Commit e10e4c4

Browse files
committed
test for singular matrix; activate complex matrix tests
1 parent 6a1c397 commit e10e4c4

File tree

1 file changed

+46
-9
lines changed

1 file changed

+46
-9
lines changed

test/linalg/test_linalg_inverse.fypp

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
module test_linalg_inverse
55
use testdrive, only: error_type, check, new_unittest, unittest_type
66
use stdlib_linalg_constants
7-
use stdlib_linalg, only: inv,invert,operator(.inv.)
8-
use stdlib_linalg_state, only: linalg_state_type
7+
use stdlib_linalg, only: inv,invert,operator(.inv.),eye
8+
use stdlib_linalg_state, only: linalg_state_type,LINALG_ERROR
99

1010
implicit none (type,external)
1111
private
@@ -21,29 +21,27 @@ module test_linalg_inverse
2121

2222
allocate(tests(0))
2323

24-
#:for rk,rt,ri in REAL_KINDS_TYPES
24+
#:for rk,rt,ri in RC_KINDS_TYPES
2525
#:if rk!="xdp"
26-
tests = [tests,new_unittest("inverse_${ri}$_eye_inverse",test_${ri}$_eye_inverse)]
26+
tests = [tests,new_unittest("${ri}$_eye_inverse",test_${ri}$_eye_inverse), &
27+
new_unittest("${ri}$_singular_inverse",test_${ri}$_singular_inverse)]
2728
#:endif
2829
#:endfor
2930

3031
end subroutine test_inverse_matrix
3132

32-
!> Invert real identity matrix
3333
#:for rk,rt,ri in REAL_KINDS_TYPES
3434
#:if rk!="xdp"
35+
!> Invert real identity matrix
3536
subroutine test_${ri}$_eye_inverse(error)
3637
type(error_type), allocatable, intent(out) :: error
3738

3839
type(linalg_state_type) :: state
3940

4041
integer(ilp), parameter :: n = 25_ilp
41-
integer(ilp) :: i,j
4242
${rt}$ :: a(n,n),inva(n,n)
4343

44-
do concurrent (i=1:n,j=1:n)
45-
a(i,j) = merge(1.0_${rk}$,0.0_${rk}$,i==j)
46-
end do
44+
a = eye(n)
4745

4846
!> Inverse function
4947
inva = inv(a,err=state)
@@ -64,6 +62,27 @@ module test_linalg_inverse
6462

6563
end subroutine test_${ri}$_eye_inverse
6664

65+
!> Invert singular matrix
66+
subroutine test_${ri}$_singular_inverse(error)
67+
type(error_type), allocatable, intent(out) :: error
68+
69+
type(linalg_state_type) :: err
70+
71+
integer(ilp), parameter :: n = 25_ilp
72+
${rt}$ :: a(n,n)
73+
74+
a = eye(n)
75+
76+
!> Make rank-deficient
77+
a(12,12) = 0
78+
79+
!> Inverse function
80+
call invert(a,err=err)
81+
call check(error,err%state==LINALG_ERROR,'singular ${rt}$ inverse returned '//err%print())
82+
if (allocated(error)) return
83+
84+
end subroutine test_${ri}$_singular_inverse
85+
6786
#:endif
6887
#:endfor
6988

@@ -132,6 +151,24 @@ module test_linalg_inverse
132151

133152
end subroutine test_${ci}$_eye_inverse
134153

154+
!> Invert singular matrix
155+
subroutine test_${ci}$_singular_inverse(error)
156+
type(error_type), allocatable, intent(out) :: error
157+
158+
type(linalg_state_type) :: err
159+
160+
integer(ilp), parameter :: n = 25_ilp
161+
${ct}$ :: a(n,n)
162+
163+
a = (0.0_${ck}$,0.0_${ck}$)
164+
165+
!> Inverse function
166+
call invert(a,err=err)
167+
call check(error,err%state==LINALG_ERROR,'singular ${ct}$ inverse returned '//err%print())
168+
if (allocated(error)) return
169+
170+
end subroutine test_${ci}$_singular_inverse
171+
135172
#:endif
136173
#:endfor
137174

0 commit comments

Comments
 (0)