@@ -32,11 +32,13 @@ function LinearSolve.init_cacheval(alg::PardisoJL,
32
32
vendor= :MKL
33
33
end
34
34
end
35
-
35
+
36
+ transposed_iparm = 1
36
37
solver = if vendor == :MKL
37
38
solver = if Pardiso. mkl_is_available ()
38
39
solver = Pardiso. MKLPardisoSolver ()
39
40
nprocs != = nothing && Pardiso. set_nprocs! (solver, nprocs)
41
+ transposed_iparm = 2 # see https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2024-0/pardiso-iparm-parameter.html#IPARM37
40
42
41
43
solver
42
44
else
@@ -84,7 +86,7 @@ function LinearSolve.init_cacheval(alg::PardisoJL,
84
86
end
85
87
86
88
# Make sure to say it's transposed because its CSC not CSR
87
- Pardiso. set_iparm! (solver, 12 , 1 )
89
+ Pardiso. set_iparm! (solver, 12 , transposed_iparm )
88
90
89
91
#=
90
92
Note: It is recommended to use IPARM(11)=1 (scaling) and IPARM(13)=1 (matchings) for
@@ -107,12 +109,12 @@ function LinearSolve.init_cacheval(alg::PardisoJL,
107
109
# applies these exact factors L and U for the next steps in a
108
110
# preconditioned Krylov-Subspace iteration. If the iteration does not
109
111
# converge, the solver will automatically switch back to the numerical factorization.
110
- Pardiso. set_iparm! (solver, 3 , round (Int, abs (log10 (reltol)), RoundDown) * 10 + 1 )
112
+ Pardiso. set_iparm! (solver, 4 , round (Int, abs (log10 (reltol)), RoundDown) * 10 + 1 )
111
113
end
112
114
113
115
Pardiso. pardiso (solver,
114
- u,
115
- SparseMatrixCSC (size (A)... , getcolptr (A), rowvals (A), nonzeros (A)),
116
+ u,
117
+ SparseMatrixCSC (size (A)... , getcolptr (A), rowvals (A), nonzeros (A)),
116
118
b)
117
119
118
120
return solver
121
123
function SciMLBase. solve! (cache:: LinearSolve.LinearCache , alg:: PardisoJL ; kwargs... )
122
124
@unpack A, b, u = cache
123
125
A = convert (AbstractMatrix, A)
124
-
125
126
if cache. isfresh
126
127
Pardiso. set_phase! (cache. cacheval, Pardiso. NUM_FACT)
127
128
Pardiso. pardiso (cache. cacheval, A, eltype (A)[])
@@ -130,6 +131,7 @@ function SciMLBase.solve!(cache::LinearSolve.LinearCache, alg::PardisoJL; kwargs
130
131
131
132
Pardiso. set_phase! (cache. cacheval, Pardiso. SOLVE_ITERATIVE_REFINE)
132
133
Pardiso. pardiso (cache. cacheval, u, A, b)
134
+
133
135
return SciMLBase. build_linear_solution (alg, cache. u, nothing , cache)
134
136
end
135
137
0 commit comments