Skip to content

Commit 955d2eb

Browse files
authored
Merge pull request #178 from fverdugo/solvers
2 parents 2c9f414 + d05a439 commit 955d2eb

17 files changed

+1937
-600
lines changed

.github/workflows/ci.yml

+1-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ jobs:
1818
fail-fast: false
1919
matrix:
2020
version:
21-
- '1.6'
2221
- '1'
2322
os:
2423
- ubuntu-latest
@@ -85,8 +84,7 @@ jobs:
8584
- run: |
8685
julia --project=HPCG -e '
8786
using Pkg
88-
Pkg.develop(path=".")
89-
Pkg.develop(path="./PartitionedSolvers")
87+
Pkg.develop([Pkg.PackageSpec(path="."),Pkg.PackageSpec(path="./PartitionedSolvers")])
9088
Pkg.test("HPCG")'
9189
docs:
9290
name: Documentation

HPCG/Project.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ DelimitedFiles = "1.9"
2323
JSON = "0.21"
2424
MPI = "0.20"
2525
PartitionedArrays = "0.5"
26-
PartitionedSolvers = "0.2"
26+
PartitionedSolvers = "0.3"
2727
Primes = "0.5"
2828
SparseMatricesCSR = "0.6"
2929
julia = "1.1"

HPCG/src/mg_preconditioner.jl

+7-7
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ function generate_problem(ranks, npx, npy, npz, nx, ny, nz, solver)
110110
Axf = similar(r)
111111
Axf .= 0
112112
x .= 0
113-
gs_state = setup(solver, x, A, r)
113+
gs_state = solver(PartitionedSolvers.linear_problem(x, A, r))
114114
return A, r, x, Axf, gs_state
115115
end
116116

@@ -139,11 +139,11 @@ function pc_setup(np, ranks, l, nx, ny, nz)
139139
r = Vector{PVector}(undef, l)
140140
x = Vector{PVector}(undef, l)
141141
Axf = Vector{PVector}(undef, l)
142-
gs_states = Vector{PartitionedSolvers.Preconditioner}(undef, l)
142+
gs_states = Vector{PartitionedSolvers.LinearSolver}(undef, l)
143143
npx, npy, npz = compute_optimal_shape_XYZ(np)
144144
nnz_vec = Vector{Int64}(undef, l)
145145
nrows_vec = Vector{Int64}(undef, l)
146-
solver = PartitionedSolvers.additive_schwarz_correction_partition(gauss_seidel(; iters = 1))
146+
solver = p -> PartitionedSolvers.gauss_seidel(p;iterations=1)
147147

