forlab_linalg_solve.f90 Source File


Contents


Source Code

submodule(forlab_linalg) forlab_linalg_solve

    implicit none

contains

    module procedure solve_sp
    integer :: i, j, m, n
    real(sp), dimension(:), allocatable :: w, y
    real(sp), dimension(:, :), allocatable :: L, U, V
    m = size(A, 1)
    n = size(A, 2)
    if (is_square(A)) then
        x = zeros(m)
        y = zeros(m)
        y(1) = b(1)
        ! LU decomposition to solve LUx = b
        !===================================
        call lu(A, L, U)
        ! Forward substitution: Ly = b
        !==============================
        do i = 2, m
            y(i) = b(i)
            do j = 1, i - 1
                y(i) = y(i) - y(j)*L(i, j)
            end do
        end do
        ! Back substitution: Ux = y
        !===========================
        x(m) = y(m)/U(m, m)
        do i = m - 1, 1, -1
            x(i) = y(i)
            do j = m, i + 1, -1
                x(i) = x(i) - x(j)*U(i, j)
            end do
            x(i) = x(i)/U(i, i)
        end do
    else
        x = svdsolve(A, b)
    end if
    end procedure solve_sp
    module procedure solve_dp
    integer :: i, j, m, n
    real(dp), dimension(:), allocatable :: w, y
    real(dp), dimension(:, :), allocatable :: L, U, V
    m = size(A, 1)
    n = size(A, 2)
    if (is_square(A)) then
        x = zeros(m)
        y = zeros(m)
        y(1) = b(1)
        ! LU decomposition to solve LUx = b
        !===================================
        call lu(A, L, U)
        ! Forward substitution: Ly = b
        !==============================
        do i = 2, m
            y(i) = b(i)
            do j = 1, i - 1
                y(i) = y(i) - y(j)*L(i, j)
            end do
        end do
        ! Back substitution: Ux = y
        !===========================
        x(m) = y(m)/U(m, m)
        do i = m - 1, 1, -1
            x(i) = y(i)
            do j = m, i + 1, -1
                x(i) = x(i) - x(j)*U(i, j)
            end do
            x(i) = x(i)/U(i, i)
        end do
    else
        x = svdsolve(A, b)
    end if
    end procedure solve_dp

end submodule forlab_linalg_solve