<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">Yaoyu :</div><div class="gmail_quote">Thanks for sending me your code and matrices. I tested it and found the answer.</div><div class="gmail_quote"><br></div><div class="gmail_quote">When ISs are created with</div><div class="gmail_quote">#define MY_COMMUNICATOR (PETSC_COMM_WORLD)</div><div class="gmail_quote">the parallel subMatrixIS_Row is stored as (ISView() shows it)</div><div class="gmail_quote"><br></div><div class="gmail_quote"><div class="gmail_quote">IS Object: 2 MPI processes</div><div class="gmail_quote">  type: general</div><div class="gmail_quote">[0] Number of indices in set 6</div><div class="gmail_quote">[0] 0 0</div><div class="gmail_quote">[0] 1 190</div><div class="gmail_quote">[0] 2 0</div><div class="gmail_quote">[0] 3 10</div><div class="gmail_quote">[0] 4 9</div><div class="gmail_quote">[0] 5 1</div><div class="gmail_quote">[1] Number of indices in set 6</div><div class="gmail_quote">[1] 0 95</div><div class="gmail_quote">[1] 1 475</div><div class="gmail_quote">[1] 2 275</div><div class="gmail_quote">[1] 3 295</div><div class="gmail_quote">[1] 4 284</div><div class="gmail_quote">[1] 5 286</div><div class="gmail_quote"><br></div><div class="gmail_quote">i.e., your local ISs are concatenated as a parallel IS.</div><div class="gmail_quote">In MatGetSubMatrices_MPIAIJ() implementation, petsc only uses local size and local indices of input IS, this explains why you got same answer.</div></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
The situation for me is that, I am trying to write a piece of code to<br>
do some simple CFD simulations using finite volume method. The row IS<br>
I passed to MatGetSubMatrices() is the neighbor element indices for<br>
the current element being processed. The reason for the duplicated<br>
indices in the row IS is that I just simply put a ZERO index at the<br>
place where the actual neighbor element is the boundary of the fluid<br>
domain. You see, it is all because I’m too lazy to deal with the<br>
differences between the boundary elements and the inner elements while<br>
I’m gathering information from the parallel matrix. I think I should<br>
stop doing this. And I am working on refining the code. Do you have<br>
any suggestions for me to handle the boundary elements?<br></blockquote><div><br></div><div>Sorry, I'm not an expert on finite element. Others may help you on this issue. Intuitively, matrix is assembled from elements. You should have more efficient way to retrieve elements without using matrix.</div><div><br></div><div>Hong </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class=""><div class="h5"><br>
2016-04-15 2:01 GMT+08:00 Hong <<a href="mailto:hzhang@mcs.anl.gov">hzhang@mcs.anl.gov</a>>:<br>
> Yaoyu :<br>
> Can you send me the code for calling MatGetSubMatrices()?<br>
> I want to check how did you create mpi ISs.<br>
><br>
> Checking MatGetSubMatrices() for mpiaij matrix format, it seems duplicate IS<br>
> indices would work. I guess duplicate rows might be ok, but duplicate<br>
> columns might run into trouble from our implementation.<br>
><br>
> By definition, a submatrix of A should not have duplicate row/column of A,<br>
> isn't it?<br>
><br>
> Hong<br>
><br>
> Hi Hong,<br>
>><br>
>><br>
>> I think what you said about the ISs for MatGetSubMatrices() are right.<br>
>><br>
>> Today I tried to run my program to get submatrix by<br>
>> MatGetSubMatrices() twice. One time with ISs created with<br>
>> PETSC_COMM_WORLD and the other time with PETSC_COMM_SELF. I was<br>
>> creating a 6x3 submatrix on each processor from a 570x3 parallel dense<br>
>> matrix. There are only 2 processors in total. The results are as<br>
>> follows:<br>
>><br>
>> ======== submatrix with ISs created with PETSC_COMM_WORLD =========<br>
>> Processor 0<br>
>> Mat Object: 1 MPI processes<br>
>>   type: seqdense<br>
>> 2.7074996615625420e+10 6.8399452804377966e+11 -1.2730861976538324e+08<br>
>> 2.7074996615625420e+10 6.8399452804377966e+11 -1.2730861976538324e+08<br>
>> 2.7359996580000423e+10 8.2079343365253589e+11 6.3654303672968522e+06<br>
>> 2.9639996295000458e+10 1.9151846785225828e+12 -1.0184686034752984e+08<br>
>> 2.9924996259375465e+10 1.1947308948674746e+12 -3.8181422587255287e+08<br>
>> 5.4149993231250839e+10 2.6675786593707410e+13 -4.9650360873402004e+09<br>
>><br>
>> Processor 1<br>
>> Mat Object: 1 MPI processes<br>
>>   type: seqdense<br>
>> 5.4149993231250839e+10 1.9183199555758315e+12 5.9880080526417112e+08<br>
>> 7.8374990203126236e+10 5.7441876402563477e+12 1.7367770705944958e+09<br>
>> 8.0939989882501266e+10 5.7347670250898613e+12 1.7900992494213123e+09<br>
>> 8.1509989811251282e+10 5.7751527083651416e+12 1.8027055821637158e+09<br>
>> 8.4074989490626328e+10 6.1543675577970762e+12 1.8557943339637902e+09<br>
>> 1.0829998646250171e+11 9.5915997778791719e+12 2.9940040263208551e+09<br>
>><br>
>> ==== end of submatrix with ISs created with PETSC_COMM_WORLD ======<br>
>><br>
>> ======== submatrix with ISs created with PETSC_COMM_SELF =========<br>
>> Processor 0<br>
>> Mat Object: 1 MPI processes<br>
>>   type: seqdense<br>
>> 2.7074996615625420e+10 6.8399452804377966e+11 -1.2730861976538324e+08<br>
>> 2.7074996615625420e+10 6.8399452804377966e+11 -1.2730861976538324e+08<br>
>> 2.7359996580000423e+10 8.2079343365253589e+11 6.3654303672968522e+06<br>
>> 2.9639996295000458e+10 1.9151846785225828e+12 -1.0184686034752984e+08<br>
>> 2.9924996259375465e+10 1.1947308948674746e+12 -3.8181422587255287e+08<br>
>> 5.4149993231250839e+10 2.6675786593707410e+13 -4.9650360873402004e+09<br>
>><br>
>> Processor 1<br>
>> Mat Object: 1 MPI processes<br>
>>   type: seqdense<br>
>> 5.4149993231250839e+10 1.9183199555758315e+12 5.9880080526417112e+08<br>
>> 7.8374990203126236e+10 5.7441876402563477e+12 1.7367770705944958e+09<br>
>> 8.0939989882501266e+10 5.7347670250898613e+12 1.7900992494213123e+09<br>
>> 8.1509989811251282e+10 5.7751527083651416e+12 1.8027055821637158e+09<br>
>> 8.4074989490626328e+10 6.1543675577970762e+12 1.8557943339637902e+09<br>
>> 1.0829998646250171e+11 9.5915997778791719e+12 2.9940040263208551e+09<br>
>><br>
>> ==== end of submatrix with ISs created with PETSC_COMM_SELF ======<br>
>><br>
>> The results are identical. I really agree with you that only<br>
>> sequential ISs should be used when creating submatrix by<br>
>> MatGetSubMatrices(). The above results may be just a coincidence.<br>
>><br>
>> I take your suggestions and I am using only sequential ISs with<br>
>> MatGetSubMatrices() now.<br>
>><br>
>> Yet another question: Can I use IS which have duplicate entries in it?<br>
>> The documentation of MatGetSubMatrices() says that "The index sets may<br>
>> not have duplicate entries", so I think no duplicated entries are<br>
>> allowed in the IS. But again, I just tried IS which have duplicated<br>
>> entries. And the resultant submatrices for each processor seemd to be<br>
>> correct. In fact, in the above sample submatrices I showed, the<br>
>> submatrix owned by Processor 0 has its row IS specified as [x, x, a,<br>
>> b, c, d]. Where 'x' means the duplicated entries in the IS. Then I got<br>
>> two identical rows in the submatrix owned by Processor 0.<br>
>><br>
>> But I think I was doing this incorrectly.<br>
>><br>
>> Thanks.<br>
>><br>
>> HU Yaoyu<br>
>><br>
>> ><br>
>> > Yaoyu:<br>
>> ><br>
>> >  "MatGetSubMatrices() can extract ONLY sequential submatrices<br>
>> >    (from both sequential and parallel matrices). Use MatGetSubMatrix()<br>
>> >    to extract a parallel submatrix."<br>
>> ><br>
>> > Using parallel IS for MatGetSubMatrices() definitely incorrect, unless<br>
>> > you<br>
>> > only use one process.<br>
>> ><br>
>> >><br>
>> >> And further. I checked the submatrices I obtained by<br>
>> >> MatGetSubMatrices() with both parallel ISs and sequential ISs. The<br>
>> >> submatrices are identical. Is it means that I could actually use<br>
>> >> parallel IS (created with PETSC_COMM_WORLD) ?<br>
>> >><br>
>> ><br>
>> > What did you compare with?  I do not understand what submatrices would<br>
>> > obtain with parallel IS using more than one process.<br>
>> ><br>
>> > Hong<br>
>> ><br>
>> >><br>
>> >> > Yaoyu :<br>
>> >> > MatGetSubMatrices() returns sequential matrices.<br>
>> >> > IS must be sequential, created with PETSC_COMM_SELF.<br>
>> >> > See petsc/src/mat/examples/tests/ex42.c<br>
>> >> ><br>
>> >> > Check your submatrices.<br>
>> >> ><br>
>> >> > Hong<br>
>> >> ><br>
>> >> > Hi everyone,<br>
>> >> >><br>
>> >> >> I am trying to get values owned by other processors of a parallel<br>
>> >> matrix.<br>
>> >> >><br>
>> >> >> I tried to create a sub-matrix by using MatGetSubMatrices(), and<br>
>> >> >> then<br>
>> >> >> MatGetRow() on the sub-matrix. But MatGetRow() give me the following<br>
>> >> >> error message:<br>
>> >> >><br>
>> >> >> ===== Error message begins =====<br>
>> >> >><br>
>> >> >> No support for this operation for this object type<br>
>> >> >> only local rows<br>
>> >> >><br>
>> >> >> ===== Error message ends =====<br>
>> >> >><br>
>> >> >> The parallel matrix is a parallel dense matrix. The ISs for<br>
>> >> >> MatGetSubMatrices() are created using ISCreateGeneral() and<br>
>> >> >> PETSC_COMM_WORLD. The row IS is sorted by ISSort().<br>
>> >> >><br>
>> >> >> What did I mistake while using the above functions? Is there a<br>
>> >> >> better<br>
>> >> >> way to get access to matrix values owned by other processor?<br>
>> >> >><br>
>> >> >> Thanks!<br>
>> >> >><br>
>> >> >> HU Yaoyu<br>
>> >> >><br>
</div></div></blockquote></div><br></div></div>