Skip to content

Commit 2834910

Browse files
authored
Merge pull request #10 from ranjanan/opt
Some memory optimisations
2 parents e7567f5 + e7f4eda commit 2834910

File tree

3 files changed

+43
-25
lines changed

3 files changed

+43
-25
lines changed

src/classical.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ function rs_direct_interpolation_pass1(T, A, splitting)
127127

128128
if sum_strong_pos == 0
129129
diag += sum_all_pos
130-
beta = 0
130+
beta = zero(beta)
131131
end
132132

133133
neg_coeff = -1 * alpha / diag
@@ -152,7 +152,7 @@ function rs_direct_interpolation_pass1(T, A, splitting)
152152
end
153153

154154
m = zeros(Ti, n)
155-
sum = 0
155+
sum = zero(eltype(m))
156156
for i = 1:n
157157
m[i] = sum
158158
sum += splitting[i]

src/splitting.jl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,11 @@ end
1414
end
1515
end
1616
end
17-
i, j, v = findnz(S)
1817
RS_CF_splitting(sparse(i,j,v,n,n), sparse(j,i,v,n,n))
1918
end=#
2019
function split_nodes(::RS, S)
21-
T = S'
22-
RS_CF_splitting(S - spdiagm(diag(S)), T - spdiagm(diag(T)))
20+
S = S - spdiagm(diag(S))
21+
RS_CF_splitting(S, S')
2322
end
2423

2524
function RS_CF_splitting(S::SparseMatrixCSC, T::SparseMatrixCSC)

src/strength.jl

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,62 +4,81 @@ struct Classical{T} <: Strength
44
end
55
Classical(;θ = 0.25) = Classical(θ)
66

7-
function strength_of_connection{T}(c::Classical{T}, A::SparseMatrixCSC)
7+
function strength_of_connection{T, Ti, Tv}(c::Classical{T}, A::SparseMatrixCSC{Tv, Ti})
88

99
θ = c.θ
10-
I = Int[]
11-
J = Int[]
12-
V = Float64[]
1310

1411
m, n = size(A)
12+
nz = nnz(A)
13+
I = zeros(Ti, nz)
14+
J = zeros(Ti, nz)
15+
V = zeros(float(Tv), nz)
16+
k = 1
1517

1618
for i = 1:n
17-
neighbors = A[:,i]
18-
_m = find_max_off_diag(neighbors, i)
19+
_m = find_max_off_diag(A, i)
1920
threshold = θ * _m
2021
for j in nzrange(A, i)
2122
row = A.rowval[j]
2223
val = A.nzval[j]
2324
if abs(val) >= threshold
2425
if row != i
25-
push!(I, row)
26-
push!(J, i)
27-
push!(V, abs(val))
26+
I[k] = row
27+
J[k] = i
28+
V[k] = abs(val)
29+
k += 1
2830
end
2931
end
3032

3133
if row == i
32-
push!(I, row)
33-
push!(J, i)
34-
push!(V, val)
34+
I[k] = row
35+
J[k] = i
36+
V[k] = val
37+
k += 1
3538
end
3639
end
3740
end
41+
deleteat!(I, k:nz)
42+
deleteat!(J, k:nz)
43+
deleteat!(V, k:nz)
44+
3845
S = sparse(I, J, V, m, n)
3946

4047
scale_cols_by_largest_entry!(S)
4148

42-
4349
S', S
4450
end
4551

46-
function find_max_off_diag(neighbors, col)
47-
maxval = zero(eltype(neighbors))
48-
for i in 1:length(neighbors.nzval)
49-
maxval = max(maxval, ifelse(neighbors.nzind[i] == col, 0, abs(neighbors.nzval[i])))
52+
function find_max_off_diag(A, i)
53+
m = zero(eltype(A))
54+
for j in nzrange(A, i)
55+
row = A.rowval[j]
56+
val = A.nzval[j]
57+
if row != i
58+
m = max(m, abs(val))
59+
end
5060
end
51-
return maxval
61+
m
62+
end
63+
64+
function find_max(A, i)
65+
m = zero(eltype(A))
66+
for j in nzrange(A, i)
67+
row = A.rowval[j]
68+
val = A.nzval[j]
69+
m = max(m, val)
70+
end
71+
m
5272
end
5373

5474
function scale_cols_by_largest_entry!(A::SparseMatrixCSC)
5575

5676
n = size(A, 1)
5777
for i = 1:n
58-
_m = maximum(A[:,i])
78+
_m = find_max(A, i)
5979
for j in nzrange(A, i)
6080
A.nzval[j] /= _m
6181
end
6282
end
63-
6483
A
6584
end

0 commit comments

Comments
 (0)