Skip to content
7 changes: 7 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,13 @@ if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU AND CMAKE_Fortran_COMPILER_VERSION VER
message(FATAL_ERROR "GCC Version 9 or newer required")
endif()

# --- silence gfortran-15 argument-mismatch warnings
if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU
AND CMAKE_Fortran_COMPILER_VERSION VERSION_GREATER_EQUAL 15.0
AND CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 16.0)
add_compile_options("$<$<COMPILE_LANGUAGE:Fortran>:-Wno-external-argument-mismatch>")
endif()

# --- compiler feature checks
include(CheckFortranSourceCompiles)
include(CheckFortranSourceRuns)
Expand Down
22 changes: 21 additions & 1 deletion test/linalg/test_linalg_cholesky.fypp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ module test_linalg_cholesky
allocate(tests(0))

#:for rk,rt,ri in RC_KINDS_TYPES
tests = [tests,new_unittest("least_cholesky_${ri}$",test_cholesky_${ri}$)]
call add_test(tests,new_unittest("least_cholesky_${ri}$",test_cholesky_${ri}$))
#:endfor

end subroutine test_cholesky_factorization
Expand Down Expand Up @@ -66,6 +66,26 @@ module test_linalg_cholesky

#:endfor

! gcc-15 bugfix utility
subroutine add_test(tests,new_test)
type(unittest_type), allocatable, intent(inout) :: tests(:)
type(unittest_type), intent(in) :: new_test

integer :: n
type(unittest_type), allocatable :: new_tests(:)

if (allocated(tests)) then
n = size(tests)
else
n = 0
end if

allocate(new_tests(n+1))
if (n>0) new_tests(1:n) = tests(1:n)
new_tests(1+n) = new_test
call move_alloc(from=new_tests,to=tests)

end subroutine add_test

end module test_linalg_cholesky

Expand Down
27 changes: 24 additions & 3 deletions test/linalg/test_linalg_determinant.fypp
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@ module test_linalg_determinant

#:for rk,rt in RC_KINDS_TYPES
#:if rk!="xdp"
tests = [tests,new_unittest("$eye_det_${rt[0]}$${rk}$",test_${rt[0]}$${rk}$_eye_determinant)]
tests = [tests,new_unittest("$eye_det_multiple_${rt[0]}$${rk}$",test_${rt[0]}$${rk}$_eye_multiple)]
call add_test(tests,new_unittest("$eye_det_${rt[0]}$${rk}$",test_${rt[0]}$${rk}$_eye_determinant))
call add_test(tests,new_unittest("$eye_det_multiple_${rt[0]}$${rk}$",test_${rt[0]}$${rk}$_eye_multiple))
#:endif
#:endfor
#:for ck,ct in CMPLX_KINDS_TYPES
#:if ck!="xdp"
tests = [tests,new_unittest("$complex_det_${rt[0]}$${rk}$",test_${ct[0]}$${ck}$_complex_determinant)]
call add_test(tests,new_unittest("$complex_det_${rt[0]}$${rk}$",test_${ct[0]}$${ck}$_complex_determinant))
#:endif
#: endfor

Expand Down Expand Up @@ -143,6 +143,27 @@ module test_linalg_determinant

#:endif
#:endfor

! gcc-15 bugfix utility
subroutine add_test(tests,new_test)
type(unittest_type), allocatable, intent(inout) :: tests(:)
type(unittest_type), intent(in) :: new_test

integer :: n
type(unittest_type), allocatable :: new_tests(:)

if (allocated(tests)) then
n = size(tests)
else
n = 0
end if

allocate(new_tests(n+1))
if (n>0) new_tests(1:n) = tests(1:n)
new_tests(1+n) = new_test
call move_alloc(from=new_tests,to=tests)

end subroutine add_test

end module test_linalg_determinant

Expand Down
38 changes: 28 additions & 10 deletions test/linalg/test_linalg_eigenvalues.fypp
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,17 @@ module test_linalg_eigenvalues
allocate(tests(0))

