64
64
Base. showerror (io:: IO , e:: Union{PardisoException,PardisoPosDefException} ) = print (io, e. info);
65
65
66
66
67
- const PardisoNumTypes = Union{Float64,ComplexF64}
67
+ const PardisoNumTypes = Union{Float32, ComplexF32, Float64, ComplexF64}
68
68
69
69
abstract type AbstractPardisoSolver end
70
70
@@ -173,7 +173,7 @@ function __init__()
173
173
end
174
174
end
175
175
include (" enums.jl" )
176
- include (" project_pardiso .jl" )
176
+ include (" panua_pardiso .jl" )
177
177
include (" mkl_pardiso.jl" )
178
178
179
179
# Getters and setters
218
218
219
219
function solve (ps:: AbstractPardisoSolver , A:: SparseMatrixCSC{Tv,Ti} ,
220
220
B:: StridedVecOrMat{Tv} , T:: Symbol = :N ) where {Ti, Tv <: PardisoNumTypes }
221
- X = copy (B)
222
- solve! (ps, X, A, B, T)
223
- return X
221
+ X = copy (B)
222
+ solve! (ps, X, A, B, T)
223
+ return X
224
224
end
225
225
226
226
function fix_iparm! (ps:: AbstractPardisoSolver , T:: Symbol )
244
244
function solve! (ps:: AbstractPardisoSolver , X:: StridedVecOrMat{Tv} ,
245
245
A:: SparseMatrixCSC{Tv,Ti} , B:: StridedVecOrMat{Tv} ,
246
246
T:: Symbol = :N ) where {Ti, Tv <: PardisoNumTypes }
247
+ LinearAlgebra. checksquare (A)
247
248
set_phase! (ps, ANALYSIS_NUM_FACT_SOLVE_REFINE)
248
249
249
250
# This is the heuristics for choosing what matrix type to use
@@ -253,9 +254,10 @@ function solve!(ps::AbstractPardisoSolver, X::StridedVecOrMat{Tv},
253
254
# - If complex and symmetric, solve with symmetric complex solver
254
255
# - Else solve as unsymmetric.
255
256
if ishermitian (A)
256
- eltype (A) == Float64 ? set_matrixtype! (ps, REAL_SYM_POSDEF) : set_matrixtype! (ps, COMPLEX_HERM_POSDEF)
257
+ eltype (A) <: Union{Float32, Float64} ? set_matrixtype! (ps, REAL_SYM_POSDEF) : set_matrixtype! (ps, COMPLEX_HERM_POSDEF)
257
258
pardisoinit (ps)
258
259
fix_iparm! (ps, T)
260
+ eltype (A) <: Union{Float32, ComplexF32} ? set_iparm! (ps, 28 , 1 ) : nothing
259
261
try
260
262
pardiso (ps, X, get_matrix (ps, A, T), B)
261
263
catch e
@@ -265,20 +267,23 @@ function solve!(ps::AbstractPardisoSolver, X::StridedVecOrMat{Tv},
265
267
if ! isa (e, PardisoPosDefException)
266
268
rethrow ()
267
269
end
268
- eltype (A) == Float64 ? set_matrixtype! (ps, REAL_SYM_INDEF) : set_matrixtype! (ps, COMPLEX_HERM_INDEF)
270
+ eltype (A) <: Union{Float32, Float64} ? set_matrixtype! (ps, REAL_SYM_INDEF) : set_matrixtype! (ps, COMPLEX_HERM_INDEF)
269
271
pardisoinit (ps)
270
272
fix_iparm! (ps, T)
273
+ eltype (A) <: Union{Float32, ComplexF32} ? set_iparm! (ps, 28 , 1 ) : nothing
271
274
pardiso (ps, X, get_matrix (ps, A, T), B)
272
275
end
273
276
elseif issymmetric (A)
274
277
set_matrixtype! (ps, COMPLEX_SYM)
275
278
pardisoinit (ps)
276
279
fix_iparm! (ps, T)
280
+ eltype (A) <: Union{Float32, ComplexF32} ? set_iparm! (ps, 28 , 1 ) : nothing
277
281
pardiso (ps, X, get_matrix (ps, A, T), B)
278
282
else
279
- eltype (A) == Float64 ? set_matrixtype! (ps, REAL_NONSYM) : set_matrixtype! (ps, COMPLEX_NONSYM)
283
+ eltype (A) <: Union{Float32, Float64} ? set_matrixtype! (ps, REAL_NONSYM) : set_matrixtype! (ps, COMPLEX_NONSYM)
280
284
pardisoinit (ps)
281
285
fix_iparm! (ps, T)
286
+ eltype (A) <: Union{Float32, ComplexF32} ? set_iparm! (ps, 28 , 1 ) : nothing
282
287
pardiso (ps, X, get_matrix (ps, A, T), B)
283
288
end
284
289
@@ -333,6 +338,11 @@ function pardiso(ps::AbstractPardisoSolver, X::StridedVecOrMat{Tv}, A::SparseMat
333
338
" has a complex matrix type set: $(get_matrixtype (ps)) " )))
334
339
end
335
340
341
+ if Tv <: Union{Float32, ComplexF32} && typeof (ps) <: MKLPardisoSolver && ps. iparm[28 ] != 1
342
+ throw (ErrorException (string (" input matrix is Float32/ComplexF32 while MKLPardisoSolver " ,
343
+ " have iparm[28]=$(ps. iparm[28 ]) rather than 1." )))
344
+ end
345
+
336
346
N = size (A, 2 )
337
347
338
348
resize! (ps. perm, size (B, 1 ))
@@ -435,6 +445,7 @@ function pardisogetschur(ps::AbstractPardisoSolver)
435
445
end
436
446
437
447
function dim_check (X, A, B)
448
+ LinearAlgebra. checksquare (A)
438
449
size (X) == size (B) || throw (DimensionMismatch (string (" solution has $(size (X)) , " ,
439
450
" RHS has size as $(size (B)) ." )))
440
451
size (A, 1 ) == size (B, 1 ) || throw (DimensionMismatch (string (" matrix has $(size (A,1 )) " ,
0 commit comments