@@ -38,7 +38,7 @@ submodule (stdlib_linalg) stdlib_linalg_schur
38
38
!> Wrapper function to handle GEES error codes
39
39
elemental subroutine handle_gees_info(info, m, n, ldvs, err)
40
40
integer(ilp), intent(in) :: info, m, n, ldvs
41
- type(linalg_state ), intent(out) :: err
41
+ type(linalg_state_type ), intent(out) :: err
42
42
43
43
! Process GEES output
44
44
select case (info)
@@ -77,7 +77,53 @@ submodule (stdlib_linalg) stdlib_linalg_schur
77
77
78
78
end subroutine handle_gees_info
79
79
80
- #:for rk, rt, ri in RC_KINDS_TYPES
80
+ #:for rk, rt, ri in RC_KINDS_TYPES
81
+ !> Workspace query
82
+ subroutine get_schur_${ri}$_workspace(a,lwork,err)
83
+ !> Input matrix a[m,m]
84
+ ${rt}$, intent(in), target :: a(:,:)
85
+ !> Minimum workspace size for the decomposition operation
86
+ integer(ilp), intent(out) :: lwork
87
+ !> State return flag. Returns an error if the query failed
88
+ type(linalg_state_type), optional, intent(out) :: err
89
+
90
+ integer(ilp) :: m,n,sdim,info
91
+ character :: jobvs,sort
92
+ logical(lk) :: bwork_dummy(1)
93
+ ${rt}$, pointer :: amat(:,:)
94
+ real(${rk}$) :: rwork_dummy(1)
95
+ ${rt}$ :: wr_dummy(1),wi_dummy(1),vs_dummy(1,1),work_dummy(1)
96
+ type(linalg_state_type) :: err0
97
+
98
+ !> Initialize problem
99
+ lwork = -1_ilp
100
+ m = size(a,1,kind=ilp)
101
+ n = size(a,2,kind=ilp)
102
+
103
+ !> Create a dummy intent(inout) argument
104
+ amat => a
105
+
106
+ !> Select dummy task
107
+ jobvs = gees_vectors(.true.)
108
+ sort = gees_sort_eigs(.false.)
109
+ sdim = 0_ilp
110
+
111
+ !> Get Schur workspace
112
+ call gees(jobvs,sort,do_not_select,n,amat,m,sdim,wr_dummy,#{if rt.startswith('r')}#wi_dummy, #{endif}#&
113
+ vs_dummy,m,work_dummy,lwork,#{if rt.startswith('c')}#rwork_dummy,#{endif}#bwork_dummy,info)
114
+ if (info==0) lwork = nint(real(work_dummy(1),kind=${rk}$),kind=ilp)
115
+ call handle_gees_info(info,m,n,m,err0)
116
+ call linalg_error_handling(err0,err)
117
+
118
+ contains
119
+
120
+ ! Interface to dummy select routine
121
+ pure logical(lk) function do_not_select(alpha#{if rt.startswith('r')}#r,alphai#{endif}#)
122
+ ${rt}$, intent(in) :: alpha#{if rt.startswith('r')}#r,alphai#{endif}#
123
+ do_not_select = .false.
124
+ end function do_not_select
125
+
126
+ end subroutine get_schur_${ri}$_workspace
81
127
82
128
! Schur decomposition subroutine
83
129
pure module subroutine stdlib_linalg_${ri}$_schur(a, t, z, lwork, overwrite_a, sort, err)
0 commit comments