Calculates the inverse of a matrix A using the LU decomposition.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
real(kind=rk), | intent(in), | dimension(:, :), contiguous | :: | A |
pure function invLU_rel(A) result(Ainv) #elif defined (IMPURE) impure function invLU_rel(A) result(Ainv) #endif ! Inputs: real(rk), dimension(:, :), contiguous, intent(in) :: A ! Input matrix A ! Outputs: real(rk), dimension(size(A,2), size(A,1)) :: Ainv ! Inverse of A ! Local variables integer :: ipiv(size(A, 1)), info real(rk) :: work(size(A, 2)) ! External subroutine for calculating the inverse of a matrix A using the LU decomposition. interface #if defined (PURE) pure subroutine dgetrf(f_m, f_n, f_a, f_lda, f_ipiv, f_info) #elif defined (IMPURE) impure subroutine dgetrf(f_m, f_n, f_a, f_lda, f_ipiv, f_info) #endif import rk integer, intent(in) :: f_m integer, intent(in) :: f_n integer, intent(in) :: f_lda integer, intent(out) :: f_ipiv(*) integer, intent(out) :: f_info real(rk), intent(inout) :: f_a(f_lda, *) end subroutine dgetrf #if defined (PURE) pure subroutine dgetri(f_n, f_a, f_lda, f_ipiv, f_work, f_lwork, f_info) #elif defined (IMPURE) impure subroutine dgetri(f_n, f_a, f_lda, f_ipiv, f_work, f_lwork, f_info) #endif import rk integer, intent(in) :: f_n integer, intent(in) :: f_lda integer, intent(in) :: f_lwork integer, intent(out) :: f_ipiv(*) integer, intent(out) :: f_info real(rk), intent(inout) :: f_a(f_lda, *) real(rk), intent(out) :: f_work(*) end subroutine dgetri end interface Ainv = A call dgetrf(size(A, 1), size(A, 2), Ainv, size(A, 1), ipiv, info) call dgetri(size(A, 2), Ainv, size(A, 1), ipiv, work, size(A, 2), info) end function invLU_rel