@@ -34,31 +34,40 @@ submodule (stdlib_linalg) stdlib_linalg_inverse
34
34
#:for rk,rt,ri in RC_KINDS_TYPES
35
35
#:if rk!="xdp"
36
36
! Compute the in-place square matrix inverse of a
37
- module subroutine stdlib_linalg_invert_${ri}$(a,err)
38
- !> Input matrix a[n,n]
37
+ module subroutine stdlib_linalg_invert_${ri}$(a,pivot, err)
38
+ !> Input matrix a[n,n]. On return, A is destroyed and replaced by the inverse
39
39
${rt}$, intent(inout) :: a(:,:)
40
+ !> [optional] Storage array for the diagonal pivot indices
41
+ integer(ilp), optional, intent(inout), target :: pivot(:)
40
42
!> [optional] state return flag. On error if not requested, the code will stop
41
43
type(linalg_state_type), optional, intent(out) :: err
42
44
43
45
!> Local variables
44
46
type(linalg_state_type) :: err0
45
- integer(ilp) :: lda,n,info,nb,lwork
46
- integer(ilp), allocatable :: ipiv(:)
47
+ integer(ilp) :: lda,n,info,nb,lwork,npiv
48
+ integer(ilp), pointer :: ipiv(:)
47
49
${rt}$, allocatable :: work(:)
48
50
49
51
!> Problem sizes
50
52
lda = size(a,1,kind=ilp)
51
53
n = size(a,2,kind=ilp)
52
54
53
- if (lda<1 .or. n<1 .or. lda/=n) then
54
- err0 = linalg_state_type(this,LINALG_VALUE_ERROR,'invalid matrix size: a=[',lda,',',n,']')
55
+ ! Has a pre-allocated pivots storage array been provided?
56
+ if (present(pivot)) then
57
+ ipiv => pivot
58
+ else
59
+ allocate(ipiv(n))
60
+ endif
61
+ npiv = size(ipiv,kind=ilp)
62
+
63
+ if (lda<1 .or. n<1 .or. lda/=n .or. npiv<n) then
64
+ err0 = linalg_state_type(this,LINALG_VALUE_ERROR,'invalid matrix size: a=',[lda,n], &
65
+ ', pivot=',npiv)
66
+ if (.not.present(pivot)) deallocate(ipiv)
55
67
call linalg_error_handling(err0,err)
56
68
return
57
69
end if
58
70
59
- ! Pivot indices
60
- allocate(ipiv(n))
61
-
62
71
! Factorize matrix (overwrite result)
63
72
call getrf(lda,n,a,lda,ipiv,info)
64
73
@@ -80,6 +89,7 @@ submodule (stdlib_linalg) stdlib_linalg_inverse
80
89
call handle_getri_info(info,lda,n,err0)
81
90
82
91
! Process output and return
92
+ if (.not.present(pivot)) deallocate(ipiv)
83
93
call linalg_error_handling(err0,err)
84
94
85
95
end subroutine stdlib_linalg_invert_${ri}$
@@ -97,7 +107,7 @@ submodule (stdlib_linalg) stdlib_linalg_inverse
97
107
allocate(inva,source=a)
98
108
99
109
!> Compute matrix inverse
100
- call stdlib_linalg_invert_${ri}$(inva,err)
110
+ call stdlib_linalg_invert_${ri}$(inva,err=err )
101
111
102
112
end function stdlib_linalg_inverse_${ri}$
103
113
0 commit comments