29
29
function gs! (A, b, x, start, step, stop)
30
30
n = size (A, 1 )
31
31
z = zero (eltype (A))
32
- for i = start: step: stop
33
- rsum = z
34
- d = z
35
- for j in nzrange (A, i)
36
- row = A. rowval[j]
37
- val = A. nzval[j]
38
- if i == row
39
- d = val
40
- else
41
- rsum += val * x[row]
32
+ @inbounds for col = 1 : size (x, 2 )
33
+ for i = start: step: stop
34
+ rsum = z
35
+ d = z
36
+ for j in nzrange (A, i)
37
+ row = A. rowval[j]
38
+ val = A. nzval[j]
39
+ d = ifelse (i == row, val, d)
40
+ rsum += ifelse (i == row, 0 , val * x[row, col])
42
41
end
43
- end
44
-
45
- if d != 0
46
- x[i] = (b[i] - rsum) / d
42
+ x[i, col] = ifelse (d == 0 , x[i, col], (b[i, col] - rsum) / d)
47
43
end
48
44
end
49
45
end
@@ -52,40 +48,97 @@ struct Jacobi{T,TX} <: Smoother
52
48
ω:: T
53
49
temp:: TX
54
50
end
55
- Jacobi (ω= 0.5 , x) = Jacobi {T,TX} (ω, similar (x))
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))
56
53
57
- function (jacobi:: Jacobi )(A, x, b, ω, start, step, stop )
54
+ function (jacobi:: Jacobi )(A, x, b)
58
55
59
- one = one (eltype (A))
56
+ ω = jacobi. ω
57
+ one = Base. one (eltype (A))
60
58
temp = jacobi. temp
61
59
62
- @inbounds for col in 1 : size (x, 2 )
63
- for i = start : step : stop
60
+ @inbounds for col = 1 : size (x, 2 )
61
+ for i = 1 : size (A, 1 )
64
62
temp[i, col] = x[i, col]
65
63
end
66
64
67
- for i = start : step : stop
65
+ for i = 1 : size (A, 1 )
68
66
rsum = zero (eltype (A))
69
67
diag = zero (eltype (A))
70
68
71
69
for j in nzrange (A, i)
72
70
row = A. rowval[j]
73
71
val = A. nzval[j]
74
72
75
- if row == i
76
- diag = val
77
- else
78
- rsum += val * temp[row, col]
79
- end
73
+ diag = ifelse (row == i, val, diag)
74
+ rsum += ifelse (row == i, 0 , val * temp[row, col])
80
75
end
81
76
82
- if diag != 0
83
- x[i, col] = (one - ω) * temp[i, col] + ω * ((b[i, col] - rsum) / diag)
84
- end
77
+ xcand = (one - ω) * temp[i, col] + ω * ((b[i, col] - rsum) / diag)
78
+ x[i, col] = ifelse (diag == 0 , x[i, col], xcand)
85
79
end
86
80
end
87
81
end
88
82
83
+ #=
84
+ using KissThreading: tmap!
85
+
86
+ struct ParallelJacobi{T,TX} <: Smoother
87
+ ω::T
88
+ temp::TX
89
+ 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))
92
+
93
+ struct ParallelTemp{TX, TI}
94
+ temp::TX
95
+ col::TI
96
+ end
97
+ (ptemp::ParallelTemp)(i) = ptemp.temp[i, ptemp.col]
98
+
99
+ struct ParallelJacobiMapper{TA, TX, TB, TTemp, TF, TI}
100
+ A::TA
101
+ x::TX
102
+ b::TB
103
+ temp::TTemp
104
+ ω::TF
105
+ col::TI
106
+ end
107
+ function (pjacobmapper::ParallelJacobiMapper)(i)
108
+ A = pjacobmapper.A
109
+ x = pjacobmapper.x
110
+ b = pjacobmapper.b
111
+ temp = pjacobmapper.temp
112
+ ω = pjacobmapper.ω
113
+ col = pjacobmapper.col
114
+
115
+ one = Base.one(eltype(A))
116
+ rsum = zero(eltype(A))
117
+ diag = zero(eltype(A))
118
+
119
+ for j in nzrange(A, i)
120
+ row = A.rowval[j]
121
+ val = A.nzval[j]
122
+
123
+ diag = ifelse(row == i, val, diag)
124
+ rsum += ifelse(row == i, 0, val * temp[row, col])
125
+ end
126
+ xcand = (one - ω) * temp[i, col] + ω * ((b[i, col] - rsum) / diag)
127
+
128
+ return ifelse(diag == 0, x[i, col], xcand)
129
+ end
130
+
131
+ function (jacobi::ParallelJacobi)(A, x, b)
132
+ ω = jacobi.ω
133
+ temp = jacobi.temp
134
+ for col = 1:size(x, 2)
135
+ @views tmap!(ParallelTemp(temp, col), x[1:size(A, 1), col], 1:size(A, 1))
136
+ @views tmap!(ParallelJacobiMapper(A, x, b, temp, ω, col),
137
+ x[1:size(A, 1), col], 1:size(A, 1))
138
+ end
139
+ end
140
+ =#
141
+
89
142
struct JacobiProlongation{T}
90
143
ω:: T
91
144
end
0 commit comments