Skip to content

Commit 25bc52f

Browse files
authored
Merge pull request #96 from learning-chip/complex
Extend Ruge-Stuben solver to complex type
2 parents 97b1964 + a32ce5b commit 25bc52f

File tree

2 files changed

+9
-8
lines changed

2 files changed

+9
-8
lines changed

src/classical.jl

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ function extend_heirarchy!(levels, strength, CF, A::SparseMatrixCSC{Ti,Tv}, symm
4545
end
4646

4747
function direct_interpolation(At, T, splitting)
48+
T = typeof(At)(T)
4849
fill!(T.nzval, eltype(At)(1))
4950
T .= At .* T
5051

@@ -99,7 +100,7 @@ function rs_direct_interpolation_pass2(At::SparseMatrixCSC{Tv,Ti},
99100
row = T.rowval[j]
100101
sval = T.nzval[j]
101102
if splitting[row] == C_NODE
102-
if sval < 0
103+
if real(sval) < 0
103104
sum_strong_neg += sval
104105
else
105106
sum_strong_pos += sval
@@ -115,7 +116,7 @@ function rs_direct_interpolation_pass2(At::SparseMatrixCSC{Tv,Ti},
115116
if row == i
116117
diag += aval
117118
else
118-
if aval < 0
119+
if real(aval) < 0
119120
sum_all_neg += aval
120121
else
121122
sum_all_pos += aval
@@ -125,7 +126,7 @@ function rs_direct_interpolation_pass2(At::SparseMatrixCSC{Tv,Ti},
125126

126127
if sum_strong_pos == 0
127128
beta = zero(diag)
128-
if diag >= 0
129+
if real(diag) >= 0
129130
diag += sum_all_pos
130131
end
131132
else
@@ -134,14 +135,14 @@ function rs_direct_interpolation_pass2(At::SparseMatrixCSC{Tv,Ti},
134135

135136
if sum_strong_neg == 0
136137
alpha = zero(diag)
137-
if diag < 0
138+
if real(diag) < 0
138139
diag += sum_all_neg
139140
end
140141
else
141142
alpha = sum_all_neg / sum_strong_neg
142143
end
143144

144-
if isapprox(diag, 0, atol=eps(Tv))
145+
if isapprox(real(diag), 0, atol=eps(real(Tv)))
145146
neg_coeff = Tv(0)
146147
pos_coeff = Tv(0)
147148
else
@@ -155,7 +156,7 @@ function rs_direct_interpolation_pass2(At::SparseMatrixCSC{Tv,Ti},
155156
sval = T.nzval[j]
156157
if splitting[row] == C_NODE
157158
Bj[nnz] = row
158-
if sval < 0
159+
if real(sval) < 0
159160
Bx[nnz] = abs(neg_coeff * sval)
160161
else
161162
Bx[nnz] = abs(pos_coeff * sval)

src/strength.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ function (c::Classical)(At::SparseMatrixCSC{Tv,Ti}) where {Ti,Tv}
99
θ = c.θ
1010

1111
m, n = size(At)
12-
T = copy(At)
12+
T = real(copy(At))
1313

1414
for i = 1:n
1515
_m = find_max_off_diag(T, i)
@@ -37,7 +37,7 @@ function (c::Classical)(At::SparseMatrixCSC{Tv,Ti}) where {Ti,Tv}
3737
end
3838

3939
function find_max_off_diag(A, i)
40-
m = zero(eltype(A))
40+
m = real(zero(eltype(A)))
4141
for j in nzrange(A, i)
4242
row = A.rowval[j]
4343
val = A.nzval[j]

0 commit comments

Comments
 (0)