@@ -297,3 +297,63 @@ function SciMLBase.solve(cache::LinearCache, alg::IterativeSolversJL; kwargs...)
297297
298298 return cache. u
299299end
300+
301+ # # Paradiso
302+
303+ struct PardisoJL{F,S,P,A,K} <: SciMLLinearSolveAlgorithm
304+ alg_selector:: F
305+ schur:: S
306+ parallel:: P
307+ args:: A
308+ kwargs:: K
309+ end
310+
311+ function PardisoJL (args... ; alg_selector= :default_alg ,
312+ schur= :smart ,
313+ parallel= :fancy ,
314+ kwargs... )
315+
316+ return PardisoJL (alg_selector, schur, parallel,
317+ args, kwargs)
318+ end
319+
320+ PardisoJL_Default (args... ; kwargs... ) = PardisoJL (args... ;
321+ alg_selector= :this_one ,
322+ kwargs... )
323+
324+ function init_cacheval (alg:: PardisoJL , cache:: LinearCache )
325+
326+ solver =
327+ if alg. alg_selector == :default_alg
328+ MKLPardisoSolver ()
329+ elseif alg_selector == :this_one
330+ PardisoSolver ()
331+ else
332+ PardisoSolver ()
333+ end
334+
335+ alg. verbose && set_msglvl! (solver, Pardiso. MESSAGE_LEVEL_ON)
336+
337+ return solver
338+ end
339+
340+ function SciMLBase. solve (cache:: LinearCache , alg:: PardisoJL ; kwargs... )
341+ @unpack cacheval, A, b, u = cache
342+
343+ if cache. isfresh
344+ solver = init_cacheval (alg, cache)
345+ cache = set_cacheval (cache, solver)
346+ end
347+
348+ abstol = cache. abstol
349+ reltol = cache. reltol
350+ verbose = cache. verbose
351+
352+ kwargs = (abstol= abstol, reltol= reltol,
353+ alg. kwargs... )
354+
355+ Pardiso. solve! (cacheval, u, A, b)
356+
357+ return cache. u
358+ end
359+
0 commit comments