<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Jose, </div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
We need both A and Vmat to determine if Wmat= A*Vmat is supported or not.</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<pre lang="c"><span lang="c"><span>MatHasOperation</span><span>(</span><span>A</span><span>,</span><span>MATOP_MAT_MULT</span><span>,</span><span>&</span><span>flg</span><span>); </span></span>//this call is not sufficient to ensure Wmat.</pre>
<pre lang="c">How about replacing 
<span lang="c">  <span>if</span> <span>(</span><span>V</span><span>-></span><span>vmm</span> <span>&&</span> <span>flg</span><span>)</span> <span>{</span></span>
<span lang="c">    <span>ierr</span> <span>=</span> <span>BVGetMat</span><span>(</span><span>V</span><span>,</span><span>&</span><span>Vmat</span><span>);</span><span>CHKERRQ</span><span>(</span><span>ierr</span><span>);</span></span>
<span lang="c">    <span>ierr</span> <span>=</span> <span>BVGetMat</span><span>(</span><span>W</span><span>,</span><span>&</span><span>Wmat</span><span>);</span><span>CHKERRQ</span><span>(</span><span>ierr</span><span>);</span></span>
<span lang="c">    <span>ierr</span> <span>=</span> <span>MatProductCreateWithMat</span><span>(</span><span>A</span><span>,</span><span>Vmat</span><span>,</span><span>NULL</span><span>,</span><span>Wmat</span><span>);</span><span>CHKERRQ</span><span>(</span><span>ierr</span><span>);</span></span>
<span lang="c">    <span>ierr</span> <span>=</span> <span>MatProductSetType</span><span>(</span><span>Wmat</span><span>,</span><span>MATPRODUCT_AB</span><span>);</span><span>CHKERRQ</span><span>(</span><span>ierr</span><span>);</span></span>
<span lang="c">    <span>ierr</span> <span>=</span> <span>MatProductSetFromOptions</span><span>(</span><span>Wmat</span><span>);</span><span>CHKERRQ</span><span>(</span><span>ierr</span><span>);</span></span>
<span lang="c">    <span>ierr</span> <span>=</span> <span>MatProductSymbolic</span><span>(</span><span>Wmat</span><span>);</span><span>CHKERRQ</span><span>(</span><span>ierr</span><span>);</span></span>
<span lang="c">    <span>ierr</span> <span>=</span> <span>MatProductNumeric</span><span>(</span><span>Wmat</span><span>);</span><span>CHKERRQ</span><span>(</span><span>ierr</span><span>);</span></span>
<span lang="c">    <span>ierr</span> <span>=</span> <span>BVRestoreMat</span><span>(</span><span>V</span><span>,</span><span>&</span><span>Vmat</span><span>);</span><span>CHKERRQ</span><span>(</span><span>ierr</span><span>);</span></span>
<span lang="c">    <span>ierr</span> <span>=</span> <span>BVRestoreMat</span><span>(</span><span>W</span><span>,</span><span>&</span><span>Wmat</span><span>);</span><span>CHKERRQ</span><span>(</span><span>ierr</span><span>);</span></span>
<span lang="c">  <span>}</span> <span>else</span> <span>{</span></span>
<span lang="c">    ...</span>
<span lang="c">  <span>}</span></span>
</pre>
<pre lang="c">with</pre>
<pre lang="c"><span lang="c"><span><pre lang="c" style="background-color: rgb(255, 255, 255)"><span lang="c" style="margin: 0px"><span style="margin: 0px">MatProductCreateWithMat</span><span style="margin: 0px">(</span><span style="margin: 0px">A</span><span style="margin: 0px">,</span><span style="margin: 0px">Vmat</span><span style="margin: 0px">,</span><span style="margin: 0px">NULL</span><span style="margin: 0px">,</span><span style="margin: 0px">Wmat</span><span style="margin: 0px">);</span></span>
<span lang="c" style="margin: 0px"><span style="margin: 0px">MatProductSetType</span><span style="margin: 0px">(</span><span style="margin: 0px">Wmat</span><span style="margin: 0px">,</span><span style="margin: 0px">MATPRODUCT_AB</span><span style="margin: 0px">);</span></span></pre><pre lang="c" style="background-color: rgb(255, 255, 255)"><span lang="c" style="margin: 0px"><span style="margin: 0px"><pre lang="c" style="background-color: rgb(255, 255, 255)"><span lang="c" style="margin: 0px"><span style="margin: 0px">MatHasOperation</span><span style="margin: 0px">(</span></span>Wmat,MATOP_MATPRODUCT,&flg); //new support, it calls MatProductSetFromOptions(Wmat)</pre><pre lang="c" style="background-color: rgb(255, 255, 255)">if (V->vmm && flg) {</pre><pre lang="c" style="background-color: rgb(255, 255, 255)">  MatProductSymbolic(Wmat);</pre><pre lang="c" style="background-color: rgb(255, 255, 255)"><pre lang="c" style="background-color: rgb(255, 255, 255)"><span lang="c" style="margin: 0px"><span style="margin: 0px">  MatProductNumeric</span><span style="margin: 0px">(</span><span style="margin: 0px">Wmat</span><span style="margin: 0px">);</span></span></pre><pre lang="c" style="background-color: rgb(255, 255, 255)"><span lang="c" style="margin: 0px"><span style="margin: 0px">} else {</span></span></pre><pre lang="c" style="background-color: rgb(255, 255, 255)"><span lang="c" style="margin: 0px"><span style="margin: 0px">  MatDestroy(</span></span>Wmat);</pre>  ...</pre><pre lang="c" style="background-color: rgb(255, 255, 255)">}</pre>Hong</span></span></pre><br></span></span></pre>
<br>
</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Jose E. Roman <jroman@dsic.upv.es><br>
<b>Sent:</b> Tuesday, April 21, 2020 11:21 AM<br>
<b>To:</b> Pierre Jolivet <pierre.jolivet@enseeiht.fr><br>
<b>Cc:</b> Zhang, Hong <hzhang@mcs.anl.gov>; petsc-dev <petsc-dev@mcs.anl.gov><br>
<b>Subject:</b> Re: [petsc-dev] MATOP_MAT_MULT</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText"><br>
<br>
> El 21 abr 2020, a las 17:53, Pierre Jolivet <pierre.jolivet@enseeiht.fr> escribió:<br>
> <br>
> <br>
> <br>
>> On 21 Apr 2020, at 5:22 PM, Zhang, Hong <hzhang@mcs.anl.gov> wrote:<br>
>> <br>
>> Pierre,<br>
>> MatMatMult_xxx() is removed from MatOps table.<br>
> <br>
> Shouldn’t there be a deprecation notice somewhere?<br>
> There is nothing about MATOP_MAT_MULT in the 3.13 changelog <a href="https://www.mcs.anl.gov/petsc/documentation/changes/313.html">
https://www.mcs.anl.gov/petsc/documentation/changes/313.html</a><br>
> For example, I see that in SLEPc, José is currently making these checks, which are in practice useless as they always return PETSC_FALSE?
<a href="https://gitlab.com/slepc/slepc/-/blob/master/src/sys/classes/bv/impls/contiguous/contig.c#L191">
https://gitlab.com/slepc/slepc/-/blob/master/src/sys/classes/bv/impls/contiguous/contig.c#L191</a><br>
> (Maybe José is aware of this and this is just for testing)<br>
<br>
No, I was not aware of this. Thanks for bringing this up. Now in 3.13 we are always doing the slow version (column by column), so yes I am interested in a solution for this.<br>
<br>
> <br>
>> MatMatMult() is replaced by<br>
>> MatProductCreate()<br>
>> MatProductSetType(,MATPRODUCT_AB)<br>
>> MatProductSetFromOptions()<br>
>> MatProductSymbolic()<br>
>> MatProductNumeric()<br>
>> <br>
>> Where/when do you need query a single matrix for its product operation?<br>
> <br>
> I didn’t want to bother at first with the new API, because I’m only interested in C = A*B with C and B being dense.<br>
> Of course, I can update my code, but if I understand Stefano’s issue correctly, and let’s say my A is of type SBAIJ, for which there is no MatMatMult, the code will now error out in the MatProduct?<br>
> There is no fallback mechanism? Meaning I could in fact _not_ use the new API and will just have to loop on all columns of B, even for AIJ matrices.<br>
> <br>
> Thanks,<br>
> Pierre<br>
> <br>
>> Hong<br>
>> <br>
>> From: petsc-dev <petsc-dev-bounces@mcs.anl.gov> on behalf of Pierre Jolivet <pierre.jolivet@enseeiht.fr><br>
>> Sent: Tuesday, April 21, 2020 7:50 AM<br>
>> To: petsc-dev <petsc-dev@mcs.anl.gov><br>
>> Subject: [petsc-dev] MATOP_MAT_MULT<br>
>>  <br>
>> Hello,<br>
>> Am I seeing this correctly?<br>
>> #include <petsc.h><br>
>> <br>
>> int main(int argc,char **args)<br>
>> {<br>
>>   Mat               A;<br>
>>   PetscBool         hasMatMult;<br>
>>   PetscErrorCode    ierr;<br>
>> <br>
>>   ierr = PetscInitialize(&argc,&args,NULL,NULL);if (ierr) return ierr;<br>
>>   ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr);<br>
>>   ierr = MatSetType(A,MATMPIAIJ);CHKERRQ(ierr);<br>
>>   ierr = MatHasOperation(A,MATOP_MAT_MULT,&hasMatMult);CHKERRQ(ierr);<br>
>>   printf("%s\n", PetscBools[hasMatMult]);<br>
>>   ierr = PetscFinalize();<br>
>>   return ierr;<br>
>> }<br>
>> <br>
>> => FALSE<br>
>> <br>
>> I believe this is a regression (or at least an undocumented change) introduced here:
<a href="https://gitlab.com/petsc/petsc/-/merge_requests/2524/">https://gitlab.com/petsc/petsc/-/merge_requests/2524/</a><br>
>> I also believe Stefano raised a similar point there: <a href="https://gitlab.com/petsc/petsc/-/issues/608">
https://gitlab.com/petsc/petsc/-/issues/608</a><br>
>> This is a performance killer in my case because I was previously using this check to know whether I could use MatMatMult or had to loop on all columns and call MatMult on all of them.<br>
>> There is also a bunch of (previously functioning but now) broken code, e.g., <a href="https://www.mcs.anl.gov/petsc/petsc-current/src/mat/impls/transpose/transm.c.html#line105">
https://www.mcs.anl.gov/petsc/petsc-current/src/mat/impls/transpose/transm.c.html#line105</a> or
<a href="https://www.mcs.anl.gov/petsc/petsc-current/src/mat/impls/nest/matnest.c.html#line2105">
https://www.mcs.anl.gov/petsc/petsc-current/src/mat/impls/nest/matnest.c.html#line2105</a><br>
>> Is this being addressed/documented?<br>
>> <br>
>> Thanks,<br>
>> Pierre<br>
> <br>
<br>
</div>
</span></font></div>
</body>
</html>