@@ -9,6 +9,23 @@ mutable struct PardisoLU{Tv, Ti} <: AbstractExtendableSparseLU{Tv,Ti}
99 phash:: UInt64
1010end
1111
12+
13+ function Pardiso. set_matrixtype! (ps, A:: ExtendableSparseMatrix )
14+ Acsc= A. cscmatrix
15+
16+ if eltype (Acsc)== Float64 && issymmetric (Acsc)
17+ Pardiso. set_matrixtype! (ps, Pardiso. REAL_SYM)
18+ elseif eltype (Acsc)== Float64
19+ Pardiso. set_matrixtype! (ps, Pardiso. REAL_NONSYM)
20+ elseif eltype (Acsc)== Complex64 && ishermitian (Acsc)
21+ Pardiso. set_matrixtype! (ps, Pardiso. COMPLEX_HERM_INDEF)
22+ elseif eltype (Acsc)== Complex64
23+ Pardiso. set_matrixtype! (ps, Pardiso. COMPLEX_NONYSYM)
24+ else
25+ error (" unable to detect matrix type" )
26+ end
27+ end
28+
1229"""
1330```
1431PardisoLU(A; ps=Pardiso.MKLPardisoSolver)
@@ -17,8 +34,8 @@ PardisoLU(A; ps=Pardiso.MKLPardisoSolver)
1734function PardisoLU (A:: ExtendableSparseMatrix{Tv,Ti} ;ps:: Pardiso.AbstractPardisoSolver = Pardiso. MKLPardisoSolver ()) where {Tv,Ti}
1835 @inbounds flush! (A)
1936 Acsc= A. cscmatrix
20- eltype (Acsc) == Float64 ? Pardiso. set_matrixtype! (ps, Pardiso. REAL_NONSYM) : Pardiso. set_matrixtype! (ps, Pardiso. COMPLEX_NONSYM)
2137 Pardiso. pardisoinit (ps)
38+ Pardiso. set_matrixtype! (ps,A)
2239 Pardiso. fix_iparm! (ps, :N )
2340 Pardiso. set_phase! (ps, Pardiso. ANALYSIS_NUM_FACT)
2441 Pardiso. pardiso (ps, Tv[], Acsc, Tv[])
@@ -32,6 +49,7 @@ function update!(lufact::PardisoLU{Tv,Ti}) where {Tv, Ti}
3249 if lufact. phash!= lufact. A. phash
3350 Pardiso. set_phase! (ps, Pardiso. RELEASE_ALL)
3451 Pardiso. pardiso (ps, Tv[], Acsc, Tv[])
52+ Pardiso. set_matrixtype! (ps,lufact. A)
3553 Pardiso. set_phase! (ps, Pardiso. ANALYSIS_NUM_FACT)
3654 lufact. phash= lufact. A. phash
3755 else
0 commit comments