#:for rk,rt,ri in REAL_KINDS_TYPES
tests = [tests,new_unittest("test_eig_real_${ri}$",test_eig_real_${ri}$), &
new_unittest("test_eigvals_identity_${ri}$",test_eigvals_identity_${ri}$), &
new_unittest("test_eigvals_diagonal_B_${ri}$",test_eigvals_diagonal_B_${ri}$), &
new_unittest("test_eigvals_nondiagonal_B_${ri}$",test_eigvals_nondiagonal_B_${ri}$), &
new_unittest("test_eigh_real_${ri}$",test_eigh_real_${ri}$)]
call add_test(tests,new_unittest("test_eig_real_${ri}$",test_eig_real_${ri}$))
call add_test(tests,new_unittest("test_eigvals_identity_${ri}$",test_eigvals_identity_${ri}$))
call add_test(tests,new_unittest("test_eigvals_diagonal_B_${ri}$",test_eigvals_diagonal_B_${ri}$))
call add_test(tests,new_unittest("test_eigvals_nondiagonal_B_${ri}$",test_eigvals_nondiagonal_B_${ri}$))
call add_test(tests,new_unittest("test_eigh_real_${ri}$",test_eigh_real_${ri}$))
#: endfor

#:for ck,ct,ci in CMPLX_KINDS_TYPES
tests = [tests,new_unittest("test_eig_complex_${ci}$",test_eig_complex_${ci}$), &
new_unittest("test_eig_generalized_complex_${ci}$",test_eigvals_generalized_complex_${ci}$), &
new_unittest("test_eig_issue_927_${ci}$",test_issue_927_${ci}$)]
call add_test(tests,new_unittest("test_eig_complex_${ci}$",test_eig_complex_${ci}$))
call add_test(tests,new_unittest("test_eig_generalized_complex_${ci}$",test_eigvals_generalized_complex_${ci}$))
call add_test(tests,new_unittest("test_eig_issue_927_${ci}$",test_issue_927_${ci}$))
#: endfor

end subroutine test_eig_eigh
Expand Down Expand Up @@ -347,8 +347,26 @@ module test_linalg_eigenvalues

#:endfor



! gcc-15 bugfix utility
subroutine add_test(tests,new_test)
type(unittest_type), allocatable, intent(inout) :: tests(:)
type(unittest_type), intent(in) :: new_test

integer :: n
type(unittest_type), allocatable :: new_tests(:)

if (allocated(tests)) then
n = size(tests)
else
n = 0
end if

allocate(new_tests(n+1))
if (n>0) new_tests(1:n) = tests(1:n)
new_tests(1+n) = new_test
call move_alloc(from=new_tests,to=tests)

end subroutine add_test

end module test_linalg_eigenvalues

Expand Down
27 changes: 24 additions & 3 deletions test/linalg/test_linalg_inverse.fypp
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ module test_linalg_inverse
allocate(tests(0))

#:for rk,rt,ri in RC_KINDS_TYPES
tests = [tests,new_unittest("${ri}$_eye_inverse",test_${ri}$_eye_inverse), &
new_unittest("${ri}$_singular_inverse",test_${ri}$_singular_inverse), &
new_unittest("${ri}$_random_spd_inverse",test_${ri}$_random_spd_inverse)]
call add_test(tests,new_unittest("${ri}$_eye_inverse",test_${ri}$_eye_inverse))
call add_test(tests,new_unittest("${ri}$_singular_inverse",test_${ri}$_singular_inverse))
call add_test(tests,new_unittest("${ri}$_random_spd_inverse",test_${ri}$_random_spd_inverse))
#:endfor

end subroutine test_inverse_matrix
Expand Down Expand Up @@ -291,6 +291,27 @@ module test_linalg_inverse

#:endfor

! gcc-15 bugfix utility
subroutine add_test(tests,new_test)
type(unittest_type), allocatable, intent(inout) :: tests(:)
type(unittest_type), intent(in) :: new_test

integer :: n
type(unittest_type), allocatable :: new_tests(:)

if (allocated(tests)) then
n = size(tests)
else
n = 0
end if

