[petsc-users] How to have a local copy (sequential) of a parallel matrix

Dave May dave.mayhem23 at gmail.com
Wed Jun 29 15:03:46 CDT 2016


On Wednesday, 29 June 2016, ehsan sadrfaridpour <it.sadr at gmail.com> wrote:

> I faced the below error during compiling my code for using
> MatGetSubMatrices.
>
> error: cannot convert ‘IS {aka _p_IS*}’ to ‘_p_IS* const*’ for argument
>> ‘3’ to ‘PetscErrorCode MatGetSubMatrices(Mat, PetscInt, _p_IS* const*,
>> _p_IS* const*, MatReuse, _p_Mat***)’
>>          MatGetSubMatrices(m_WA_norm_T, 1, set, set, MAT_INITIAL_MATRIX,
>> &m_local_W);
>>
>
> My code :
>
>> PetscMPIInt    rank;
>> MPI_Comm_rank(PETSC_COMM_WORLD, &rank);
>>
>> if(rank ==0){
>>         Mat m_local_W;
>>         MatCreateSeqAIJ(PETSC_COMM_SELF,num_points,num_points, num_nz,
>> NULL,&m_local_W);// try to reserve space for only number of final non zero
>> entries for each fine node (e.g. 4)
>>         IS set;
>>         ISCreateStride(PETSC_COMM_SELF, num_points, 0, 1, &set_row);
>>         MatGetSubMatrices(m_WA_norm_T, 1, set_row, set_col,
>> MAT_INITIAL_MATRIX, &m_local_W);
>>
>>     }
>>
>
> I followed below example:
>
> http://www.mcs.anl.gov/petsc/petsc-current/src/vec/is/is/examples/tutorials/ex2.c.html
>

This code won't work in parallel.
The man page says this function is collective on Mat. You need to move the
call to MatGetSubMatrices outside of the if(rank==0) loop.



>
>
>
>
>
> On Wed, Jun 29, 2016 at 3:19 PM, ehsan sadrfaridpour <it.sadr at gmail.com
> <javascript:_e(%7B%7D,'cvml','it.sadr at gmail.com');>> wrote:
>
>> Thanks a lot for great support.
>>
>> On Wed, Jun 29, 2016 at 3:11 PM, Barry Smith <bsmith at mcs.anl.gov
>> <javascript:_e(%7B%7D,'cvml','bsmith at mcs.anl.gov');>> wrote:
>>
>>>
>>>    MatGetSubmatrices() just have the first process request all the rows
>>> and columns and the others request none. You can use ISCreateStride() to
>>> create the ISs without having to make an array of all the indices.
>>>
>>>
>>> > On Jun 29, 2016, at 1:43 PM, ehsan sadrfaridpour <it.sadr at gmail.com
>>> <javascript:_e(%7B%7D,'cvml','it.sadr at gmail.com');>> wrote:
>>> >
>>> > Hi,
>>> >
>>> > I need to have access to most of elements of a parallel MPIAIJ matrix
>>> only from 1 process (rank 0).
>>> > I tried to copy or duplicate it to SEQAIJ, but I faced problems.
>>> >
>>> > How can I have a local copy of a matrix which is distributed on
>>> multiple process? I don't want to update the matrix, and the read-only
>>> version of it would be enough.
>>> >
>>> > Best,
>>> > Ehsan
>>> >
>>> >
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20160629/2cc6aecc/attachment.html>


More information about the petsc-users mailing list