@@ -4,6 +4,7 @@ submodule(stdlib_linalg) stdlib_linalg_svd
4
4
!! Singular-Value Decomposition
5
5
use stdlib_linalg_constants
6
6
use stdlib_linalg_lapack, only: gesdd
7
+ use stdlib_linalg_lapack_aux, only: handle_gesdd_info
7
8
use stdlib_linalg_state, only: linalg_state_type, linalg_error_handling, LINALG_ERROR, &
8
9
LINALG_INTERNAL_ERROR, LINALG_VALUE_ERROR, LINALG_SUCCESS
9
10
implicit none
@@ -26,38 +27,6 @@ submodule(stdlib_linalg) stdlib_linalg_svd
26
27
27
28
contains
28
29
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
-
61
30
#:for rk,rt,ri in RC_KINDS_TYPES
62
31
63
32
!> Singular values of matrix A
@@ -265,7 +234,7 @@ submodule(stdlib_linalg) stdlib_linalg_svd
265
234
lwork = -1_ilp
266
235
call gesdd(task,m,n,amat,lda,s,umat,ldu,vtmat,ldvt,&
267
236
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)
269
238
270
239
! Compute SVD
271
240
if (info==0) then
@@ -281,7 +250,7 @@ submodule(stdlib_linalg) stdlib_linalg_svd
281
250
!> Compute SVD
282
251
call gesdd(task,m,n,amat,lda,s,umat,ldu,vtmat,ldvt,&
283
252
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)
285
254
286
255
endif
287
256
0 commit comments