@@ -10,7 +10,7 @@ struct GaussSeidel{S} <: Smoother
10
10
sweep:: S
11
11
iter:: Int
12
12
end
13
- GaussSeidel (iter = 1 ) = GaussSeidel (SymmetricSweep (), iter)
13
+ GaussSeidel (; iter = 1 ) = GaussSeidel (SymmetricSweep (), iter)
14
14
GaussSeidel (f:: ForwardSweep ) = GaussSeidel (f, 1 )
15
15
GaussSeidel (b:: BackwardSweep ) = GaussSeidel (b, 1 )
16
16
GaussSeidel (s:: SymmetricSweep ) = GaussSeidel (s, 1 )
47
47
struct Jacobi{T,TX} <: Smoother
48
48
ω:: T
49
49
temp:: TX
50
+ iter:: Int
50
51
end
51
- Jacobi (ω, x:: TX ) where {T, TX<: AbstractVector {T} } = Jacobi {T,TX} (ω, similar (x))
52
- Jacobi (x:: TX , ω = 0.5 ) where {T, TX<: AbstractVector {T} } = Jacobi {T,TX} (ω, similar (x))
52
+ Jacobi (ω, x:: TX ; iter = 1 ) where {T, TX<: AbstractArray {T} } = Jacobi {T,TX} (ω, similar (x), iter )
53
+ Jacobi (x:: TX , ω= 0.5 ; iter = 1 ) where {T, TX<: AbstractArray {T} } = Jacobi {T,TX} (ω, similar (x), iter )
53
54
54
55
function (jacobi:: Jacobi )(A, x, b)
55
56
56
57
ω = jacobi. ω
57
58
one = Base. one (eltype (A))
58
59
temp = jacobi. temp
59
60
60
- @inbounds for col = 1 : size (x, 2 )
61
- for i = 1 : size (A, 1 )
62
- temp[i, col] = x[i, col]
63
- end
61
+ for i in 1 : jacobi. iter
62
+ @inbounds for col = 1 : size (x, 2 )
63
+ for i = 1 : size (A, 1 )
64
+ temp[i, col] = x[i, col]
65
+ end
64
66
65
- for i = 1 : size (A, 1 )
66
- rsum = zero (eltype (A))
67
- diag = zero (eltype (A))
67
+ for i = 1 : size (A, 1 )
68
+ rsum = zero (eltype (A))
69
+ diag = zero (eltype (A))
68
70
69
- for j in nzrange (A, i)
70
- row = A. rowval[j]
71
- val = A. nzval[j]
71
+ for j in nzrange (A, i)
72
+ row = A. rowval[j]
73
+ val = A. nzval[j]
72
74
73
- diag = ifelse (row == i, val, diag)
74
- rsum += ifelse (row == i, 0 , val * temp[row, col])
75
- end
75
+ diag = ifelse (row == i, val, diag)
76
+ rsum += ifelse (row == i, 0 , val * temp[row, col])
77
+ end
76
78
77
- xcand = (one - ω) * temp[i, col] + ω * ((b[i, col] - rsum) / diag)
78
- x[i, col] = ifelse (diag == 0 , x[i, col], xcand)
79
+ xcand = (one - ω) * temp[i, col] + ω * ((b[i, col] - rsum) / diag)
80
+ x[i, col] = ifelse (diag == 0 , x[i, col], xcand)
81
+ end
79
82
end
80
83
end
81
84
end
@@ -87,8 +90,8 @@ struct ParallelJacobi{T,TX} <: Smoother
87
90
ω::T
88
91
temp::TX
89
92
end
90
- ParallelJacobi(ω, x::TX) where {T, TX<:AbstractVector {T}} = ParallelJacobi{T,TX}(ω, similar(x))
91
- ParallelJacobi(x::TX, ω = 0.5) where {T, TX<:AbstractVector {T}} = ParallelJacobi{T,TX}(ω, similar(x))
93
+ ParallelJacobi(ω, x::TX) where {T, TX<:AbstractArray {T}} = ParallelJacobi{T,TX}(ω, similar(x))
94
+ ParallelJacobi(x::TX, ω = 0.5) where {T, TX<:AbstractArray {T}} = ParallelJacobi{T,TX}(ω, similar(x))
92
95
93
96
struct ParallelTemp{TX, TI}
94
97
temp::TX
0 commit comments