Skip to content

Commit 1d20061

Browse files
committed
Enforce same eltype
1 parent e2781a2 commit 1d20061

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

src/cgls.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ args_cgls = (:A, :b)
126126
kwargs_cgls = (:M, :ldiv, :radius, , :atol, :rtol, :itmax, :timemax, :verbose, :history, :callback, :iostream)
127127

128128
@eval begin
129-
function cgls!(workspace :: CglsWorkspace{T,FC,S}, $(def_args_cgls...); $(def_kwargs_cgls...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}, S <: AbstractVector{FC}}
129+
function cgls!(workspace :: CglsWorkspace{T,FC,Sm,Sn}, $(def_args_cgls...); $(def_kwargs_cgls...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}, Sm <: AbstractVector{FC}, Sn <: AbstractVector{FC}}
130130

131131
# Timer
132132
start_time = time_ns()
@@ -142,13 +142,13 @@ kwargs_cgls = (:M, :ldiv, :radius, :λ, :atol, :rtol, :itmax, :timemax, :verbose
142142

143143
# Check type consistency
144144
eltype(A) == FC || @warn "eltype(A) ≠ $FC. This could lead to errors or additional allocations in operator-vector products."
145-
ktypeof(b) == S || error("ktypeof(b) must be equal to $S")
145+
ktypeof(b) == Sm || error("ktypeof(b) must be equal to $Sm")
146146

147147
# Compute the adjoint of A
148148
Aᴴ = A'
149149

150150
# Set up workspace.
151-
allocate_if(!MisI, workspace, :Mr, S, workspace.r) # The length of Mr is m
151+
allocate_if(!MisI, workspace, :Mr, Sm, workspace.r) # The length of Mr is m
152152
x, p, s, r, q, stats = workspace.x, workspace.p, workspace.s, workspace.r, workspace.q, workspace.stats
153153
rNorms, ArNorms = stats.residuals, stats.Aresiduals
154154
reset!(stats)

src/krylov_workspaces.jl

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,15 @@ struct KrylovConstructor{Sm, Sn}
3737
vn::Sn
3838
vm_empty::Sm
3939
vn_empty::Sn
40+
41+
function KrylovConstructor{Sm, Sn}(vm, vn, vm_empty, vn_empty) where {Sm, Sn}
42+
eltype(Sm) === eltype(Sn) || throw(ArgumentError("KrylovConstructor requires that eltype(Sm) == eltype(Sn), got $(eltype(Sm)) and $(eltype(Sn))"))
43+
return new{Sm, Sn}(vm, vn, vm_empty, vn_empty)
44+
end
45+
end
46+
47+
function KrylovConstructor(vm::Sm, vn::Sn, vm_empty, vn_empty) where {Sm, Sn}
48+
return KrylovConstructor{Sm, Sn}(vm, vn, vm_empty, vn_empty)
4049
end
4150

4251
function KrylovConstructor(vm; vm_empty=vm)
@@ -1633,7 +1642,7 @@ mutable struct CglsWorkspace{T,FC,Sm,Sn} <: KrylovWorkspace{T,FC,Sm,Sn}
16331642
end
16341643

16351644
function CglsWorkspace(kc::KrylovConstructor{Sm,Sn}) where {Sm,Sn}
1636-
FC = promote_type(eltype(Sm), eltype(Sn))
1645+
FC = eltype(Sm) # Sn has the same eltype
16371646
T = real(FC)
16381647
m = length(kc.vm)
16391648
n = length(kc.vn)

0 commit comments

Comments
 (0)