Skip to content

Commit

Permalink
[CUSPARSE] Add the structures IC0InfoBSR and ILU0InfoBSR
Browse files Browse the repository at this point in the history
  • Loading branch information
amontoison committed Dec 5, 2023
1 parent 236e11b commit a6033c9
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 33 deletions.
28 changes: 28 additions & 0 deletions lib/cusparse/helpers.jl
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,20 @@ end

Base.unsafe_convert(::Type{csric02Info_t}, info::IC0Info) = info.info

mutable struct IC0InfoBSR
info::bsric02Info_t

function IC0InfoBSR()
info_ref = Ref{bsric02Info_t}()
cusparseCreateBsric02Info(info_ref)
obj = new(info_ref[])
finalizer(cusparseDestroyBsric02Info, obj)
obj
end
end

Base.unsafe_convert(::Type{bsric02Info_t}, info::IC0InfoBSR) = info.info

mutable struct ILU0Info
info::csrilu02Info_t

Expand All @@ -290,3 +304,17 @@ mutable struct ILU0Info
end

Base.unsafe_convert(::Type{csrilu02Info_t}, info::ILU0Info) = info.info

mutable struct ILU0InfoBSR
info::bsrilu02Info_t

function ILU0InfoBSR()
info_ref = Ref{bsrilu02Info_t}()
cusparseCreateBsrilu02Info(info_ref)
obj = new(info_ref[])
finalizer(cusparseDestroyBsrilu02Info, obj)
obj
end
end

