File: example_solve_bicgstab.f90

package info (click to toggle)
fortran-stdlib 0.8.1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 34,008 kB
  • sloc: f90: 24,178; ansic: 1,244; cpp: 623; python: 119; makefile: 13
file content (41 lines) | stat: -rw-r--r-- 1,110 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
program example_solve_bicgstab
    use stdlib_kinds, only: dp
    use stdlib_linalg_iterative_solvers
    implicit none
    
    integer, parameter :: n = 4
    real(dp) :: A(n,n), b(n), x(n)
    integer :: i
    
    ! Example matrix (same as SciPy documentation)
    A = reshape([4.0_dp, 2.0_dp, 0.0_dp, 1.0_dp, &
                 3.0_dp, 0.0_dp, 0.0_dp, 2.0_dp, &
                 0.0_dp, 1.0_dp, 1.0_dp, 1.0_dp, &
                 0.0_dp, 2.0_dp, 1.0_dp, 0.0_dp], [n,n])
    
    b = [-1.0_dp, -0.5_dp, -1.0_dp, 2.0_dp]
    
    x = 0.0_dp  ! Initial guess
    
    print *, 'Solving Ax = b using BiCGSTAB method:'
    print *, 'Matrix A:'
    do i = 1, n
        print '(4F8.2)', A(i,:)
    end do
    print *, 'Right-hand side b:'
    print '(4F8.2)', b
    
    ! Solve using BiCGSTAB
    call stdlib_solve_bicgstab(A, b, x, rtol=1e-10_dp, atol=1e-12_dp)
    
    print *, 'Solution x:'
    print '(4F10.6)', x
    
    ! Verify solution
    print *, 'Verification A*x:'
    print '(4F10.6)', matmul(A, x)
    
    print *, 'Residual ||b - A*x||:'
    print *, norm2(b - matmul(A, x))
    
end program