program test_solver2
use kinds
use forsolver
use forunittest
implicit none
real(rk), dimension(:,:), allocatable :: A
real(rk), dimension(:) , allocatable :: x1, x2, x3, expected_x, b
integer :: m,n, i, j
type(unit_test) :: ut
m = 4
n = 4
allocate(A(m,n),b(m),x1(n),x2(n),x3(n),expected_x(n))
A(1,:) = [ 1.0_rk, 1.0_rk, -3.0_rk, 1.0_rk]
A(2,:) = [-5.0_rk, 3.0_rk, -4.0_rk, 1.0_rk]
A(3,:) = [ 1.0_rk, 0.0_rk, 2.0_rk, -1.0_rk]
A(4,:) = [ 1.0_rk, 2.0_rk, 0.0_rk, 0.0_rk]
b = [2.0_rk, 0.0_rk, 1.0_rk, 12.0_rk]
expected_x = [22.0_rk/17.0_rk, 91.0_rk/17.0_rk, 84.0_rk/17.0_rk, 173.0_rk/17.0_rk]
x1 = solve(A, b)
! check if solution is close to expected_x
call ut%check(x1, expected_x, 1.0e-6_rk, 'test_solver2.1' )
x2 = solve(A, b, method='gesv')
! check if solution is close to expected_x
call ut%check(x2, expected_x, 1.0e-6_rk, 'test_solver2.2' )
x3 = solve(A, b, method='gels')
! check if solution is close to expected_x
call ut%check(x3, expected_x, 1.0e-6_rk, 'test_solver2.3' )
deallocate(A,b,x1,x2,x3,expected_x)
end program test_solver2