<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">Jed:<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail-">
>> Is it better this way or as a fallback when !A->ops->rart?  MatPtAP<br>
>> handles other combinations like MAIJ.<br>
>><br>
><br>
> Do you mean<br>
> if ( !A->ops->rart) {<br>
>     Mat Rt;<br>
>     ierr = MatTranspose(R,MAT_INITIAL_<wbr>MATRIX,&Rt);CHKERRQ(ierr);<br>
>     ierr = MatMatMatMult(R,A,Rt,scall,<wbr>fill,C);CHKERRQ(ierr);<br>
>     ierr = MatDestroy(&Rt);CHKERRQ(ierr);<br>
> }<br>
> This does NOT work for most matrix formats because we do not have fallbacks<br>
> for MatTranspose() and MatMatMult().<br>
<br>
</span>That's fine; they'll trigger an error and we'll be able to see from the<br>
stack that it can be made to work by either implementing the appropriate<br>
MatRARt or MatTranspose and MatMatMatMult.<br></blockquote><div><br></div><div>You prefer adding this default, even though it gives error in either  MatTranspose() or MatMatMatMult() depends on input matrix format?</div><div><br></div><div>If so, we need add this type of 'default' to all mat operations -- currently, all routines do</div><div>if (!mat->ops-> ) SETERRQ1(PetscObjectComm((PetscObject)mat),PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name);<br></div><div><br></div><div>Hong</div><div><br></div><div><br></div></div><br></div></div>