allocate(new_tests(n+1))
if (n>0) new_tests(1:n) = tests(1:n)
new_tests(1+n) = new_test
call move_alloc(from=new_tests,to=tests)

end subroutine add_test

end module test_linalg_inverse

program test_inv
Expand Down
27 changes: 24 additions & 3 deletions test/linalg/test_linalg_lstsq.fypp
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@ module test_linalg_least_squares

allocate(tests(0))

tests = [tests,new_unittest("issue_823",test_issue_823)]
call add_test(tests,new_unittest("issue_823",test_issue_823))

#:for rk,rt,ri in REAL_KINDS_TYPES
tests = [tests,new_unittest("least_squares_${ri}$",test_lstsq_one_${ri}$), &
new_unittest("least_squares_randm_${ri}$",test_lstsq_random_${ri}$)]
call add_test(tests,new_unittest("least_squares_${ri}$",test_lstsq_one_${ri}$))
call add_test(tests,new_unittest("least_squares_randm_${ri}$",test_lstsq_random_${ri}$))
#:endfor

end subroutine test_least_squares
Expand Down Expand Up @@ -139,6 +139,27 @@ module test_linalg_least_squares

end subroutine test_issue_823

! gcc-15 bugfix utility
subroutine add_test(tests,new_test)
type(unittest_type), allocatable, intent(inout) :: tests(:)
type(unittest_type), intent(in) :: new_test

integer :: n
type(unittest_type), allocatable :: new_tests(:)

if (allocated(tests)) then
n = size(tests)
else
n = 0
end if

allocate(new_tests(n+1))
if (n>0) new_tests(1:n) = tests(1:n)
new_tests(1+n) = new_test
call move_alloc(from=new_tests,to=tests)

end subroutine add_test

end module test_linalg_least_squares

program test_lstsq
Expand Down
25 changes: 23 additions & 2 deletions test/linalg/test_linalg_mnorm.fypp
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ module test_linalg_mnorm
allocate(tests(0))

#:for rk,rt,ri in RC_KINDS_TYPES
tests = [tests,new_unittest("test_matrix_norms_${ri}$",test_matrix_norms_${ri}$)]
call add_test(tests,new_unittest("test_matrix_norms_${ri}$",test_matrix_norms_${ri}$))
#:for rank in range(3, MAXRANK)
tests = [tests,new_unittest("test_mnorm_${ri}$_${rank}$d",test_mnorm_${ri}$_${rank}$d)]
call add_test(tests,new_unittest("test_mnorm_${ri}$_${rank}$d",test_mnorm_${ri}$_${rank}$d))
#:endfor
#:endfor

Expand Down Expand Up @@ -135,6 +135,27 @@ module test_linalg_mnorm

#:endfor

! gcc-15 bugfix utility
subroutine add_test(tests,new_test)
type(unittest_type), allocatable, intent(inout) :: tests(:)
type(unittest_type), intent(in) :: new_test

integer :: n
type(unittest_type), allocatable :: new_tests(:)

if (allocated(tests)) then
n = size(tests)
else
n = 0
end if

allocate(new_tests(n+1))
if (n>0) new_tests(1:n) = tests(1:n)
new_tests(1+n) = new_test
call move_alloc(from=new_tests,to=tests)

end subroutine add_test

end module test_linalg_mnorm

program test_mnorm
Expand Down
30 changes: 25 additions & 5 deletions test/linalg/test_linalg_norm.fypp
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,16 @@ module test_linalg_norm
allocate(tests(0))

