[petsc-users] wrap MATMPIAIJ in MatShellSetOperation and use in SLEPc
Jose E. Roman
jroman at dsic.upv.es
Mon Oct 13 12:27:22 CDT 2014
El 13/10/2014, a las 19:16, Denis Davydov escribió:
> Dear all,
>
> I am solving a generalised eigenvalue problem
>
> S \cdot v = a M \cdot v (1)
>
> using Krylov-Schur eigensolver with the shift-and-invert transformation.
> Now I would like to expand the problem to the case
>
> [S + c^\ast \otimes c ] \cdot v = a M \cdot v (2),
>
> where “c” is some vector.
>
> As a first step, I was trying to “wrap" MATMPIAIJ matrix in the MatCreateShell() matrix
> with MatShellSetOperation() which then does multiplication.
> So far I do not add any action due to “c” (e.g. c = 0), but only aim to workout how to approach the problem.
> Unfortunately, when I use shift-and-invert, i hit some errors (below).
> In another test problem without shift-and-invert, it seems to be working fine (I am still testing).
> Supposedly, the user-defined matrices are not supported in full in SLEPc and the error is triggered.
> I am quite sure it is related to the usage shift-and-invert, but I don’t know implementation details to tell why is it the case.
>
> Is there any other way I could consider the problem (2) within SLEPc with shift-and-invert or
> do some additional tricks to make it work within MatCreateShell()?
>
> p.s. this problem arises from the density functional theory with non-local pseudo-potentials, S is hermitian.
>
> Kind regards,
> Denis
>
This case is discussed in section 3.4.2 of SLEPc's users guide. Basically, the default behaviour in shift-and-invert is that SLEPc builds matrix C=A-sigma*B (where sigma is the shift). In this case, the "A" matrix (the shell matrix in your case) needs two additional operations: duplicate and AXPY. You could implement these two operations in your shell matrix. You can also try with "-st_matmode inplace" in which case only AXPY is required. But probably what you want is to set "-st_matmode shell" so that you do not need any additional operation; the downside in all cases is that direct linear solves cannot be used and you must be cautious when using shift-and-invert with iterative linear solvers (see discussion at section 3.4.1).
Jose
More information about the petsc-users
mailing list