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