#:for rk,rt,ri in RC_KINDS_TYPES
tests = [tests,new_unittest("strided_1d_norm_${ri}$",test_strided_1d_${ri}$)]
call add_test(tests,new_unittest("strided_1d_norm_${ri}$",test_strided_1d_${ri}$))
#:for rank in range(1, MAXRANK)
tests = [tests,new_unittest("norm_${ri}$_${rank}$d",test_norm_${ri}$_${rank}$d)]
call add_test(tests,new_unittest("norm_${ri}$_${rank}$d",test_norm_${ri}$_${rank}$d))
#:endfor
#:for rank in range(2, MAXRANK)
#:if rt.startswith('real')
tests = [tests,new_unittest("norm2_${ri}$_${rank}$d",test_norm2_${ri}$_${rank}$d)]
call add_test(tests,new_unittest("norm2_${ri}$_${rank}$d",test_norm2_${ri}$_${rank}$d))
#:endif
tests = [tests,new_unittest("maxabs_${ri}$_${rank}$d",test_maxabs_${ri}$_${rank}$d)]
tests = [tests,new_unittest("norm_dimmed_${ri}$_${rank}$d",test_norm_dimmed_${ri}$_${rank}$d)]
call add_test(tests,new_unittest("maxabs_${ri}$_${rank}$d",test_maxabs_${ri}$_${rank}$d))
call add_test(tests,new_unittest("norm_dimmed_${ri}$_${rank}$d",test_norm_dimmed_${ri}$_${rank}$d))
#:endfor
#:endfor

Expand Down Expand Up @@ -268,6 +268,26 @@ module test_linalg_norm
#:endfor
#:endfor

! gcc-15 bugfix utility
subroutine add_test(tests,new_test)
type(unittest_type), allocatable, intent(inout) :: tests(:)
type(unittest_type), intent(in) :: new_test

integer :: n
type(unittest_type), allocatable :: new_tests(:)

if (allocated(tests)) then
n = size(tests)
else
n = 0
end if

allocate(new_tests(n+1))
if (n>0) new_tests(1:n) = tests(1:n)
new_tests(1+n) = new_test
call move_alloc(from=new_tests,to=tests)

end subroutine add_test

end module test_linalg_norm

Expand Down
31 changes: 26 additions & 5 deletions test/linalg/test_linalg_pseudoinverse.fypp
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ module test_linalg_pseudoinverse
allocate(tests(0))

#:for rk,rt,ri in REAL_KINDS_TYPES
tests = [tests,new_unittest("${ri}$_eye_pseudoinverse",test_${ri}$_eye_pseudoinverse)]
call add_test(tests,new_unittest("${ri}$_eye_pseudoinverse",test_${ri}$_eye_pseudoinverse))
#:endfor
#:for rk,rt,ri in RC_KINDS_TYPES
tests = [tests,new_unittest("${ri}$_square_pseudoinverse",test_${ri}$_square_pseudoinverse), &
new_unittest("${ri}$_tall_pseudoinverse",test_${ri}$_tall_pseudoinverse), &
new_unittest("${ri}$_wide_pseudoinverse",test_${ri}$_wide_pseudoinverse), &
new_unittest("${ri}$_singular_pseudoinverse",test_${ri}$_singular_pseudoinverse)]
call add_test(tests,new_unittest("${ri}$_square_pseudoinverse",test_${ri}$_square_pseudoinverse))
call add_test(tests,new_unittest("${ri}$_tall_pseudoinverse",test_${ri}$_tall_pseudoinverse))
call add_test(tests,new_unittest("${ri}$_wide_pseudoinverse",test_${ri}$_wide_pseudoinverse))
call add_test(tests,new_unittest("${ri}$_singular_pseudoinverse",test_${ri}$_singular_pseudoinverse))
#:endfor

end subroutine test_pseudoinverse_matrix
Expand Down Expand Up @@ -218,6 +218,27 @@ module test_linalg_pseudoinverse

#:endfor

! gcc-15 bugfix utility
subroutine add_test(tests,new_test)
type(unittest_type), allocatable, intent(inout) :: tests(:)
type(unittest_type), intent(in) :: new_test

integer :: n
type(unittest_type), allocatable :: new_tests(:)

if (allocated(tests)) then
n = size(tests)
else
n = 0
end if

allocate(new_tests(n+1))
if (n>0) new_tests(1:n) = tests(1:n)
new_tests(1+n) = new_test
call move_alloc(from=new_tests,to=tests)

end subroutine add_test

end module test_linalg_pseudoinverse

program test_inv
Expand Down
Loading
Loading