Skip to content

Commit 4d3929f

Browse files
committed
add preallocation and block support machinery
1 parent cd43348 commit 4d3929f

File tree

4 files changed

+58
-10
lines changed

4 files changed

+58
-10
lines changed

src/aggregation.jl

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
function smoothed_aggregation(A::SparseMatrixCSC{T,V},
1+
function smoothed_aggregation(A::SparseMatrixCSC{T,V}, ::Type{Val{bs}}=Val{1},
22
symmetry = HermitianSymmetry(),
33
strength = SymmetricStrength(),
44
aggregate = StandardAggregation(),
@@ -10,7 +10,7 @@ function smoothed_aggregation(A::SparseMatrixCSC{T,V},
1010
max_coarse = 10,
1111
diagonal_dominance = false,
1212
keep = false,
13-
coarse_solver = Pinv) where {T,V}
13+
coarse_solver = Pinv) where {T,V,bs}
1414

1515
n = size(A, 1)
1616
# B = kron(ones(n, 1), eye(1))
@@ -29,19 +29,23 @@ function smoothed_aggregation(A::SparseMatrixCSC{T,V},
2929

3030
levels = Vector{Level{T,V}}()
3131
bsr_flag = false
32+
w = MultiLevelWorkspace(Val{bs}, eltype(A))
3233

3334
while length(levels) + 1 < max_levels && size(A, 1) > max_coarse
35+
residual!(w, size(A, 1))
3436
A, B, bsr_flag = extend_hierarchy!(levels, strength, aggregate, smooth,
3537
improve_candidates, diagonal_dominance,
3638
keep, A, B, symmetry, bsr_flag)
39+
coarse_x!(w, size(A, 1))
40+
coarse_b!(w, size(A, 1))
3741
#=if size(A, 1) <= max_coarse
3842
break
3943
end=#
4044
end
4145
#=A, B = extend_hierarchy!(levels, strength, aggregate, smooth,
4246
improve_candidates, diagonal_dominance,
4347
keep, A, B, symmetry)=#
44-
MultiLevel(levels, A, coarse_solver(A), presmoother, postsmoother)
48+
MultiLevel(levels, A, coarse_solver(A), presmoother, postsmoother, w)
4549
end
4650

4751
struct HermitianSymmetry

src/classical.jl

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,29 @@ struct Solver{S,T,P,PS}
77
max_coarse::Int64
88
end
99

10-
function ruge_stuben(A::SparseMatrixCSC{Ti,Tv};
10+
function ruge_stuben(A::SparseMatrixCSC{Ti,Tv}, ::Type{Val{bs}}=Val{1};
1111
strength = Classical(0.25),
1212
CF = RS(),
1313
presmoother = GaussSeidel(),
1414
postsmoother = GaussSeidel(),
1515
max_levels = 10,
16-
max_coarse = 10) where {Ti,Tv}
16+
max_coarse = 10,
17+
coarse_solver = Pinv) where {Ti,Tv,bs}
1718

1819
s = Solver(strength, CF, presmoother,
1920
postsmoother, max_levels, max_levels)
2021

2122
levels = Vector{Level{Ti,Tv}}()
23+
w = MultiLevelWorkspace(Val{bs}, eltype(A))
2224

2325
while length(levels) + 1 < max_levels && size(A, 1) > max_coarse
26+
residual!(w, size(A, 1))
2427
A = extend_heirarchy!(levels, strength, CF, A)
28+
coarse_x!(w, size(A, 1))
29+
coarse_b!(w, size(A, 1))
2530
end
26-
MultiLevel(levels, A, presmoother, postsmoother)
31+
32+
MultiLevel(levels, A, coarse_solver(A), presmoother, postsmoother, w)
2733
end
2834

2935
function extend_heirarchy!(levels::Vector{Level{Ti,Tv}}, strength, CF, A::SparseMatrixCSC{Ti,Tv}) where {Ti,Tv}

src/multilevel.jl

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,48 @@ struct Level{T,V}
44
R::SparseMatrixCSC{T,V}
55
end
66

7-
struct MultiLevel{S, Pre, Post, Ti, Tv}
7+
struct MultiLevel{S, Pre, Post, Ti, Tv, TW}
88
levels::Vector{Level{Ti,Tv}}
99
final_A::SparseMatrixCSC{Ti,Tv}
1010
coarse_solver::S
1111
presmoother::Pre
1212
postsmoother::Post
13+
workspace::TW
14+
end
15+
16+
struct MultiLevelWorkspace{TX, bs}
17+
coarse_xs::Vector{TX}
18+
coarse_bs::Vector{TX}
19+
res_vecs::Vector{TX}
20+
end
21+
function MultiLevelWorkspace(::Type{Val{bs}}, ::Type{T}) where {bs, T<:Number}
22+
if bs === 1
23+
TX = Vector{T}
24+
else
25+
TX = Matrix{T}
26+
end
27+
MultiLevelWorkspace{TX, bs}(TX[], TX[], TX[])
28+
end
29+
function residual!(m::MultiLevelWorkspace{TX, bs}, n) where {TX, bs}
30+
if bs === 1
31+
push!(m.res_vecs, TX(undef, n))
32+
else
33+
push!(m.res_vecs, TX(undef, n, bs))
34+
end
35+
end
36+
function coarse_x!(m::MultiLevelWorkspace{TX, bs}, n) where {TX, bs}
37+
if bs === 1
38+
push!(m.coarse_xs, TX(undef, n))
39+
else
40+
push!(m.coarse_xs, TX(undef, n, bs))
41+
end
42+
end
43+
function coarse_b!(m::MultiLevelWorkspace{TX, bs}, n) where {TX, bs}
44+
if bs === 1
45+
push!(m.coarse_bs, TX(undef, n))
46+
else
47+
push!(m.coarse_bs, TX(undef, n, bs))
48+
end
1349
end
1450

1551
abstract type CoarseSolver end
@@ -19,8 +55,6 @@ struct Pinv{T} <: CoarseSolver
1955
end
2056
(p::Pinv)(x, b) = mul!(x, p.pinvA, b)
2157

22-
MultiLevel(l::Vector{Level{Ti,Tv}}, A::SparseMatrixCSC{Ti,Tv}, presmoother, postsmoother) where {Ti,Tv} =
23-
MultiLevel(l, A, Pinv(A), presmoother, postsmoother)
2458
Base.length(ml) = length(ml.levels) + 1
2559

2660
function Base.show(io::IO, ml::MultiLevel)

test/gmg.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,20 @@ function multigrid(A::SparseMatrixCSC{T,V}; max_levels = 10, max_coarse = 10,
44
presmoother = GaussSeidel(), postsmoother = GaussSeidel()) where {T,V}
55

66
levels = Vector{Level{T,V}}()
7+
w = AlgebraicMultigrid.MultiLevelWorkspace(Val{1}, eltype(A))
78

89
while length(levels) + 1 < max_levels && size(A, 1) > max_coarse
10+
AlgebraicMultigrid.residual!(w, size(A, 1))
911
A = extend!(levels, A)
12+
AlgebraicMultigrid.coarse_x!(w, size(A, 1))
13+
AlgebraicMultigrid.coarse_b!(w, size(A, 1))
1014
#=if size(A, 1) <= max_coarse
1115
# push!(levels, Level(A,spzeros(T,0,0),spzeros(T,0,0)))
1216
break
1317
end=#
1418
end
1519

16-
MultiLevel(levels, A, presmoother, postsmoother)
20+
MultiLevel(levels, A, Pinv(A), presmoother, postsmoother, w)
1721
end
1822

1923
function extend!(levels, A::SparseMatrixCSC{Ti,Tv}) where {Ti,Tv}

0 commit comments

Comments
 (0)