invLU_rel Function

private pure function invLU_rel(A) result(Ainv)

Calculates the inverse of a matrix A using the LU decomposition.

Arguments

Type IntentOptional Attributes Name
real(kind=rk), intent(in), dimension(:, :), contiguous :: A

Return Value real(kind=rk), dimension(size(A,2), size(A,1))


Called by

proc~~invlu_rel~~CalledByGraph proc~invlu_rel forinv::invLU_rel proc~pinvlu_rel forinv::pinvLU_rel proc~pinvlu_rel->proc~invlu_rel proc~pinv_rel forinv::pinv_rel proc~pinv_rel->proc~pinvlu_rel interface~inv forinv::inv interface~inv->proc~pinv_rel program~test1 test1 program~test1->interface~inv program~test2 test2 program~test2->interface~inv program~test3 test3 program~test3->interface~inv

Source Code

   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