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))
36submodule (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