@@ -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