@@ -4,6 +4,7 @@ submodule(stdlib_linalg) stdlib_linalg_svd
44!! Singular-Value Decomposition
55 use stdlib_linalg_constants
66 use stdlib_linalg_lapack, only: gesdd
7+ use stdlib_linalg_lapack_aux, only: handle_gesdd_info
78 use stdlib_linalg_state, only: linalg_state_type, linalg_error_handling, LINALG_ERROR, &
89 LINALG_INTERNAL_ERROR, LINALG_VALUE_ERROR, LINALG_SUCCESS
910 implicit none
@@ -26,38 +27,6 @@ submodule(stdlib_linalg) stdlib_linalg_svd
2627
2728 contains
2829
29- !> Process GESDD output flag
30- elemental subroutine handle_gesdd_info(err,info,m,n)
31- !> Error handler
32- type(linalg_state_type), intent(inout) :: err
33- !> GESDD return flag
34- integer(ilp), intent(in) :: info
35- !> Input matrix size
36- integer(ilp), intent(in) :: m,n
37-
38- select case (info)
39- case (0)
40- ! Success!
41- err%state = LINALG_SUCCESS
42- case (-1)
43- err = linalg_state_type(this,LINALG_INTERNAL_ERROR,'Invalid task ID on input to GESDD.')
44- case (-5,-3:-2)
45- err = linalg_state_type(this,LINALG_VALUE_ERROR,'invalid matrix size: a=',[m,n])
46- case (-8)
47- err = linalg_state_type(this,LINALG_VALUE_ERROR,'invalid matrix U size, with a=',[m,n])
48- case (-10)
49- err = linalg_state_type(this,LINALG_VALUE_ERROR,'invalid matrix V size, with a=',[m,n])
50- case (-4)
51- err = linalg_state_type(this,LINALG_VALUE_ERROR,'A contains invalid/NaN values.')
52- case (1:)
53- err = linalg_state_type(this,LINALG_ERROR,'SVD computation did not converge.')
54- case default
55- err = linalg_state_type(this,LINALG_INTERNAL_ERROR,'Unknown error returned by GESDD.')
56- end select
57-
58- end subroutine handle_gesdd_info
59-
60-
6130 #:for rk,rt,ri in RC_KINDS_TYPES
6231
6332 !> Singular values of matrix A
@@ -265,7 +234,7 @@ submodule(stdlib_linalg) stdlib_linalg_svd
265234 lwork = -1_ilp
266235 call gesdd(task,m,n,amat,lda,s,umat,ldu,vtmat,ldvt,&
267236 work_dummy,lwork,#{if rt.startswith('complex')}#rwork,#{endif}#iwork,info)
268- call handle_gesdd_info(err0,info,m,n)
237+ call handle_gesdd_info(this, err0,info,m,n)
269238
270239 ! Compute SVD
271240 if (info==0) then
@@ -281,7 +250,7 @@ submodule(stdlib_linalg) stdlib_linalg_svd
281250 !> Compute SVD
282251 call gesdd(task,m,n,amat,lda,s,umat,ldu,vtmat,ldvt,&
283252 work,lwork,#{if rt.startswith('complex')}#rwork,#{endif}#iwork,info)
284- call handle_gesdd_info(err0,info,m,n)
253+ call handle_gesdd_info(this, err0,info,m,n)
285254
286255 endif
287256
0 commit comments