mirror of https://github.com/fredrikekre/HYPRE.jl
Julia interface to hypre linear solvers (https://github.com/hypre-space/hypre)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.9 KiB
78 lines
2.9 KiB
using HYPRE |
|
using HYPRE.LibHYPRE |
|
using Test |
|
using SparseArrays |
|
using SparseMatricesCSR |
|
|
|
using MPI |
|
MPI.Init() |
|
|
|
@testset "HYPREMatrix" begin |
|
H = HYPREMatrix() |
|
@test H.IJMatrix == HYPRE_IJMatrix(C_NULL) |
|
@test H.ParCSRMatrix == HYPRE_ParCSRMatrix(C_NULL) |
|
|
|
ilower, iupper = 4, 6 |
|
CSC = convert(SparseMatrixCSC{HYPRE_Complex, HYPRE_Int}, sparse([ |
|
1 2 0 0 3 |
|
0 4 0 5 0 |
|
0 6 7 0 8 |
|
])) |
|
CSR = sparsecsr(findnz(CSC)..., size(CSC)...) |
|
@test CSC == CSR |
|
csc = HYPRE.Internals.to_hypre_data(CSC, ilower, iupper) |
|
csr = HYPRE.Internals.to_hypre_data(CSR, ilower, iupper) |
|
@test csc[1]::HYPRE_Int == csr[1]::HYPRE_Int == 3 # nrows |
|
@test csc[2]::Vector{HYPRE_Int} == csr[2]::Vector{HYPRE_Int} == [3, 2, 3] # ncols |
|
@test csc[3]::Vector{HYPRE_BigInt} == csr[3]::Vector{HYPRE_BigInt} == [4, 5, 6] # rows |
|
@test csc[4]::Vector{HYPRE_BigInt} == csr[4]::Vector{HYPRE_BigInt} == [1, 2, 5, 2, 4, 2, 3, 5] # cols |
|
@test csc[5]::Vector{HYPRE_Complex} == csr[5]::Vector{HYPRE_Complex} == 1:8 # values |
|
|
|
# Optimizations for CSR matrix |
|
@test csr[4] == CSR.colval |
|
@test_broken csr[4] === CSR.colval |
|
@test csr[5] == CSR.nzval |
|
@test_broken csr[5]::Vector{HYPRE_Complex} === CSR.nzval |
|
|
|
@test_throws ArgumentError HYPRE.Internals.to_hypre_data(CSC, ilower, iupper-1) |
|
@test_throws ArgumentError HYPRE.Internals.to_hypre_data(CSR, ilower, iupper+1) |
|
|
|
# Converting SparseMatrixCS(C|R) to HYPREMatrix |
|
ilower, iupper = 6, 10 |
|
CSC = sprand(5, 10, 0.3) |
|
CSR = sparsecsr(findnz(CSC)..., size(CSC)...) |
|
@test CSC == CSR |
|
H = HYPREMatrix(CSC, ilower, iupper) |
|
@test H.IJMatrix != HYPRE_IJMatrix(C_NULL) |
|
@test H.ParCSRMatrix != HYPRE_ParCSRMatrix(C_NULL) |
|
H = HYPREMatrix(CSR, ilower, iupper) |
|
@test H.IJMatrix != HYPRE_IJMatrix(C_NULL) |
|
@test H.ParCSRMatrix != HYPRE_ParCSRMatrix(C_NULL) |
|
end |
|
|
|
@testset "HYPREVector" begin |
|
h = HYPREVector() |
|
@test h.IJVector == HYPRE_IJVector(C_NULL) |
|
@test h.ParVector == HYPRE_ParVector(C_NULL) |
|
|
|
ilower, iupper = 1, 10 |
|
b = rand(HYPRE_Complex, 10) |
|
nvalues, indices, values = HYPRE.Internals.to_hypre_data(b, ilower, iupper) |
|
@test nvalues::HYPRE_Int == 10 |
|
@test indices::Vector{HYPRE_Int} == collect(1:10) |
|
@test values::Vector{HYPRE_Complex} === b # === for correct eltype |
|
|
|
b = rand(1:10, 10) |
|
nvalues, indices, values = HYPRE.Internals.to_hypre_data(b, ilower, iupper) |
|
@test nvalues::HYPRE_Int == 10 |
|
@test indices::Vector{HYPRE_Int} == collect(1:10) |
|
@test values::Vector{HYPRE_Complex} == b # == for other eltype |
|
@test_throws ArgumentError HYPRE.Internals.to_hypre_data([1, 2], ilower, iupper) |
|
|
|
# Converting Vector to HYPREVector |
|
b = rand(HYPRE_Complex, 10) |
|
h = HYPREVector(b, ilower, iupper) |
|
@test h.IJVector != HYPRE_IJVector(C_NULL) |
|
@test h.ParVector != HYPRE_ParVector(C_NULL) |
|
@test_throws ArgumentError HYPREVector([1, 2], ilower, iupper) |
|
end
|
|
|