Here is an example that creates a shell matrix with a C struct as a context:
https://www.mcs.anl.gov/petsc/petsc-current/src/mat/tests/ex203.c.html

Or if you use Fortran:
https://www.mcs.anl.gov/petsc/petsc-current/src/mat/tutorials/ex6f.F90.html

Jose


> El 25 jun 2020, a las 8:28, Ernesto Prudencio <[email protected]> escribió:
> 
> I didn't know about this "shell matrix" concept. I will take a look.
> 
> Best,
> 
> Ernesto.
> 
> 
> Schlumberger-Private
> 
> -----Original Message-----
> From: Jose E. Roman [mailto:[email protected]] 
> Sent: Thursday, June 25, 2020 1:26 AM
> To: Ernesto Prudencio <[email protected]>
> Cc: [email protected]
> Subject: Re: [Ext] [petsc-users] Question on SLEPc + computing SVD with a 
> "matrix free" matrix
> 
> Another alternative is to create a shell matrix C with a user context that 
> contains both A and B, then MatMult(C) calls MatMult(A) and 
> MatMultTranspose(C) calls MatMult(B).
> 
> 
>> El 25 jun 2020, a las 8:23, Ernesto Prudencio <[email protected]> escribió:
>> 
>> Thank you, Jose.
>> 
>> However, in the case of a "matrix free" matrix, the APIs on PETSc seem to 
>> allow just the implementation of A.v, not of A' . w
>> 
>> One could create another "matrix free" matrix B which could make the role of 
>> computing z = B . w = A' . w. But how could one force the routine 
>> MatMultTranspose(A, w, z) to call the routine for B? Here I am assuming that 
>> MatMultTranspose(A, w, z) is the routine that SLEPc calls internally in its 
>> algorithms when the user sets for implicit transpose.
>> 
>> I see two possibilities (for brain storming, since I don't know if such 
>> approaches would be acceptable for the PETSc team and/or the SLEPc team):
>> 1) PETSc could add an entry for a second routine that computes [ A' . w ] 
>> when calling MatMFFDSetFunction()
>> 2) SLEPc could add an entry for the routine for computing [ A' . w ] when 
>> the matrix A is "matrix free"
>> 
>> Thanks again,
>> 
>> Ernesto.
>> 
>> 
>> Schlumberger-Private
>> 
>> -----Original Message-----
>> From: Jose E. Roman [mailto:[email protected]] 
>> Sent: Thursday, June 25, 2020 1:01 AM
>> To: Ernesto Prudencio <[email protected]>
>> Cc: [email protected]
>> Subject: [Ext] Re: [petsc-users] Question on SLEPc + computing SVD with a 
>> "matrix free" matrix
>> 
>> Yes, you have to set it with SVDSetImplicitTranspose(), but then the 
>> matrix-free matrix should implement both "A.v" and "A'.v" operations.
>> Jose
>> 
>> 
>>> El 24 jun 2020, a las 23:25, Ernesto Prudencio via petsc-users 
>>> <[email protected]> escribió:
>>> 
>>> Hi,
>>> 
>>> Is it possible to compute a SVD for a “matrix free” matrix?
>>> 
>>> At first, it seems it would be ok with a MatCreateMFFD() and 
>>> MatMFFDSetFunction(), because one could then provide the routine that 
>>> computes “A . v” for any given v, which is an operation needed by SLEPc. 
>>> However, one would also need to set up the SVD object in SLEPc with an 
>>> implicit transpose. Would that be possible?
>>> 
>>> Thanks in advance,
>>> 
>>> Ernesto.
>>> 
>>> Schlumberger-Private

Reply via email to