Skip to content

Commit 3dd19cc

Browse files
authored
Merge pull request #71 from mohamed82008/mt/iterativesolvers9
Update to support IterativeSolvers.jl 0.9 API
2 parents 637e28e + ebd5137 commit 3dd19cc

File tree

3 files changed

+12
-11
lines changed

3 files changed

+12
-11
lines changed

Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "AlgebraicMultigrid"
22
uuid = "2169fc97-5a83-5252-b627-83903c6c433c"
3-
version = "0.3.0"
3+
version = "0.4.0"
44

55
[deps]
66
CompatHelper = "aa819f21-2bde-4658-8897-bab36330d9b7"
@@ -14,7 +14,7 @@ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
1414

1515
[compat]
1616
CompatHelper = "1.3.0"
17-
IterativeSolvers = "0.8.3"
17+
IterativeSolvers = "0.9"
1818
julia = "1.4.0"
1919

2020
[extras]

src/multilevel.jl

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,8 @@ Arguments
132132
133133
Keyword Arguments
134134
=================
135-
* tol::Float64 - tolerance criteria for convergence
135+
* reltol::Float64 - relative tolerance criteria for convergence, the absolute tolerance will be `reltol * norm(b)`
136+
* abstol::Float64 - absolute tolerance criteria for convergence
136137
* maxiter::Int64 - maximum number of iterations to execute
137138
* verbose::Bool - display residual at each iteration
138139
* log::Bool - return vector of residuals along with solution
@@ -147,24 +148,24 @@ end
147148
function solve!(x, ml::MultiLevel, b::AbstractArray{T},
148149
cycle::Cycle = V();
149150
maxiter::Int = 100,
150-
tol::Float64 = 1e-5,
151+
abstol::Real = zero(real(eltype(b))),
152+
reltol::Real = sqrt(eps(real(eltype(b)))),
151153
verbose::Bool = false,
152154
log::Bool = false,
153155
calculate_residual = true) where {T}
154156

155157
A = length(ml) == 1 ? ml.final_A : ml.levels[1].A
156158
V = promote_type(eltype(A), eltype(b))
157-
tol = eltype(b)(tol)
158159
log && (residuals = Vector{V}())
159160
normres = normb = norm(b)
160161
if normb != 0
161-
tol *= normb
162+
abstol = max(reltol * normb, abstol)
162163
end
163164
log && push!(residuals, normb)
164165

165166
res = ml.workspace.res_vecs[1]
166167
itr = lvl = 1
167-
while itr <= maxiter && (!calculate_residual || normres > tol)
168+
while itr <= maxiter && (!calculate_residual || normres > abstol)
168169
if length(ml) == 1
169170
ml.coarse_solver(x, b)
170171
else

test/runtests.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ p = aspreconditioner(ml)
151151
b = zeros(n)
152152
b[1] = 1
153153
b[2] = -1
154-
x = solve(p.ml, A * ones(n), maxiter = 1, tol = 1e-12)
154+
x = solve(p.ml, A * ones(n), maxiter = 1, abstol = 1e-12)
155155
diff = x - [ 1.88664780e-16, 2.34982727e-16, 2.33917697e-16,
156156
8.77869044e-17, 7.16783490e-17, 1.43415460e-16,
157157
3.69199021e-17, 9.70950385e-17, 4.77034895e-17,
@@ -169,7 +169,7 @@ diff = x - [ 1.88664780e-16, 2.34982727e-16, 2.33917697e-16,
169169
-6.76965535e-16, -7.00643227e-16, -6.23581397e-16,
170170
-7.03016682e-16]
171171
@test sum(abs2, diff) < 1e-8
172-
x = solve(p.ml, b, maxiter = 1, tol = 1e-12)
172+
x = solve(p.ml, b, maxiter = 1, abstol = 1e-12)
173173
diff = x - [ 0.76347046, -0.5498286 , -0.2705487 , -0.15047352, -0.10248021,
174174
0.60292674, -0.11497073, -0.08460548, -0.06931461, 0.38230708,
175175
-0.055664 , -0.04854558, -0.04577031, 0.09964325, 0.01825624,
@@ -199,7 +199,7 @@ diff = x - [ 0.82365077, -0.537589 , -0.30632349, -0.19370186, -0.14773294,
199199
ml = ruge_stuben(A)
200200
p = aspreconditioner(ml)
201201

202-
x = cg(A, b, Pl = p, maxiter = 100_000, tol = 1e-6)
202+
x = cg(A, b, Pl = p, maxiter = 100_000, reltol = 1e-6)
203203
diff = x - [0.823762, -0.537478, -0.306212, -0.19359, -0.147621, 0.685002,
204204
-0.155389, -0.127703, -0.111867, 0.453735, -0.0856607, -0.0858715,
205205
-0.0846678, 0.129962, 0.0281662, -0.0389642, -0.0593981, -0.0653311,
@@ -210,7 +210,7 @@ diff = x - [0.823762, -0.537478, -0.306212, -0.19359, -0.147621, 0.685002,
210210
0.0511691, 0.0502043, 0.0498349, 0.0498134]
211211
@test sum(abs2, diff) < 1e-8
212212

213-
x = solve(ml, b, maxiter = 1, tol = 1e-12)
213+
x = solve(ml, b, maxiter = 1, reltol = 1e-12)
214214
diff = x - [0.775725, -0.571202, -0.290989, -0.157001, -0.106981, 0.622652,
215215
-0.122318, -0.0891874, -0.0709834, 0.392621, -0.055544, -0.0507485,
216216
-0.0466376, 0.107175, 0.0267468, -0.0200843, -0.0282827, -0.0299929,

0 commit comments

Comments
 (0)