@@ -227,4 +227,79 @@ function test_approximate_spectral_radius()
227227
228228 end
229229
230+ end
231+
232+ # Test Gauss Seidel
233+ import AMG: gs!, relax!
234+ function test_gauss_seidel ()
235+
236+ N = 1
237+ A = spdiagm ((2 * ones (N), - ones (N- 1 ), - ones (N- 1 )),
238+ (0 , - 1 , 1 ), N, N)
239+ x = eltype (A).(collect (0 : N- 1 ))
240+ b = zeros (N)
241+ s = GaussSeidel (ForwardSweep ())
242+ relax! (s, A, x, b)
243+ @test sum (abs2, x - zeros (N)) < 1e-8
244+
245+ N = 3
246+ A = spdiagm ((2 * ones (N), - ones (N- 1 ), - ones (N- 1 )),
247+ (0 , - 1 , 1 ), N, N)
248+ x = eltype (A).(collect (0 : N- 1 ))
249+ b = zeros (N)
250+ s = GaussSeidel (ForwardSweep ())
251+ relax! (s, A, x, b)
252+ @test sum (abs2, x - [1.0 / 2.0 , 5.0 / 4.0 , 5.0 / 8.0 ]) < 1e-8
253+
254+ N = 1
255+ A = spdiagm ((2 * ones (N), - ones (N- 1 ), - ones (N- 1 )),
256+ (0 , - 1 , 1 ), N, N)
257+ x = eltype (A).(collect (0 : N- 1 ))
258+ b = zeros (N)
259+ s = GaussSeidel (BackwardSweep ())
260+ relax! (s, A, x, b)
261+ @test sum (abs2, x - zeros (N)) < 1e-8
262+
263+ N = 3
264+ A = spdiagm ((2 * ones (N), - ones (N- 1 ), - ones (N- 1 )),
265+ (0 , - 1 , 1 ), N, N)
266+ x = eltype (A).(collect (0 : N- 1 ))
267+ b = zeros (N)
268+ s = GaussSeidel (BackwardSweep ())
269+ relax! (s, A, x, b)
270+ @test sum (abs2, x - [1.0 / 8.0 , 1.0 / 4.0 , 1.0 / 2.0 ]) < 1e-8
271+
272+ N = 1
273+ A = spdiagm ((2 * ones (N), - ones (N- 1 ), - ones (N- 1 )),
274+ (0 , - 1 , 1 ), N, N)
275+ x = eltype (A).(collect (0 : N- 1 ))
276+ b = eltype (A).([10. ])
277+ s = GaussSeidel (ForwardSweep ())
278+ relax! (s, A, x, b)
279+ @test sum (abs2, x - [5. ]) < 1e-8
280+
281+ N = 3
282+ A = spdiagm ((2 * ones (N), - ones (N- 1 ), - ones (N- 1 )),
283+ (0 , - 1 , 1 ), N, N)
284+ x = eltype (A).(collect (0 : N- 1 ))
285+ b = eltype (A).([10. , 20. , 30. ])
286+ s = GaussSeidel (ForwardSweep ())
287+ relax! (s, A, x, b)
288+ @test sum (abs2, x - [11.0 / 2.0 , 55.0 / 4 , 175.0 / 8.0 ]) < 1e-8
289+
290+ N = 100
291+ A = spdiagm ((2 * ones (N), - ones (N- 1 ), - ones (N- 1 )),
292+ (0 , - 1 , 1 ), N, N)
293+ x = ones (eltype (A), N)
294+ b = zeros (eltype (A), N)
295+ s1 = GaussSeidel (ForwardSweep (), 200 )
296+ relax! (s1, A, x, b)
297+ resid1 = norm (A* x,2 )
298+ x = ones (eltype (A), N)
299+ s2 = GaussSeidel (BackwardSweep (), 200 )
300+ relax! (s2, A, x, b)
301+ resid2 = norm (A* x,2 )
302+ @test resid1 < 0.01 && resid2 < 0.01
303+ @test isapprox (resid1, resid2)
304+
230305end
0 commit comments