fffc_linalg.f90 Source File


Contents

Source Code


Source Code

module fffc_linalg
    use iso_fortran_env, only: int8
    use fffc_kinds
    private :: int8
    interface inv
        module subroutine inv_real_kind(a)
            real(kind=fffc_real_kind), intent(inout) :: a(:,:)
        end subroutine inv_real_kind
        module subroutine inv_complex_kind(a)
            complex(kind=fffc_complex_kind), intent(inout) :: a(:,:)
        end subroutine inv_complex_kind
    end interface inv
    interface inv_func
        module function inv_func_real_kind(a) result(b)
            real(kind=fffc_real_kind), intent(in) :: a(:,:)
            real(kind=fffc_real_kind) :: b(size(a,1),size(a,2))
        end function inv_func_real_kind
        module function inv_func_complex_kind(a) result(b)
            complex(kind=fffc_complex_kind), intent(in) :: a(:,:)
            complex(kind=fffc_complex_kind) :: b(size(a,1),size(a,2))
        end function inv_func_complex_kind
    end interface inv_func
    interface linv
        !! m > n, 列满秩,使用 linv
        module function linv_real_kind(x) result(y)
            real(kind=fffc_real_kind), intent(in) :: x(:, :)
            real(kind=fffc_real_kind) :: y(size(x, 2), size(x, 1))
        end function linv_real_kind
        module function linv_complex_kind(x) result(y)
            complex(kind=fffc_complex_kind), intent(in) :: x(:, :)
            complex(kind=fffc_complex_kind) :: y(size(x, 2), size(x, 1))
        end function linv_complex_kind
    end interface linv
    interface rinv
        !! m < n, 行满秩,使用 rinv
        module function rinv_real_kind(x) result(y)
            real(kind=fffc_real_kind), intent(in) :: x(:, :)
            real(kind=fffc_real_kind) :: y(size(x, 2), size(x, 1))
        end function rinv_real_kind
        module function rinv_complex_kind(x) result(y)
            complex(kind=fffc_complex_kind), intent(in) :: x(:, :)
            complex(kind=fffc_complex_kind) :: y(size(x, 2), size(x, 1))
        end function rinv_complex_kind
    end interface rinv
    interface solve
        module subroutine solve_real_kind(a, b)
            real(kind=fffc_real_kind), intent(inout) :: a(:,:)
            real(kind=fffc_real_kind), intent(inout) :: b(:,:)
        end subroutine solve_real_kind
        module subroutine solve_complex_kind(a, b)
            complex(kind=fffc_complex_kind), intent(inout) :: a(:,:)
            complex(kind=fffc_complex_kind), intent(inout) :: b(:,:)
        end subroutine solve_complex_kind
    end interface solve
    interface solve_func
        module function solve_func_real_kind(a, b) result(x)
            real(kind=fffc_real_kind), intent(in) :: a(:,:)
            real(kind=fffc_real_kind), intent(in) :: b(:,:)
            real(kind=fffc_real_kind) :: x(size(b,1),size(b,2))
        end function solve_func_real_kind
        module function solve_func_complex_kind(a, b) result(x)
            complex(kind=fffc_complex_kind), intent(in) :: a(:,:)
            complex(kind=fffc_complex_kind), intent(in) :: b(:,:)
            complex(kind=fffc_complex_kind) :: x(size(b,1),size(b,2))
        end function solve_func_complex_kind
    end interface solve_func
    interface diag
        pure module function diag_rank1(v) result(a)
            real(kind=fffc_real_kind), intent(in) :: v(:)
            real(kind=fffc_real_kind) :: a(size(v),size(v))
        end function diag_rank1
        pure module function diag_rank2(a) result(v)
            real(kind=fffc_real_kind), intent(in) :: a(:,:)
            real(kind=fffc_real_kind) :: v(min(size(a,1),size(a,2)))
        end function diag_rank2
    end interface diag
    interface gemm
        module function rrgemm(a, b) result(c)
            real(kind=fffc_real_kind), intent(in) :: a(:,:), b(:,:)
            real(kind=fffc_real_kind) :: c(size(a,1),size(b,2))
        end function rrgemm
        module function ccgemm(a, b) result(c)
            complex(kind=fffc_complex_kind), intent(in) :: a(:,:), b(:,:)
            complex(kind=fffc_complex_kind) :: c(size(a,1),size(b,2))
        end function ccgemm
        module function crgemm(a, b) result(c)
            complex(kind=fffc_complex_kind), intent(in) :: a(:,:)
            real(kind=fffc_real_kind), intent(in) :: b(:,:)
            complex(kind=fffc_complex_kind) :: c(size(a,1),size(b,2))
        end function crgemm
        module function rcgemm(a, b) result(c)
            real(kind=fffc_real_kind), intent(in) :: a(:,:)
            complex(kind=fffc_complex_kind), intent(in) :: b(:,:)
            complex(kind=fffc_complex_kind) :: c(size(a,1),size(b,2))
        end function rcgemm
    end interface gemm
    interface
        module function det(a) result(ans)
            real(kind=fffc_real_kind), intent(inout) :: a(:,:)
            real(kind=fffc_real_kind) :: ans
        end function det
        pure module function eye(m, n) result(a)
            integer, intent(in) :: m, n
            integer(kind=int8) :: a(m,n)
        end function eye
    end interface
end module fffc_linalg