[petsc-dev] [petsc-users] How to compute RARt with A and R as distributed (MPI) matrices ?

Stefano Zampini stefano.zampini at gmail.com
Fri Jun 23 07:13:05 CDT 2017

> On Jun 23, 2017, at 10:10 AM, Franck Houssen <franck.houssen at inria.fr> wrote:
> By the way, I noticed this is exactly the same for MatRARt/PtAPNumeric/Symbolic: pages of the documentation are identical, so the user can not understand why to use the RARt or the PtAP.

MatRARt computes: R * A * R^T
MatPtAP computes: P^t * A * P

they perform different operations

> I believe adding a short note in MatRARt/PtAP pages and MatRARt/PtAPNumeric/Symbolic would be welcome to say "this method is meant to do/support this but not that”.

An operation like RARt (or PtAP) may have a specialized implementation, or be available though composition of operatotions, i.e. PtAP = P^t * (A * P) or compute transpose of P (explicitly) and then call the triple matrix product.
It’s not possible to keep track of all the possible cases.


> Franck
> ----- Mail original -----
>> De: "Jed Brown" <jed at jedbrown.org>
>> À: "Hong" <hzhang at mcs.anl.gov>
>> Cc: "petsc-dev" <petsc-dev at mcs.anl.gov>, "PETSc users list" <petsc-users at mcs.anl.gov>
>> Envoyé: Jeudi 22 Juin 2017 18:17:33
>> Objet: Re: [petsc-dev] [petsc-users] How to compute RARt with A and R as	distributed (MPI) matrices ?
>> Hong <hzhang at mcs.anl.gov> writes:
>>> Jed:
>>>>>> Is it better this way or as a fallback when !A->ops->rart?  MatPtAP
>>>>>> handles other combinations like MAIJ.
>>>>> Do you mean
>>>>> if ( !A->ops->rart) {
>>>>>    Mat Rt;
>>>>>    ierr = MatTranspose(R,MAT_INITIAL_MATRIX,&Rt);CHKERRQ(ierr);
>>>>>    ierr = MatMatMatMult(R,A,Rt,scall,fill,C);CHKERRQ(ierr);
>>>>>    ierr = MatDestroy(&Rt);CHKERRQ(ierr);
>>>>> }
>>>>> This does NOT work for most matrix formats because we do not have
>>>> fallbacks
>>>>> for MatTranspose() and MatMatMult().
>>>> That's fine; they'll trigger an error and we'll be able to see from the
>>>> stack that it can be made to work by either implementing the appropriate
>>>> MatRARt or MatTranspose and MatMatMatMult.
>>> You prefer adding this default, even though it gives error in either
>>> MatTranspose() or MatMatMatMult() depends on input matrix format?
>> Yeah, in the sense that it gives more opportunities to succeed.
>>> If so, we need add this type of 'default' to all mat operations --
>>> currently, all routines do
>>> if (!mat->ops-> )
>>> SETERRQ1(PetscObjectComm((PetscObject)mat),PETSC_ERR_SUP,"Mat type
>>> %s",((PetscObject)mat)->type_name);
>> Probably.

More information about the petsc-dev mailing list