@@ -7,6 +7,7 @@ submodule (stdlib_linalg) stdlib_linalg_eigenvalues
7
7
!! Compute eigenvalues and eigenvectors
8
8
use stdlib_linalg_constants
9
9
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
10
11
use stdlib_linalg_state, only: linalg_state_type, linalg_error_handling, LINALG_ERROR, &
11
12
LINALG_INTERNAL_ERROR, LINALG_VALUE_ERROR, LINALG_SUCCESS
12
13
use, intrinsic:: ieee_arithmetic, only: ieee_value, ieee_positive_inf, ieee_quiet_nan
@@ -36,103 +37,6 @@ submodule (stdlib_linalg) stdlib_linalg_eigenvalues
36
37
if (present(upper)) symmetric_triangle_task = merge('U','L',upper)
37
38
end function symmetric_triangle_task
38
39
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
-
136
40
#:for rk,rt,ri in RC_KINDS_TYPES
137
41
#:for ep,ei in EIG_PROBLEM_LIST
138
42
@@ -370,7 +274,7 @@ submodule (stdlib_linalg) stdlib_linalg_eigenvalues
370
274
#:endif
371
275
umat,ldu,vmat,ldv,&
372
276
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}#)
374
278
375
279
! Compute eigenvalues
376
280
if (info==0) then
@@ -390,7 +294,7 @@ submodule (stdlib_linalg) stdlib_linalg_eigenvalues
390
294
#:endif
391
295
umat,ldu,vmat,ldv,&
392
296
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}#)
394
298
395
299
endif
396
300
@@ -584,7 +488,7 @@ submodule (stdlib_linalg) stdlib_linalg_eigenvalues
584
488
#:else
585
489
call syev(task,triangle,n,amat,lda,lambda,work_dummy,lwork,info)
586
490
#:endif
587
- call handle_heev_info(err0,info,m,n)
491
+ call handle_heev_info(this, err0,info,m,n)
588
492
589
493
! Compute eigenvalues
590
494
if (info==0) then
@@ -599,7 +503,7 @@ submodule (stdlib_linalg) stdlib_linalg_eigenvalues
599
503
#:else
600
504
call syev(task,triangle,n,amat,lda,lambda,work,lwork,info)
601
505
#:endif
602
- call handle_heev_info(err0,info,m,n)
506
+ call handle_heev_info(this, err0,info,m,n)
603
507
604
508
endif
605
509
0 commit comments