148148
# create top problem
149149
A, r, x, Axf, gs_state = generate_problem(ranks, npx, npy, npz, nx, ny, nz, solver)
@@ -313,16 +313,16 @@ end
313313
"""
314314
function pc_solve!(x, s::Mg_preconditioner, b, l; zero_guess = false)
315315
if l == 1
316-
solve!(x, s.gs_states[l], b; zero_guess) # bottom solve
316+
PartitionedSolvers.smooth!(x, s.gs_states[l], b; zero_guess) # bottom solve
317317
else
318-
solve!(x, s.gs_states[l], b; zero_guess) # presmoother
318+
PartitionedSolvers.smooth!(x, s.gs_states[l], b; zero_guess) # presmoother
319319
mul_no_lat!(s.Axf[l], s.A_vec[l], x)
320320
p_restrict!(s.r[l-1], b, s.Axf[l], s.f2c[l-1])
321321
s.x[l-1] .= 0.0
322322
pc_solve!(s.x[l-1], s, s.r[l-1], l - 1; zero_guess = true)
323323
p_prolongate!(x, s.x[l-1], s.f2c[l-1])
324-
consistent!(x) |> wait
325-
solve!(x, s.gs_states[l], b) # post smooth
324+
#consistent!(x) |> wait #Already inside gauss_seidel
325+
PartitionedSolvers.smooth!(x, s.gs_states[l], b) # post smooth
326326
end
327327
x
328328
end

PartitionedSolvers/Project.toml

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
name = "PartitionedSolvers"
22
uuid = "11b65f7f-80ac-401b-9ef2-3db765482d62"
33
authors = ["Francesc Verdugo <[email protected]>"]
4-
version = "0.2.2"
4+
version = "0.3.0"
55

66
[deps]
77
IterativeSolvers = "42fd0dbc-a981-5370-80f2-aaf504508153"
88
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
9+
NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56"
910
PartitionedArrays = "5a9dfac6-5c52-46f7-8278-5e2210713be9"
11+
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
1012
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
1113
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
1214
SparseMatricesCSR = "a0a7dd2c-ebf4-11e9-1f05-cf50bc540ca1"
1315

1416
[compat]
1517
IterativeSolvers = "0.9"
18+
NLsolve = "4"
1619
PartitionedArrays = "0.4.4, 0.5"
1720
SparseArrays = "1"
1821
julia = "1.6"

PartitionedSolvers/src/PartitionedSolvers.jl

+3-29
Original file line numberDiff line numberDiff line change
@@ -5,39 +5,13 @@ using PartitionedArrays: val_parameter
55
using SparseArrays
66
using LinearAlgebra
77
using IterativeSolvers
8+
using Printf
9+
import NLsolve
810
using SparseMatricesCSR
911

10-
export setup
11-
export solve!
12-
export update!
13-
export finalize!
14-
export AbstractLinearSolver
15-
export linear_solver
16-
export default_nullspace
17-
export nullspace
18-
export uses_nullspace
19-
export uses_initial_guess
20-
export iterations!
2112
include("interfaces.jl")
22-
23-
export lu_solver
24-
export jacobi_correction
25-
export richardson
26-
export jacobi
27-
export gauss_seidel
28-
export additive_schwarz_correction
29-
export additive_schwarz
13+
include("wrappers.jl")
3014
include("smoothers.jl")
31-
32-
export amg
33-
export smoothed_aggregation
34-
export v_cycle
35-
export w_cycle
36-
export amg_level_params
37-
export amg_level_params_linear_elasticity
38-
export amg_fine_params
39-
export amg_coarse_params
40-
export amg_statistics
4115
include("amg.jl")
4216

4317
end # module

PartitionedSolvers/src/amg.jl

+37-24
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,15 @@
11

2+
function default_nullspace(A)
3+
T = eltype(A)
4+
[ones(T,size(A,2))]
5+
end
6+
7+
function default_nullspace(A::PSparseMatrix)
8+
col_partition = partition(axes(A,2))
9+
T = eltype(A)
10+
[ pones(T,col_partition) ]
11+
end
12+
213
function aggregate(A,diagA=dense_diag(A);epsilon)
314
# TODO It assumes CSC format for the moment
415

@@ -744,7 +755,7 @@ function dofs_to_node(dofs, block_size)
744755
end
745756

746757
function amg_level_params_linear_elasticity(block_size;
747-
pre_smoother = additive_schwarz(gauss_seidel(;iters=1);iters=1),
758+
pre_smoother = p-> additive_schwarz(p;local_solver=q->gauss_seidel(q;iterations=1),iterations=1),
748759
coarsening = smoothed_aggregation_with_block_size(;approximate_omega = lambda_generic,
749760
tentative_prolongator = tentative_prolongator_with_block_size, block_size = block_size),
750761
cycle = v_cycle,
@@ -756,7 +767,7 @@ function amg_level_params_linear_elasticity(block_size;
756767
end
757768

758769
function amg_level_params(;
759-
pre_smoother = additive_schwarz(gauss_seidel(;iters=1);iters=1),
770+
pre_smoother = p-> additive_schwarz(p;local_solver=q->gauss_seidel(q;iterations=1),iterations=1),
760771
coarsening = smoothed_aggregation(;),
761772
cycle = v_cycle,
762773
pos_smoother = pre_smoother,
@@ -774,23 +785,24 @@ end
774785

775786
function amg_coarse_params(;
776787
#TODO more resonable defaults?
777-
coarse_solver = lu_solver(),
788+
coarse_solver = LinearAlgebra_lu,
778789
coarse_size = 10,
779790
)
780791
coarse_params = (;coarse_solver,coarse_size)
781792
coarse_params
782793
end
783794

784-
function amg(;
795+
function amg(p;
785796
fine_params=amg_fine_params(),
786797
coarse_params=amg_coarse_params(),)
787798
amg_params = (;fine_params,coarse_params)
788-
setup(x,O,b,options) = amg_setup(x,O,b,nullspace(options),amg_params)
789-
update! = amg_update!
790-
solve! = amg_solve!
791-
finalize! = amg_finalize!
792-
uses_nullspace = Val(true)
793-
linear_solver(;setup,update!,solve!,finalize!,uses_nullspace)
799+
800+
x = solution(p)
801+
b = rhs(p)
802+
A = matrix(p)
803+
B = nullspace(p)
804+
setup = amg_setup(x,A,b,B,amg_params)
805+
linear_solver(amg_update!,amg_step!,p,setup)
794806
end
795807

796808
function amg_setup(x,A,b,::Nothing,amg_params)
@@ -807,8 +819,8 @@ function amg_setup(x,A,b,B,amg_params)
807819
return nothing
808820
end
809821
(;pre_smoother,pos_smoother,coarsening,cycle) = fine_level
810-
pre_setup = setup(pre_smoother,x,A,b)
811-
pos_setup = setup(pos_smoother,x,A,b)
822+
pre_setup = pre_smoother(linear_problem(x,A,b))
823+
pos_setup = pos_smoother(linear_problem(x,A,b))
812824
coarsen, _ = coarsening
813825
Ac,Bc,R,P,Ac_setup = coarsen(A,B)
814826
nc = size(Ac,1)
@@ -830,28 +842,29 @@ function amg_setup(x,A,b,B,amg_params)
830842
end
831843
n_fine_levels = count(i->i!==nothing,fine_levels)
832844
nlevels = n_fine_levels+1
833-
coarse_solver_setup = setup(coarse_solver,x,A,b)
845+
coarse_solver_setup = coarse_solver(linear_problem(x,A,b))
834846
coarse_level = (;coarse_solver_setup)
835847
(;nlevels,fine_levels,coarse_level,amg_params)
836848
end
837849

838-
function amg_solve!(x,setup,b,options)
850+
function amg_step!(x,setup,b,phase=:start;kwargs...)
839851
level=1
840852
amg_cycle!(x,setup,b,level)
841-
x
853+
phase=:stop
854+
x,setup,phase
842855
end
843856

844857
function amg_cycle!(x,setup,b,level)
845858
amg_params = setup.amg_params
846859
if level == setup.nlevels
847860
coarse_solver_setup = setup.coarse_level.coarse_solver_setup
848-
return solve!(x,coarse_solver_setup,b)
861+
return smooth!(x,coarse_solver_setup,b)
849862
end
850863
level_params = amg_params.fine_params[level]
851864
level_setup = setup.fine_levels[level]
852865
(;cycle) = level_params
853866
(;R,P,r,rc,rc2,e,ec,ec2,A,Ac,pre_setup,pos_setup) = level_setup
854-
solve!(x,pre_setup,b)
867+
smooth!(x,pre_setup,b)
855868
mul!(r,A,x)
856869
r .= b .- r
857870
mul!(rc2,R,r)
@@ -861,16 +874,16 @@ function amg_cycle!(x,setup,b,level)
861874
ec2 .= ec
862875
mul!(e,P,ec2)
863876
x .+= e
864-
solve!(x,pos_setup,b)
877+
smooth!(x,pos_setup,b)
865878
x
866879
end
867880

868-
function amg_statistics(P::Preconditioner)
881+
function amg_statistics(P)
869882
# Taken from: An Introduction to Algebraic Multigrid, R. D. Falgout, April 25, 2006
870883
# Grid complexity is the total number of grid points on all grids divided by the number
871884
# of grid points on the fine grid. Operator complexity is the total number of nonzeroes in the linear operators
872885
# on all grids divided by the number of nonzeroes in the fine grid operator
873-
setup = P.solver_setup
886+
setup = P.workspace
874887
nlevels = setup.nlevels
875888
level_rows = zeros(Int,nlevels)
876889
level_nnz = zeros(Int,nlevels)
@@ -909,7 +922,7 @@ end
909922
amg_cycle!(args...)
910923
end
911924

912-
function amg_update!(setup,A,options)
925+
function amg_update!(setup,A)
913926
amg_params = setup.amg_params
914927
nlevels = setup.nlevels
915928
for level in 1:(nlevels-1)
@@ -918,13 +931,13 @@ function amg_update!(setup,A,options)
918931
(;coarsening) = level_params
919932
_, coarsen! = coarsening
920933
(;R,P,A,Ac,Ac_setup,pre_setup,pos_setup) = level_setup
921-
update!(pre_setup,A)
922-
update!(pos_setup,A)
934+
update(pre_setup,matrix=A)
935+
update(pos_setup,matrix=A)
923936
coarsen!(A,Ac,R,P,Ac_setup)
924937
A = Ac
925938
end
926939
coarse_solver_setup = setup.coarse_level.coarse_solver_setup
927-
update!(coarse_solver_setup,A)
940+
update(coarse_solver_setup,matrix=A)
928941
setup
929942
end
930943

0 commit comments

Comments
 (0)