Browse Source

Hotfix IndexSet compat with MPI backend in PartitionedArrays.

pull/4/head
termi-official 3 years ago
parent
commit
4a029c7de9
  1. 47
      src/HYPRE.jl

47
src/HYPRE.jl

@ -305,11 +305,14 @@ end
################################################## ##################################################
# TODO: This has some duplicated code with to_hypre_data(::SparseMatrixCSC, ilower, iupper) # TODO: This has some duplicated code with to_hypre_data(::SparseMatrixCSC, ilower, iupper)
function Internals.to_hypre_data(A::SparseMatrixCSC, r::IndexRange, c::IndexRange) function Internals.to_hypre_data(A::SparseMatrixCSC, r::PartitionedArrays.AbstractIndexSet, c::PartitionedArrays.AbstractIndexSet)
@assert r.oid_to_lid isa UnitRange && r.oid_to_lid.start == 1 # @assert r.oid_to_lid isa UnitRange && r.oid_to_lid.start == 1
ilower = r.lid_to_gid[r.oid_to_lid.start] lidlower = minimum(r.oid_to_lid)
iupper = r.lid_to_gid[r.oid_to_lid.stop] lidupper = maximum(r.oid_to_lid)
ilower = r.lid_to_gid[lidlower]
iupper = r.lid_to_gid[lidupper]
a_rows = rowvals(A) a_rows = rowvals(A)
a_vals = nonzeros(A) a_vals = nonzeros(A)
@ -327,7 +330,7 @@ function Internals.to_hypre_data(A::SparseMatrixCSC, r::IndexRange, c::IndexRang
@inbounds for j in 1:size(A, 2) @inbounds for j in 1:size(A, 2)
for i in nzrange(A, j) for i in nzrange(A, j)
row = a_rows[i] row = a_rows[i]
row > r.oid_to_lid.stop && continue # Skip ghost rows row > lidupper && continue # Skip ghost rows
# grow = r.lid_to_gid[lrow] # grow = r.lid_to_gid[lrow]
ncols[row] += 1 ncols[row] += 1
end end
@ -347,7 +350,7 @@ function Internals.to_hypre_data(A::SparseMatrixCSC, r::IndexRange, c::IndexRang
@inbounds for j in 1:size(A, 2) @inbounds for j in 1:size(A, 2)
for i in nzrange(A, j) for i in nzrange(A, j)
row = a_rows[i] row = a_rows[i]
row > r.oid_to_lid.stop && continue # Skip ghost rows row > lidupper && continue # Skip ghost rows
k = lastinds[row] += 1 k = lastinds[row] += 1
val = a_vals[i] val = a_vals[i]
cols[k] = c.lid_to_gid[j] cols[k] = c.lid_to_gid[j]
@ -361,13 +364,16 @@ end
# At least values should be possible to directly share, but cols needs to translated # At least values should be possible to directly share, but cols needs to translated
# to global ids. # to global ids.
function Internals.to_hypre_data(A::SparseMatrixCSR, r::IndexRange, c::IndexRange) function Internals.to_hypre_data(A::SparseMatrixCSR, r::IndexRange, c::IndexRange)
@assert r.oid_to_lid isa UnitRange && r.oid_to_lid.start == 1 #@assert r.oid_to_lid isa UnitRange && r.oid_to_lid.start == 1
lidlower = minimum(r.oid_to_lid)
lidupper = maximum(r.oid_to_lid)
ilower = r.lid_to_gid[r.oid_to_lid.start] ilower = r.lid_to_gid[lidlower]
iupper = r.lid_to_gid[r.oid_to_lid.stop] iupper = r.lid_to_gid[lidupper]
a_cols = colvals(A) a_cols = colvals(A)
a_vals = nonzeros(A) a_vals = nonzeros(A)
nnz = getrowptr(A)[r.oid_to_lid.stop + 1] - 1 nnz = getrowptr(A)[lidupper + 1] - 1
# Initialize the data buffers HYPRE wants # Initialize the data buffers HYPRE wants
nrows = HYPRE_Int(iupper - ilower + 1) # Total number of rows nrows = HYPRE_Int(iupper - ilower + 1) # Total number of rows
@ -445,8 +451,11 @@ function HYPREVector(v::PVector)
b = HYPREVector(comm, ilower, iupper) b = HYPREVector(comm, ilower, iupper)
# Set all the values # Set all the values
map_parts(v.values, v.owned_values, v.rows.partition) do _, vo, vr map_parts(v.values, v.owned_values, v.rows.partition) do _, vo, vr
ilower_part = vr.lid_to_gid[vr.oid_to_lid.start] lidlower = minimum(vr.oid_to_lid)
iupper_part = vr.lid_to_gid[vr.oid_to_lid.stop] lidupper = maximum(vr.oid_to_lid)
ilower_part = vr.lid_to_gid[lidlower]
iupper_part = vr.lid_to_gid[lidupper]
# Option 1: Set all values # Option 1: Set all values
nvalues = HYPRE_Int(iupper_part - ilower_part + 1) nvalues = HYPRE_Int(iupper_part - ilower_part + 1)
@ -489,8 +498,11 @@ end
function Base.copy!(dst::PVector{HYPRE_Complex}, src::HYPREVector) function Base.copy!(dst::PVector{HYPRE_Complex}, src::HYPREVector)
Internals.copy_check(src, dst) Internals.copy_check(src, dst)
map_parts(dst.values, dst.owned_values, dst.rows.partition) do vv, _, vr map_parts(dst.values, dst.owned_values, dst.rows.partition) do vv, _, vr
il_src_part = vr.lid_to_gid[vr.oid_to_lid.start] lidlower = minimum(vr.oid_to_lid)
iu_src_part = vr.lid_to_gid[vr.oid_to_lid.stop] lidupper = maximum(vr.oid_to_lid)
il_src_part = vr.lid_to_gid[lidlower]
iu_src_part = vr.lid_to_gid[lidupper]
nvalues = HYPRE_Int(iu_src_part - il_src_part + 1) nvalues = HYPRE_Int(iu_src_part - il_src_part + 1)
indices = collect(HYPRE_BigInt, il_src_part:iu_src_part) indices = collect(HYPRE_BigInt, il_src_part:iu_src_part)
@ -510,8 +522,11 @@ function Base.copy!(dst::HYPREVector, src::PVector{HYPRE_Complex})
# Re-initialize the vector # Re-initialize the vector
@check HYPRE_IJVectorInitialize(dst.ijvector) @check HYPRE_IJVectorInitialize(dst.ijvector)
map_parts(src.values, src.owned_values, src.rows.partition) do vv, _, vr map_parts(src.values, src.owned_values, src.rows.partition) do vv, _, vr
ilower_src_part = vr.lid_to_gid[vr.oid_to_lid.start] lidlower = minimum(vr.oid_to_lid)
iupper_src_part = vr.lid_to_gid[vr.oid_to_lid.stop] lidupper = maximum(vr.oid_to_lid)
ilower_src_part = vr.lid_to_gid[lidlower]
iupper_src_part = vr.lid_to_gid[lidupper]
nvalues = HYPRE_Int(iupper_src_part - ilower_src_part + 1) nvalues = HYPRE_Int(iupper_src_part - ilower_src_part + 1)
indices = collect(HYPRE_BigInt, ilower_src_part:iupper_src_part) indices = collect(HYPRE_BigInt, ilower_src_part:iupper_src_part)
# TODO: Safe to use vv here? Owned values are always first? # TODO: Safe to use vv here? Owned values are always first?

Loading…
Cancel
Save