@ -52,23 +52,23 @@ mutable struct HYPREMatrix # <: AbstractMatrix{HYPRE_Complex}
@@ -52,23 +52,23 @@ mutable struct HYPREMatrix # <: AbstractMatrix{HYPRE_Complex}
#= c o n s t =# iupper :: HYPRE_BigInt
#= c o n s t =# jlower :: HYPRE_BigInt
#= c o n s t =# jupper :: HYPRE_BigInt
IJM atrix:: HYPRE_IJMatrix
ParCSRM atrix:: HYPRE_ParCSRMatrix
ijm atrix:: HYPRE_IJMatrix
parm atrix:: HYPRE_ParCSRMatrix
end
function HYPREMatrix ( comm :: MPI . Comm , ilower :: Integer , iupper :: Integer ,
jlower :: Integer = ilower , jupper :: Integer = iupper )
# Create the IJ matrix
A = HYPREMatrix ( comm , ilower , iupper , jlower , jupper , C_NULL , C_NULL )
IJMatrixR ef = Ref { HYPRE_IJMatrix } ( C_NULL )
@check HYPRE_IJMatrixCreate ( comm , ilower , iupper , ilower , iupper , IJMatrixR ef)
A . IJMatrix = IJMatrixR ef[ ]
ijmatrix_r ef = Ref { HYPRE_IJMatrix } ( C_NULL )
@check HYPRE_IJMatrixCreate ( comm , ilower , iupper , ilower , iupper , ijmatrix_r ef)
A . ijmatrix = ijmatrix_r ef[ ]
# Attach a finalizer
finalizer ( x -> HYPRE_IJMatrixDestroy ( x . IJM atrix) , A )
finalizer ( x -> HYPRE_IJMatrixDestroy ( x . ijm atrix) , A )
# Set storage type
@check HYPRE_IJMatrixSetObjectType ( A . IJM atrix, HYPRE_PARCSR )
@check HYPRE_IJMatrixSetObjectType ( A . ijm atrix, HYPRE_PARCSR )
# Initialize to make ready for setting values
@check HYPRE_IJMatrixInitialize ( A . IJM atrix)
@check HYPRE_IJMatrixInitialize ( A . ijm atrix)
return A
end
@ -76,11 +76,11 @@ end
@@ -76,11 +76,11 @@ end
# This should be called after setting all the values
function Internals . assemble_matrix ( A :: HYPREMatrix )
# Finalize after setting all values
@check HYPRE_IJMatrixAssemble ( A . IJM atrix)
@check HYPRE_IJMatrixAssemble ( A . ijm atrix)
# Fetch the assembled CSR matrix
ParCSRMatrixR ef = Ref { Ptr { Cvoid } } ( C_NULL )
@check HYPRE_IJMatrixGetObject ( A . IJMatrix , ParCSRMatrixR ef)
A . ParCSRM atrix = convert ( Ptr { HYPRE_ParCSRMatrix } , ParCSRMatrixR ef[ ] )
parmatrix_r ef = Ref { Ptr { Cvoid } } ( C_NULL )
@check HYPRE_IJMatrixGetObject ( A . ijmatrix , parmatrix_r ef)
A . parm atrix = convert ( Ptr { HYPRE_ParCSRMatrix } , parmatrix_r ef[ ] )
return A
end
@ -92,39 +92,39 @@ mutable struct HYPREVector # <: AbstractVector{HYPRE_Complex}
@@ -92,39 +92,39 @@ mutable struct HYPREVector # <: AbstractVector{HYPRE_Complex}
#= c o n s t =# comm :: MPI . Comm
#= c o n s t =# ilower :: HYPRE_BigInt
#= c o n s t =# iupper :: HYPRE_BigInt
IJV ector:: HYPRE_IJVector
ParV ector:: HYPRE_ParVector
ijv ector:: HYPRE_IJVector
parv ector:: HYPRE_ParVector
end
function HYPREVector ( comm :: MPI . Comm , ilower :: Integer , iupper :: Integer )
# Create the IJ vector
b = HYPREVector ( comm , ilower , iupper , C_NULL , C_NULL )
b _ref = Ref { HYPRE_IJVector } ( C_NULL )
@check HYPRE_IJVectorCreate ( comm , ilower , iupper , b _ref)
b . IJVector = b _ref[ ]
ijvector _ref = Ref { HYPRE_IJVector } ( C_NULL )
@check HYPRE_IJVectorCreate ( comm , ilower , iupper , ijvector _ref)
b . ijvector = ijvector _ref[ ]
# Attach a finalizer
finalizer ( x -> HYPRE_IJVectorDestroy ( x . IJV ector) , b ) # Set storage type
finalizer ( x -> HYPRE_IJVectorDestroy ( x . ijv ector) , b )
# Set storage type
@check HYPRE_IJVectorSetObjectType ( b . IJV ector, HYPRE_PARCSR )
@check HYPRE_IJVectorSetObjectType ( b . ijv ector, HYPRE_PARCSR )
# Initialize to make ready for setting values
@check HYPRE_IJVectorInitialize ( b . IJV ector)
@check HYPRE_IJVectorInitialize ( b . ijv ector)
return b
end
function Internals . assemble_vector ( b :: HYPREVector )
# Finalize after setting all values
@check HYPRE_IJVectorAssemble ( b . IJV ector)
@check HYPRE_IJVectorAssemble ( b . ijv ector)
# Fetch the assembled vector
par_b _ref = Ref { Ptr { Cvoid } } ( C_NULL )
@check HYPRE_IJVectorGetObject ( b . IJVector , par_b _ref)
b . ParV ector = convert ( Ptr { HYPRE_ParVector } , par_b _ref [ ] )
parvector _ref = Ref { Ptr { Cvoid } } ( C_NULL )
@check HYPRE_IJVectorGetObject ( b . ijvector , parvector _ref)
b . parv ector = convert ( Ptr { HYPRE_ParVector } , parvector _ref [ ] )
return b
end
function Internals . get_proc_rows ( b :: HYPREVector )
# ilower_ref = Ref{HYPRE_BigInt}()
# iupper_ref = Ref{HYPRE_BigInt}()
# @check HYPRE_IJVectorGetLocalRange(b.IJV ector, ilower_ref, iupper_ref)
# @check HYPRE_IJVectorGetLocalRange(b.ijv ector, ilower_ref, iupper_ref)
# ilower = ilower_ref[]
# iupper = iupper_ref[]
# return ilower, iupper
@ -135,8 +135,8 @@ function Internals.get_comm(b::HYPREVector)
@@ -135,8 +135,8 @@ function Internals.get_comm(b::HYPREVector)
# # The MPI communicator is (currently) the first field of the struct:
# # https://github.com/hypre-space/hypre/blob/48de53e675af0e23baf61caa73d89fd9f478f453/src/IJ_mv/IJ_vector.h#L23
# # Fingers crossed this doesn't change!
# @assert b.IJV ector != C_NULL
# comm = unsafe_load(Ptr{MPI.Comm}(b.IJV ector))
# @assert b.ijv ector != C_NULL
# comm = unsafe_load(Ptr{MPI.Comm}(b.ijv ector))
# return comm
return b . comm
end
@ -150,7 +150,7 @@ function Base.zero(b::HYPREVector)
@@ -150,7 +150,7 @@ function Base.zero(b::HYPREVector)
nvalues = jupper - jlower + 1
indices = collect ( HYPRE_BigInt , jlower : jupper )
values = zeros ( HYPRE_Complex , nvalues )
@check HYPRE_IJVectorSetValues ( x . IJV ector, nvalues , indices , values )
@check HYPRE_IJVectorSetValues ( x . ijv ector, nvalues , indices , values )
# Finalize and return
Internals . assemble_vector ( x )
return x
@ -237,7 +237,7 @@ end
@@ -237,7 +237,7 @@ end
function HYPREMatrix ( comm :: MPI . Comm , B :: Union { SparseMatrixCSC , SparseMatrixCSR } , ilower , iupper )
A = HYPREMatrix ( comm , ilower , iupper )
nrows , ncols , rows , cols , values = Internals . to_hypre_data ( B , ilower , iupper )
@check HYPRE_IJMatrixSetValues ( A . IJM atrix, nrows , ncols , rows , cols , values )
@check HYPRE_IJMatrixSetValues ( A . ijm atrix, nrows , ncols , rows , cols , values )
Internals . assemble_matrix ( A )
return A
end
@ -260,7 +260,7 @@ end
@@ -260,7 +260,7 @@ end
function HYPREVector ( comm :: MPI . Comm , x :: Vector , ilower , iupper )
b = HYPREVector ( comm , ilower , iupper )
nvalues , indices , values = Internals . to_hypre_data ( x , ilower , iupper )
@check HYPRE_IJVectorSetValues ( b . IJV ector, nvalues , indices , values )
@check HYPRE_IJVectorSetValues ( b . ijv ector, nvalues , indices , values )
Internals . assemble_vector ( b )
return b
end
@ -276,7 +276,7 @@ function Base.copy!(x::Vector{HYPRE_Complex}, h::HYPREVector)
@@ -276,7 +276,7 @@ function Base.copy!(x::Vector{HYPRE_Complex}, h::HYPREVector)
throw ( ArgumentError ( " different lengths " ) )
end
indices = collect ( HYPRE_BigInt , ilower : iupper )
@check HYPRE_IJVectorGetValues ( h . IJV ector, nvalues , indices , x )
@check HYPRE_IJVectorGetValues ( h . ijv ector, nvalues , indices , x )
return x
end
@ -404,7 +404,7 @@ function HYPREMatrix(B::PSparseMatrix)
@@ -404,7 +404,7 @@ function HYPREMatrix(B::PSparseMatrix)
# Set all the values
map_parts ( B . values , B . rows . partition , B . cols . partition ) do Bv , Br , Bc
nrows , ncols , rows , cols , values = Internals . to_hypre_data ( Bv , Br , Bc )
@check HYPRE_IJMatrixSetValues ( A . IJM atrix, nrows , ncols , rows , cols , values )
@check HYPRE_IJMatrixSetValues ( A . ijm atrix, nrows , ncols , rows , cols , values )
return nothing
end
# Finalize
@ -446,7 +446,7 @@ function HYPREVector(v::PVector)
@@ -446,7 +446,7 @@ function HYPREVector(v::PVector)
# end
# nvalues = length(indices)
@check HYPRE_IJVectorSetValues ( b . IJV ector, nvalues , indices , values )
@check HYPRE_IJVectorSetValues ( b . ijv ector, nvalues , indices , values )
return nothing
end
# Finalize
@ -469,7 +469,7 @@ function Base.copy!(v::PVector{HYPRE_Complex}, h::HYPREVector)
@@ -469,7 +469,7 @@ function Base.copy!(v::PVector{HYPRE_Complex}, h::HYPREVector)
indices = collect ( HYPRE_BigInt , ilower_v_part : iupper_v_part )
# TODO: Safe to use vv here? Owned values are always first?
@check HYPRE_IJVectorGetValues ( h . IJV ector, nvalues , indices , vv )
@check HYPRE_IJVectorGetValues ( h . ijv ector, nvalues , indices , vv )
end
return v
end