1- function smoothed_aggregation (A:: SparseMatrixCSC{T,V} ,
1+ function smoothed_aggregation (A:: TA ,
2+ :: Type{Val{bs}} = Val{1 },
23 symmetry = HermitianSymmetry (),
34 strength = SymmetricStrength (),
45 aggregate = StandardAggregation (),
56 smooth = JacobiProlongation (4.0 / 3.0 ),
67 presmoother = GaussSeidel (),
78 postsmoother = GaussSeidel (),
8- improve_candidates = GaussSeidel (4 ),
9+ improve_candidates = GaussSeidel (iter = 4 ),
910 max_levels = 10 ,
1011 max_coarse = 10 ,
1112 diagonal_dominance = false ,
1213 keep = false ,
13- coarse_solver = Pinv ()) where {T,V}
14-
14+ coarse_solver = Pinv) where {T,V,bs,TA<: SparseMatrixCSC{T,V} }
1515
1616 n = size (A, 1 )
1717 # B = kron(ones(n, 1), eye(1))
@@ -28,21 +28,29 @@ function smoothed_aggregation(A::SparseMatrixCSC{T,V},
2828 # agg = [aggregate for _ in 1:max_levels - 1]
2929 # sm = [smooth for _ in 1:max_levels]
3030
31- levels = Vector {Level{T,V}} ()
31+ @static if VERSION < v " 0.7-"
32+ levels = Vector {Level{TA, TA, TA}} ()
33+ else
34+ levels = Vector {Level{TA, TA, Adjoint{T, TA}}} ()
35+ end
3236 bsr_flag = false
37+ w = MultiLevelWorkspace (Val{bs}, eltype (A))
3338
3439 while length (levels) + 1 < max_levels && size (A, 1 ) > max_coarse
40+ residual! (w, size (A, 1 ))
3541 A, B, bsr_flag = extend_hierarchy! (levels, strength, aggregate, smooth,
3642 improve_candidates, diagonal_dominance,
3743 keep, A, B, symmetry, bsr_flag)
44+ coarse_x! (w, size (A, 1 ))
45+ coarse_b! (w, size (A, 1 ))
3846 #= if size(A, 1) <= max_coarse
3947 break
4048 end=#
4149 end
4250 #= A, B = extend_hierarchy!(levels, strength, aggregate, smooth,
4351 improve_candidates, diagonal_dominance,
4452 keep, A, B, symmetry)=#
45- MultiLevel (levels, A, presmoother, postsmoother)
53+ MultiLevel (levels, A, coarse_solver (A), presmoother, postsmoother, w )
4654end
4755
4856struct HermitianSymmetry
@@ -54,18 +62,22 @@ function extend_hierarchy!(levels, strength, aggregate, smooth,
5462 symmetry, bsr_flag)
5563
5664 # Calculate strength of connection matrix
57- S = strength_of_connection (strength, A, bsr_flag)
65+ if symmetry isa HermitianSymmetry
66+ S, _T = strength (A, bsr_flag)
67+ else
68+ S, _T = strength (adjoint (A), bsr_flag)
69+ end
5870
5971 # Aggregation operator
60- AggOp = aggregation ( aggregate, S)
72+ AggOp = aggregate ( S)
6173 # b = zeros(eltype(A), size(A, 1))
6274
6375 # Improve candidates
6476 b = zeros (size (A,1 ))
65- relax! ( improve_candidates, A, B, b)
77+ improve_candidates ( A, B, b)
6678 T, B = fit_candidates (AggOp, B)
6779
68- P = smooth_prolongator ( smooth, A, T, S, B)
80+ P = smooth ( A, T, S, B)
6981 R = construct_R (symmetry, P)
7082 push! (levels, Level (A, P, R))
7183
@@ -81,7 +93,7 @@ construct_R(::HermitianSymmetry, P) = P'
8193
8294function fit_candidates (AggOp, B, tol = 1e-10 )
8395
84- A = AggOp.'
96+ A = adjoint ( AggOp)
8597 n_fine, n_coarse = size (A)
8698 n_col = n_coarse
8799
0 commit comments