JuliaLinearAlgebra / AlgebraicMultigrid.jl

Algebraic Multigrid in Julia
Other
117 stars 23 forks source link

Does not work with single precision #20

Closed ranjanan closed 6 years ago

ranjanan commented 6 years ago
using Circuitscape, AMG
a = model_problem(Float32, 10)
ml = ruge_stuben(a)
b = rand(Float32, 100)
solve(ml, b)

errors out:

ERROR: MethodError: no method matching gs!(::SparseMatrixCSC{Float64,Int64}, ::Array{Float32,1}, ::Array{Float32,1}, ::Int64, ::Int64, ::Int64)
Closest candidates are:
  gs!(::SparseMatrixCSC{T,Ti}, ::Array{T,1}, ::Array{T,1}, ::Any, ::Any, ::Any) where {T, Ti} at /Users/ranjan/.julia/v0.6/AMG/src/smoother.jl:36
Stacktrace:
 [1] smoother!(::AMG.GaussSeidel{AMG.SymmetricSweep}, ::AMG.ForwardSweep, ::SparseMatrixCSC{Float64,Int64}, ::Array{Float32,1}, ::Array{Float32,1}) at /Users/ranjan/.julia/v0.6/AMG/src/smoother.jl:21
 [2] smoother!(::AMG.GaussSeidel{AMG.SymmetricSweep}, ::AMG.SymmetricSweep, ::SparseMatrixCSC{Float64,Int64}, ::Array{Float32,1}, ::Array{Float32,1}) at /Users/ranjan/.julia/v0.6/AMG/src/smoother.jl:26
 [3] __solve(::AMG.V, ::AMG.MultiLevel{AMG.Pinv,AMG.GaussSeidel{AMG.SymmetricSweep},AMG.GaussSeidel{AMG.SymmetricSweep},Float64,Int64}, ::Array{Float32,1}, ::Array{Float32,1}, ::Int64) at /Users/ranjan/.julia/v0.6/AMG/src/multilevel.jl:97
 [4] #solve#10(::Bool, ::Bool, ::Function, ::AMG.MultiLevel{AMG.Pinv,AMG.GaussSeidel{AMG.SymmetricSweep},AMG.GaussSeidel{AMG.SymmetricSweep},Float64,Int64}, ::Array{Float32,1}, ::Int64, ::AMG.V, ::Float64) at /Users/ranjan/.julia/v0.6/AMG/src/multilevel.jl:83
 [5] solve(::AMG.MultiLevel{AMG.Pinv,AMG.GaussSeidel{AMG.SymmetricSweep},AMG.GaussSeidel{AMG.SymmetricSweep},Float64,Int64}, ::Array{Float32,1}) at /Users/ranjan/.julia/v0.6/AMG/src/multilevel.jl:69

Same with smoothed_aggregation

ranjanan commented 6 years ago

The above error is when you encounter a single precisionb but a double precision A. With single precision A, you get the following error at ml = smoothed_aggregation(A):

ERROR: MethodError: no method matching AMG.Level(::SparseMatrixCSC{Float32,Int64}, ::SparseMatrixCSC{Float64,Int64}, ::SparseMatrixCSC{Float64,Int64})
Closest candidates are:
  AMG.Level(::SparseMatrixCSC{Ti,Tv}, ::SparseMatrixCSC{Ti,Tv}, ::SparseMatrixCSC{Ti,Tv}) where {Ti, Tv} at /Users/ranjan/.julia/v0.6/AMG/src/multilevel.jl:2
Stacktrace:
 [1] extend_heirarchy!(::Array{AMG.Level{Float32,Int64},1}, ::AMG.Classical{Float64}, ::AMG.RS, ::SparseMatrixCSC{Float32,Int64}) at /Users/ranjan/.julia/v0.6/AMG/src/classical.jl:36
 [2] #ruge_stuben#11(::AMG.Classical{Float64}, ::AMG.RS, ::AMG.GaussSeidel{AMG.SymmetricSweep}, ::AMG.GaussSeidel{AMG.SymmetricSweep}, ::Int64, ::Int64, ::Function, ::SparseMatrixCSC{Float32,Int64}) at /Users/ranjan/.julia/v0.6/AMG/src/classical.jl:24
 [3] ruge_stuben(::SparseMatrixCSC{Float32,Int64}) at /Users/ranjan/.julia/v0.6/AMG/src/classical.jl:18