Skip to content

Commit 9bed102

Browse files
committed
template GEEV/GGEV procedures
1 parent 03c4e2c commit 9bed102

File tree

1 file changed

+20
-13
lines changed

1 file changed

+20
-13
lines changed

src/stdlib_linalg_eigenvalues.fypp

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
#:include "common.fypp"
22
#:set RC_KINDS_TYPES = REAL_KINDS_TYPES + CMPLX_KINDS_TYPES
3+
#:set EIG_PROBLEM = ["standard", "generalized"]
4+
#:set EIG_FUNCTION = ["geev","ggev"]
5+
#:set EIG_PROBLEM_LIST = list(zip(EIG_PROBLEM, EIG_FUNCTION))
36
submodule (stdlib_linalg) stdlib_linalg_eigenvalues
47
!! Compute eigenvalues and eigenvectors
58
use stdlib_linalg_constants
@@ -123,23 +126,24 @@ submodule (stdlib_linalg) stdlib_linalg_eigenvalues
123126
end subroutine handle_heev_info
124127

125128
#:for rk,rt,ri in RC_KINDS_TYPES
126-
#:if rk!="xdp"
129+
#:for ep,ei in EIG_PROBLEM_LIST
127130

128-
module function stdlib_linalg_eigvals_${ri}$(a,err) result(lambda)
131+
module function stdlib_linalg_eigvals_${ep}$_${ri}$(a#{if ei=='ggev'}#,b#{endif}#,err) result(lambda)
129132
!! Return an array of eigenvalues of matrix A.
130133
!> Input matrix A[m,n]
131-
${rt}$, intent(in), target :: a(:,:)
134+
${rt}$, intent(in), dimension(:,:), target :: a #{if ei=='ggev'}#, b #{endif}#
132135
!> [optional] state return flag. On error if not requested, the code will stop
133136
type(linalg_state_type), intent(out) :: err
134137
!> Array of eigenvalues
135138
complex(${rk}$), allocatable :: lambda(:)
136139

137140
!> Create
138-
${rt}$, pointer :: amat(:,:)
141+
${rt}$, pointer, dimension(:,:) :: amat#{if ei=='ggev'}#, bmat #{endif}#
139142
integer(ilp) :: m,n,k
140143

141144
!> Create an internal pointer so the intent of A won't affect the next call
142145
amat => a
146+
#{if ei=='ggev'}#bmat => b#{endif}#
143147

144148
m = size(a,1,kind=ilp)
145149
n = size(a,2,kind=ilp)
@@ -149,23 +153,24 @@ submodule (stdlib_linalg) stdlib_linalg_eigenvalues
149153
allocate(lambda(k))
150154

151155
!> Compute eigenvalues only
152-
call stdlib_linalg_eig_${ri}$(amat,lambda,overwrite_a=.false.,err=err)
156+
call stdlib_linalg_eig_${ep}$_${ri}$(amat,#{if ei=='ggev'}#,bmat#{endif}#lambda,overwrite_a=.false.,err=err)
153157

154-
end function stdlib_linalg_eigvals_${ri}$
158+
end function stdlib_linalg_eigvals_${ep}$_${ri}$
155159

156-
module function stdlib_linalg_eigvals_noerr_${ri}$(a) result(lambda)
160+
module function stdlib_linalg_eigvals_noerr_${ep}$_${ri}$(a#{if ei=='ggev'}#,b#{endif}#) result(lambda)
157161
!! Return an array of eigenvalues of matrix A.
158162
!> Input matrix A[m,n]
159-
${rt}$, intent(in), target :: a(:,:)
163+
${rt}$, intent(in), dimension(:,:), target :: a #{if ei=='ggev'}#, b #{endif}#
160164
!> Array of eigenvalues
161165
complex(${rk}$), allocatable :: lambda(:)
162166

163167
!> Create
164-
${rt}$, pointer :: amat(:,:)
168+
${rt}$, pointer, dimension(:,:) :: amat#{if ei=='ggev'}#, bmat #{endif}#
165169
integer(ilp) :: m,n,k
166170

167171
!> Create an internal pointer so the intent of A won't affect the next call
168172
amat => a
173+
#{if ei=='ggev'}#bmat => b#{endif}#
169174

170175
m = size(a,1,kind=ilp)
171176
n = size(a,2,kind=ilp)
@@ -175,11 +180,11 @@ submodule (stdlib_linalg) stdlib_linalg_eigenvalues
175180
allocate(lambda(k))
176181

177182
!> Compute eigenvalues only
178-
call stdlib_linalg_eig_${ri}$(amat,lambda,overwrite_a=.false.)
183+
call stdlib_linalg_eig_${ep}$_${ri}$(amat,#{if ei=='ggev'}#,bmat#{endif}#lambda,overwrite_a=.false.)
179184

180-
end function stdlib_linalg_eigvals_noerr_${ri}$
185+
end function stdlib_linalg_eigvals_noerr_${ep}$_${ri}$
181186

182-
module subroutine stdlib_linalg_eig_${ri}$(a,lambda,right,left,overwrite_a,err)
187+
module subroutine stdlib_linalg_eig_${ep}$_${ri}$(a,#{if ei=='ggev'}#,b#{endif}#lambda,right,left,overwrite_a,err)
183188
!! Eigendecomposition of matrix A returning an array `lambda` of eigenvalues,
184189
!! and optionally right or left eigenvectors.
185190
!> Input matrix A[m,n]
@@ -345,7 +350,9 @@ submodule (stdlib_linalg) stdlib_linalg_eigenvalues
345350
#:endif
346351
call linalg_error_handling(err0,err)
347352

348-
end subroutine stdlib_linalg_eig_${ri}$
353+
end subroutine stdlib_linalg_eig_${ep}$_${ri}$
354+
355+
#:endfor
349356

350357
module function stdlib_linalg_eigvalsh_${ri}$(a,upper_a,err) result(lambda)
351358
!! Return an array of eigenvalues of real symmetric / complex hermitian A

0 commit comments

Comments
 (0)