1
1
#:include "common.fypp"
2
2
#: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))
3
6
submodule (stdlib_linalg) stdlib_linalg_eigenvalues
4
7
!! Compute eigenvalues and eigenvectors
5
8
use stdlib_linalg_constants
@@ -123,23 +126,24 @@ submodule (stdlib_linalg) stdlib_linalg_eigenvalues
123
126
end subroutine handle_heev_info
124
127
125
128
#:for rk,rt,ri in RC_KINDS_TYPES
126
- #:if rk!="xdp"
129
+ #:for ep,ei in EIG_PROBLEM_LIST
127
130
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)
129
132
!! Return an array of eigenvalues of matrix A.
130
133
!> Input matrix A[m,n]
131
- ${rt}$, intent(in), target :: a(:,:)
134
+ ${rt}$, intent(in), dimension(:,:), target :: a #{if ei=='ggev'}#, b #{endif}#
132
135
!> [optional] state return flag. On error if not requested, the code will stop
133
136
type(linalg_state_type), intent(out) :: err
134
137
!> Array of eigenvalues
135
138
complex(${rk}$), allocatable :: lambda(:)
136
139
137
140
!> Create
138
- ${rt}$, pointer :: amat (:,:)
141
+ ${rt}$, pointer, dimension (:,:) :: amat#{if ei=='ggev'}#, bmat #{endif}#
139
142
integer(ilp) :: m,n,k
140
143
141
144
!> Create an internal pointer so the intent of A won't affect the next call
142
145
amat => a
146
+ #{if ei=='ggev'}#bmat => b#{endif}#
143
147
144
148
m = size(a,1,kind=ilp)
145
149
n = size(a,2,kind=ilp)
@@ -149,23 +153,24 @@ submodule (stdlib_linalg) stdlib_linalg_eigenvalues
149
153
allocate(lambda(k))
150
154
151
155
!> 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)
153
157
154
- end function stdlib_linalg_eigvals_${ri}$
158
+ end function stdlib_linalg_eigvals_${ep}$_${ ri}$
155
159
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)
157
161
!! Return an array of eigenvalues of matrix A.
158
162
!> Input matrix A[m,n]
159
- ${rt}$, intent(in), target :: a(:,:)
163
+ ${rt}$, intent(in), dimension(:,:), target :: a #{if ei=='ggev'}#, b #{endif}#
160
164
!> Array of eigenvalues
161
165
complex(${rk}$), allocatable :: lambda(:)
162
166
163
167
!> Create
164
- ${rt}$, pointer :: amat (:,:)
168
+ ${rt}$, pointer, dimension (:,:) :: amat#{if ei=='ggev'}#, bmat #{endif}#
165
169
integer(ilp) :: m,n,k
166
170
167
171
!> Create an internal pointer so the intent of A won't affect the next call
168
172
amat => a
173
+ #{if ei=='ggev'}#bmat => b#{endif}#
169
174
170
175
m = size(a,1,kind=ilp)
171
176
n = size(a,2,kind=ilp)
@@ -175,11 +180,11 @@ submodule (stdlib_linalg) stdlib_linalg_eigenvalues
175
180
allocate(lambda(k))
176
181
177
182
!> 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.)
179
184
180
- end function stdlib_linalg_eigvals_noerr_${ri}$
185
+ end function stdlib_linalg_eigvals_noerr_${ep}$_${ ri}$
181
186
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)
183
188
!! Eigendecomposition of matrix A returning an array `lambda` of eigenvalues,
184
189
!! and optionally right or left eigenvectors.
185
190
!> Input matrix A[m,n]
@@ -345,7 +350,9 @@ submodule (stdlib_linalg) stdlib_linalg_eigenvalues
345
350
#:endif
346
351
call linalg_error_handling(err0,err)
347
352
348
- end subroutine stdlib_linalg_eig_${ri}$
353
+ end subroutine stdlib_linalg_eig_${ep}$_${ri}$
354
+
355
+ #:endfor
349
356
350
357
module function stdlib_linalg_eigvalsh_${ri}$(a,upper_a,err) result(lambda)
351
358
!! Return an array of eigenvalues of real symmetric / complex hermitian A
0 commit comments