Intel® oneAPI Math Kernel Library
Ask questions and share information with other developers who use Intel® Math Kernel Library.
6875 Discussions

## factorization usage from another context

Beginner
321 Views

Dear all,

I would like to use the linear solver PARDISO as the linear solver in my custom Lanczos eigenvalue solver.This is certainly possible and then, I would like to use this factorized matrix in some other context. As an example scenario to keep things simple, say I have a LAnczos routine to solve the eigenvalue problem where I use A and B matrices, for the generalized eigenvalue problem, as inputs to the Lanczos solver, if I do a solve inside this routine by taking a reference to A, how may I use these factors outside the routine is there a way to accomplish this task? I would like to use the factorization information from these eigensolver in another context, but what would be the best stragety for this task?

Umut

9 Replies
New Contributor I
321 Views

Dear Umit,

PARDISO doesnt provide LU or LDL^t factors. But you can solve system separately. To solve Ly=b you should use phase=331; to solve Ux=y please use phase=333. If you have symmetric positive indefinite system, i.e. LDL^tx=b, so you can solve Lz=b (phase=331), Dy=z (phase=332) and L^tx=z (phase=333).

What type of system do you have? (Symmetric or unsymmetric, positive definite or indefinite, real or complex). And what operations do you want to do with it? If you have symmetric indefinite system, is it enough to get the diagonal elements or just number of positive and negative elements?

Sergey S.

Beginner
321 Views
What I would like to do is to use the factors, L U, in a Conjugate Gradient context as my preconditioner so in MATLAB sense

U \ ( L \ b)

if you are familiar. I do not have to get them in factored for LU.

In mathematical sense I would like to solve a linear system in another but the operator matrix is the same as the above and these factors might help.

However as far as I could understand PARDISO does not give me the chance to use these factors outside of a solution process, are not there any options to keep the factors in memory for later use, this is what I am looking for?

Best,
Umut

New Contributor I
321 Views
To factorize matrix M (M=LU), you can use PARDISO. LU factors and other info are stored in internal PARDISO structures. Pointers to these structures are stored in PARDISO handle h(1,,64). So, if you want to solve Ly=b or Ux=y in another routine, you should to use PARDISO with current handle inside this routine. Unfortunately, PARDISO doesnt have possibility of handle dumping to hard disc. So, you cannot stop the task and restart it with old handle (with old LU factors). Anyway, we have such feature request (store/restore PARDISO handle).

Best regards,
Sergey S.
Beginner
321 Views

++ To factorize matrix M (M=LU), you can use PARDISO. LU factors and other info are stored in internal PARDISO structures. Pointers to these structures are stored in PARDISO handle h(1,,64).

Is this possible to return these handles by reference in another context, if yes could you please point me to an example?

And

++So, if you want to solve Ly=b or Ux=y in another routine, you should to use PARDISO with current handle inside this routine.

This sentence is not clear to me basically __ in another routine ___ and __ use PARDISO with current handle inside this routine __ what do you mean with these two, could you please make that more clear with an example perhaps, that would really help then, because I am stilll not clear on whether this is possible or not?

Best regards,
Umut
New Contributor I
321 Views

Could you clarify, what do you mean when say another context?
I prepared the simple example. I hope it will help:

programtest
INTEGER*8 pt(64)

call routine_1(pt,.) ! reordering and factorizing in routine_1

do =1,n ! some iterative process
...
call routine_2(pt,.) ! solvingphasein routine_3
enddo
end

subroutine routine_1(pt,.)
INTEGER*8 pt(*)

phase=11
call pardiso(pt,)

phase=22
call pardiso(pt,)
return
end

subroutine routine_2(pt,.)
INTEGER*8 pt(*)

phase=33
call pardiso(pt,)
return
end

Best regards,
Sergey S

Beginner
321 Views
Sure,

Ax = b

Solve for x in a routine and use the factrized A in another routine

routine_1(A, b0, x, factorA)
solve for x
store factorA // this is my question
return the factor from the function

use that in another function, as such

routine_2(factorA, b1, x)
using the factorA from the first routine solve for x for a different right hand side

I hope it is clear now.

New Contributor I
321 Views

Ok, I see. I have an additional remark:

It is possible to use factorizing and solving in the same program (test1.exe):
Program test1
routine_1(A, b0, x, factorA) ! factorizing
routine_2(factorA, b1, x) ! solving
end program test1

It isnt possible to use factorizing and solving in the different programs (test1.exe and test2.exe):
Program test1
routine_1(A, b0, x, factorA) ! factorizing
end program test1
Program test2
routine_2(factorA, b1, x) ! solving
end program test1

It isnt possible because store factorA (to hard disk) isnt implemented yet. We have such feature request. If you provide us with info about you, weadd this info into our request.

Beginner
321 Views

My name is Umut Tabak, I am a Phd researcher at Delft University of Technology in the Netherlands. I conduct on research on model reduction for multiphysical problems. I am developing an in-house code to test industrial benchmark problems where Phillips is also interested in order to analyze their MRI scanner models with this code, not now but in the near future, hopefully, so Intel MKL will be tested on challenging engineering design problems.

Is this information enough to be able to add this important but missing information/feature to PARDISO?

Best regards,
Umut
New Contributor I
321 Views
Ok, thank you,