@@ -7,6 +7,7 @@ submodule (stdlib_linalg) stdlib_linalg_eigenvalues
77!! Compute eigenvalues and eigenvectors 
88 use stdlib_linalg_constants
99 use stdlib_linalg_lapack, only: geev, ggev, heev, syev
10+  use stdlib_linalg_lapack_aux, only: handle_geev_info, handle_ggev_info, handle_heev_info
1011 use stdlib_linalg_state, only: linalg_state_type, linalg_error_handling, LINALG_ERROR, &
1112 LINALG_INTERNAL_ERROR, LINALG_VALUE_ERROR, LINALG_SUCCESS 
1213 use, intrinsic:: ieee_arithmetic, only: ieee_value, ieee_positive_inf, ieee_quiet_nan
@@ -36,103 +37,6 @@ submodule (stdlib_linalg) stdlib_linalg_eigenvalues
3637 if (present(upper)) symmetric_triangle_task = merge('U','L',upper)
3738 end function symmetric_triangle_task
3839
39-  !> Process GEEV output flags
40-  pure subroutine handle_geev_info(err,info,shapea)
41-  !> Error handler
42-  type(linalg_state_type), intent(inout) :: err
43-  !> GEEV return flag
44-  integer(ilp), intent(in) :: info
45-  !> Input matrix size
46-  integer(ilp), intent(in) :: shapea(2)
47- 
48-  select case (info)
49-  case (0)
50-  ! Success!
51-  err%state = LINALG_SUCCESS
52-  case (-1)
53-  err = linalg_state_type(this,LINALG_INTERNAL_ERROR,'Invalid task ID: left eigenvectors.')
54-  case (-2)
55-  err = linalg_state_type(this,LINALG_INTERNAL_ERROR,'Invalid task ID: right eigenvectors.')
56-  case (-5,-3)
57-  err = linalg_state_type(this,LINALG_VALUE_ERROR,'invalid matrix size: a=',shapea)
58-  case (-9)
59-  err = linalg_state_type(this,LINALG_VALUE_ERROR,'insufficient left vector matrix size.')
60-  case (-11)
61-  err = linalg_state_type(this,LINALG_VALUE_ERROR,'insufficient right vector matrix size.')
62-  case (-13)
63-  err = linalg_state_type(this,LINALG_INTERNAL_ERROR,'Insufficient work array size.')
64-  case (1:)
65-  err = linalg_state_type(this,LINALG_ERROR,'Eigenvalue computation did not converge.')
66-  case default
67-  err = linalg_state_type(this,LINALG_INTERNAL_ERROR,'Unknown error returned by geev.')
68-  end select
69- 
70-  end subroutine handle_geev_info
71- 
72-  !> Process GGEV output flags
73-  pure subroutine handle_ggev_info(err,info,shapea,shapeb)
74-  !> Error handler
75-  type(linalg_state_type), intent(inout) :: err
76-  !> GEEV return flag
77-  integer(ilp), intent(in) :: info
78-  !> Input matrix size
79-  integer(ilp), intent(in) :: shapea(2),shapeb(2)
80- 
81-  select case (info)
82-  case (0)
83-  ! Success!
84-  err%state = LINALG_SUCCESS
85-  case (-1)
86-  err = linalg_state_type(this,LINALG_INTERNAL_ERROR,'Invalid task ID: left eigenvectors.')
87-  case (-2)
88-  err = linalg_state_type(this,LINALG_INTERNAL_ERROR,'Invalid task ID: right eigenvectors.')
89-  case (-5,-3)
90-  err = linalg_state_type(this,LINALG_VALUE_ERROR,'invalid matrix size: a=',shapea)
91-  case (-7)
92-  err = linalg_state_type(this,LINALG_VALUE_ERROR,'invalid matrix size: b=',shapeb) 
93-  case (-12)
94-  err = linalg_state_type(this,LINALG_VALUE_ERROR,'insufficient left vector matrix size.')
95-  case (-14)
96-  err = linalg_state_type(this,LINALG_VALUE_ERROR,'insufficient right vector matrix size.')
97-  case (-16)
98-  err = linalg_state_type(this,LINALG_INTERNAL_ERROR,'Insufficient work array size.')
99-  case (1:)
100-  err = linalg_state_type(this,LINALG_ERROR,'Eigenvalue computation did not converge.')
101-  case default
102-  err = linalg_state_type(this,LINALG_INTERNAL_ERROR,'Unknown error returned by ggev.')
103-  end select
104- 
105-  end subroutine handle_ggev_info
106- 
107-  !> Process SYEV/HEEV output flags
108-  elemental subroutine handle_heev_info(err,info,m,n)
109-  !> Error handler
110-  type(linalg_state_type), intent(inout) :: err
111-  !> SYEV/HEEV return flag
112-  integer(ilp), intent(in) :: info
113-  !> Input matrix size
114-  integer(ilp), intent(in) :: m,n
115- 
116-  select case (info)
117-  case (0)
118-  ! Success!
119-  err%state = LINALG_SUCCESS
120-  case (-1)
121-  err = linalg_state_type(this,LINALG_INTERNAL_ERROR,'Invalid eigenvector request.')
122-  case (-2)
123-  err = linalg_state_type(this,LINALG_INTERNAL_ERROR,'Invalid triangular section request.')
124-  case (-5,-3)
125-  err = linalg_state_type(this,LINALG_VALUE_ERROR,'invalid matrix size: a=',[m,n])
126-  case (-8)
127-  err = linalg_state_type(this,LINALG_INTERNAL_ERROR,'insufficient workspace size.')
128-  case (1:)
129-  err = linalg_state_type(this,LINALG_ERROR,'Eigenvalue computation did not converge.')
130-  case default
131-  err = linalg_state_type(this,LINALG_INTERNAL_ERROR,'Unknown error returned by syev/heev.')
132-  end select
133- 
134-  end subroutine handle_heev_info
135- 
13640 #:for rk,rt,ri in RC_KINDS_TYPES
13741 #:for ep,ei in EIG_PROBLEM_LIST
13842
@@ -370,7 +274,7 @@ submodule (stdlib_linalg) stdlib_linalg_eigenvalues
370274 #:endif 
371275 umat,ldu,vmat,ldv,&
372276 work_dummy,lwork,#{if rt.startswith('complex')}#rwork,#{endif}#info)
373-  call handle_${ei}$_info(err0,info,shape(amat)#{if ei=='ggev'}#,shape(bmat)#{endif}#)
277+  call handle_${ei}$_info(this, err0,info,shape(amat)#{if ei=='ggev'}#,shape(bmat)#{endif}#)
374278
375279 ! Compute eigenvalues
376280 if (info==0) then
@@ -390,7 +294,7 @@ submodule (stdlib_linalg) stdlib_linalg_eigenvalues
390294 #:endif 
391295 umat,ldu,vmat,ldv,& 
392296 work,lwork,#{if rt.startswith('complex')}#rwork,#{endif}#info)
393-  call handle_${ei}$_info(err0,info,shape(amat)#{if ei=='ggev'}#,shape(bmat)#{endif}#)
297+  call handle_${ei}$_info(this, err0,info,shape(amat)#{if ei=='ggev'}#,shape(bmat)#{endif}#)
394298
395299 endif
396300
@@ -584,7 +488,7 @@ submodule (stdlib_linalg) stdlib_linalg_eigenvalues
584488 #:else
585489 call syev(task,triangle,n,amat,lda,lambda,work_dummy,lwork,info)
586490 #:endif
587-  call handle_heev_info(err0,info,m,n)
491+  call handle_heev_info(this, err0,info,m,n)
588492
589493 ! Compute eigenvalues
590494 if (info==0) then
@@ -599,7 +503,7 @@ submodule (stdlib_linalg) stdlib_linalg_eigenvalues
599503 #:else
600504 call syev(task,triangle,n,amat,lda,lambda,work,lwork,info)
601505 #:endif
602-  call handle_heev_info(err0,info,m,n)
506+  call handle_heev_info(this, err0,info,m,n)
603507
604508 endif
605509
0 commit comments