Base.unsafe_convert(::Type{bsrilu02Info_t}, info::ILU0InfoBSR) = info.info
58 changes: 25 additions & 33 deletions lib/cusparse/preconditioners.jl
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ for (bname,aname,sname,elty) in ((:cusparseScsric02_bufferSize, :cusparseScsric0
CUSPARSE_SOLVE_POLICY_USE_LEVEL, buffer)
posit = Ref{Cint}(1)
cusparseXcsric02_zeroPivot(handle(), info, posit)
if posit[] 0
if posit[] >= 0
error("Structural/numerical zero in A at ($(posit[]),$(posit[])))")
end
$sname(handle(), m, nnz(A),
Expand Down Expand Up @@ -92,7 +92,7 @@ for (bname,aname,sname,elty) in ((:cusparseScsric02_bufferSize, :cusparseScsric0
CUSPARSE_SOLVE_POLICY_USE_LEVEL, buffer)
posit = Ref{Cint}(1)
cusparseXcsric02_zeroPivot(handle(), info, posit)
if posit[] 0
if posit[] >= 0
error("Structural/numerical zero in A at ($(posit[]),$(posit[])))")
end
$sname(handle(), m, nnz(A),
Expand Down Expand Up @@ -131,7 +131,7 @@ for (bname,aname,sname,elty) in ((:cusparseScsrilu02_bufferSize, :cusparseScsril
CUSPARSE_SOLVE_POLICY_USE_LEVEL, buffer)
posit = Ref{Cint}(1)
cusparseXcsrilu02_zeroPivot(handle(), info, posit)
if posit[] 0
if posit[] >= 0
error("Structural zero in A at ($(posit[]),$(posit[])))")
end
$sname(handle(), m, nnz(A),
Expand Down Expand Up @@ -170,7 +170,7 @@ for (bname,aname,sname,elty) in ((:cusparseScsrilu02_bufferSize, :cusparseScsril
CUSPARSE_SOLVE_POLICY_USE_LEVEL, buffer)
posit = Ref{Cint}(1)
cusparseXcsrilu02_zeroPivot(handle(), info, posit)
if posit[] 0
if posit[] >= 0
error("Structural zero in A at ($(posit[]),$(posit[])))")
end
$sname(handle(), m, nnz(A),
Expand All @@ -195,31 +195,27 @@ for (bname,aname,sname,elty) in ((:cusparseSbsric02_bufferSize, :cusparseSbsric0
throw(DimensionMismatch("A must be square, but has dimensions ($m,$n)!"))
end
mb = div(m,A.blockDim)
info = bsric02Info_t[0]
cusparseCreateBsric02Info(info)
info = IC0InfoBSR()

function bufferSize()
out = Ref{Cint}(1)
$bname(handle(), A.dir, mb, nnz(A), desc,
nonzeros(A), A.rowPtr, A.colVal, A.blockDim, info[1],
out)
$bname(handle(), A.dir, mb, nnz(A), desc, nonzeros(A),
A.rowPtr, A.colVal, A.blockDim, info, out)
return out[]
end
with_workspace(bufferSize) do buffer
$aname(handle(), A.dir, mb, nnz(A), desc,
nonzeros(A), A.rowPtr, A.colVal, A.blockDim, info[1],
CUSPARSE_SOLVE_POLICY_USE_LEVEL, buffer)
posit = Ref{Cint}(1)
cusparseXbsric02_zeroPivot(handle(), info[1], posit)
if posit[] 0
cusparseDestroyBsric02Info(info[1])
error("Structural/numerical zero in A at ($(posit[]),$(posit[])))")
end
$sname(handle(), A.dir, mb, nnz(A), desc,
nonzeros(A), A.rowPtr, A.colVal, A.blockDim, info[1],
CUSPARSE_SOLVE_POLICY_USE_LEVEL, buffer)
$aname(handle(), A.dir, mb, nnz(A), desc,
nonzeros(A), A.rowPtr, A.colVal, A.blockDim, info,
CUSPARSE_SOLVE_POLICY_USE_LEVEL, buffer)
posit = Ref{Cint}(1)
cusparseXbsric02_zeroPivot(handle(), info, posit)
if posit[] >= 0
error("Structural/numerical zero in A at ($(posit[]),$(posit[])))")
end
cusparseDestroyBsric02Info(info[1])
$sname(handle(), A.dir, mb, nnz(A), desc,
nonzeros(A), A.rowPtr, A.colVal, A.blockDim, info,
CUSPARSE_SOLVE_POLICY_USE_LEVEL, buffer)
end
A
end
end
Expand All @@ -238,31 +234,27 @@ for (bname,aname,sname,elty) in ((:cusparseSbsrilu02_bufferSize, :cusparseSbsril
throw(DimensionMismatch("A must be square, but has dimensions ($m,$n)!"))
end
mb = div(m,A.blockDim)
info = bsrilu02Info_t[0]
cusparseCreateBsrilu02Info(info)
info = ILU0InfoBSR()

function bufferSize()
out = Ref{Cint}(1)
$bname(handle(), A.dir, mb, nnz(A), desc,
nonzeros(A), A.rowPtr, A.colVal, A.blockDim, info[1],
out)
$bname(handle(), A.dir, mb, nnz(A), desc, nonzeros(A),
A.rowPtr, A.colVal, A.blockDim, info, out)
return out[]
end
with_workspace(bufferSize) do buffer
$aname(handle(), A.dir, mb, nnz(A), desc,
nonzeros(A), A.rowPtr, A.colVal, A.blockDim, info[1],
nonzeros(A), A.rowPtr, A.colVal, A.blockDim, info,
CUSPARSE_SOLVE_POLICY_USE_LEVEL, buffer)
posit = Ref{Cint}(1)
cusparseXbsrilu02_zeroPivot(handle(), info[1], posit)
if posit[] 0
cusparseDestroyBsrilu02Info(info[1])
cusparseXbsrilu02_zeroPivot(handle(), info, posit)
if posit[] >= 0
error("Structural/numerical zero in A at ($(posit[]),$(posit[])))")
end
$sname(handle(), A.dir, mb, nnz(A), desc,
nonzeros(A), A.rowPtr, A.colVal, A.blockDim, info[1],
nonzeros(A), A.rowPtr, A.colVal, A.blockDim, info,
CUSPARSE_SOLVE_POLICY_USE_LEVEL, buffer)
end
cusparseDestroyBsrilu02Info(info[1])
A
end
end
Expand Down

0 comments on commit a6033c9

Please sign in to comment.