<div dir="ltr"><div dir="ltr">Hi Barry,<div><br></div><div>I did what you said but now I get the error in ISSetPermutation that index set is not a permutation. ı think it is because since I selected indices on each process as you said. I did the following, did I understand you wrong:</div><div><br></div><div><div>  PetscMPIInt rank,size;</div><div>  MPI_Comm_rank(PETSC_COMM_WORLD, &rank);</div><div>  MPI_Comm_size(PETSC_COMM_WORLD, &size);</div><div> </div><div>  PetscInt *idxx,ss;</div><div>  ss = siz/size;</div><div>  PetscMalloc1(ss,&idxx);</div><div>  if (rank != size-1) {</div><div>    j =0;</div><div>    for (i=rank*ss; i<(rank+1)*ss; i++) {</div><div>      idxx[j] = idx[i];</div><div>      j++;</div><div>    }</div><div><br></div><div>  } else {</div><div>      </div><div>    j =0;</div><div>    for (i=rank*ss; i<siz; i++) {</div><div>      idxx[j] = idx[i];</div><div>      j++;</div><div>    }</div><div>      </div><div>  }</div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Smith, Barry F. <<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>>, 31 Mar 2019 Paz, 01:47 tarihinde şunu yazdı:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
<br>
> On Mar 27, 2019, at 7:33 AM, Eda Oktay via petsc-users <<a href="mailto:petsc-users@mcs.anl.gov" target="_blank">petsc-users@mcs.anl.gov</a>> wrote:<br>
> <br>
> Hello,<br>
> <br>
> I am trying to permute a matrix A(of size 2n*2n) according to a sorted eigenvector vr (of size 2n) in parallel using 2 processors (processor number can change).<br>
<br>
    I don't understand your rational for wanting to permute the matrix rows/columns based on a sorted eigenvector? <br>
<br>
> However, I get an error in MatPermute line stating that arguments are out of range and a new nonzero caused a malloc even if I used MatSetOption. <br>
> <br>
> I discovered that this may be because of the unequality of local sizes of is (and newIS) and local size of A. <br>
> <br>
> Since I allocate index set idx according to size of the vector vr, global size of is becomes 2n and the local size is also 2n (I think it should be n since both A and vr has local sizes n because of the number of processors). If I change the size of idx, then because of VecGetArrayRead, I think is is created wrongly.<br>
> <br>
> So, how can I make both global and local sizes of is,newIS and A?<br>
> <br>
> Below, you can see the part of my program.<br>
> <br>
> Thanks,<br>
> <br>
> Eda<br>
>  <br>
>  ierr = VecGetSize(vr,&siz);CHKERRQ(ierr);                            <br>
>   ierr = PetscMalloc1(siz,&idx);CHKERRQ(ierr);<br>
>   for (i=0; i<siz;i++) idx[i] = i;<br>
<br>
   VecGetArray only gives you access to the local portion of the vector, not the entire vector so you cannot do the next two lines of code<br>
>   ierr = VecGetArrayRead(vr,&avr);CHKERRQ(ierr);<br>
<br>
   The sort routine is sequential; it knows nothing about parallelism so each process is just sorting its part. Hence this code won't work as expected<br>
<br>
>   ierr = PetscSortRealWithPermutation(siz,avr,idx);CHKERRQ(ierr); <br>
<br>
   If you need to sort the parallel vector and get the entire permutation then you need to do the following <br>
<br>
1)   communicate the entire vector to each process, you can use VecScatterCreateToAll() for this<br>
2)   call VecGetArray on the new vector (that contains all entries on each process)<br>
3)   Call PetscSortRealWithPermutation() on the entire vector on each process<br>
4)   select out a piece of the resulting indices idx on each process; for example with two processes I think rank = 0 would get the first half of the idx and rank = 1 would get the second half.<br>
>                  <br>
>   ierr = ISCreateGeneral(PETSC_COMM_SELF,siz,idx,PETSC_COPY_VALUES,&is);CHKERRQ(ierr);  <br>
>   ierr = ISSetPermutation(is);CHKERRQ(ierr);<br>
<br>
  You don't need to duplicate the is, just pass it in twice.<br>
<br>
>   ierr = ISDuplicate(is,&newIS);CHKERRQ(ierr);<br>
<br>
   You should definitely not need the next line. The A matrix is untouched by the subroutine call so you don't need to change its allocation options<br>
<br>
> MatSetOption(A,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_FALSE);CHKERRQ(ierr);  <br>
>   ierr = MatPermute(A,is,newIS,&PL);CHKERRQ(ierr);  <br>
<br>
</blockquote></div>