[petsc-users] Write Non-Zero Values of MPI Matrix on an MPI Vector

Matthew Knepley knepley at gmail.com
Tue Feb 13 09:19:54 CST 2018


On Tue, Feb 13, 2018 at 10:12 AM, Ali Berk Kahraman <
aliberkkahraman at yahoo.com> wrote:

> OK, here is the thing. I have a 2D cartesian regular grid. I am working on
> wavelet method collocation method, which creates an irregular adaptive grid
> by turning grid points on an off on the previously mentioned cartesian
> grid. I store the grid and the values as sparse Mat objects, where each
> entry to the matrix denotes the x and y location of the value (x:row,
> y:column). However, to feed the values into PETSc's solver contexts, I have
> to turn them into vectors.
>
>
> By the way, I believe I have solved the problem. For future reference who
> looks for this, the algorithm is as follows;
>
> For each processor,
>
> 1.)Get the local number of nonzero entries on the matrix using MatGetInfo
>
> 2.)Call MPI_Allgather so that every process will know exactly how many
> nonzero entries each other has
>
> 3.)Create the Vector and set its size using the data from MPI_Allgather
> from step 2 (sum of all local nonzero sizes)
>

You do not need 2) since you can just give the local size and
PETSC_DETERMINE to VecSetSizes().

  Thanks,

     Matt


> 4.)Call MatMPIAIJGetLocalMat to get the local portion of the matrix, then
> call MatSeqAIJGetArray on the local portion to extract its nonzero values
> as an array
>
> 5.)Using the info from step 2 and 4, set the according values on the
> vector (e.g. if process 0 has 4 nonzeros, process 1 will set the values on
> Vector's row 4 onwards)
>
>
> I am always open to ideas for improvements.
>
>
> Ali
>
>
> On 13-02-2018 16:46, Jed Brown wrote:
>
>> Ali Kahraman <aliberkkahraman at yahoo.com> writes:
>>
>>    Dear All,
>>>   My problem definition is as follows,
>>>   I  have an MPI matrix with a random sparsity pattern i.e. I do not
>>> know how many nonzeros there are on any row unless I call MatGetRow to
>>> learn it. There are possibly unequal numbers of nonzeros on every row. I
>>> want to write all the nonzero values of this matrix onto a parallel vector.
>>> An example can be as follows.
>>>     Imagine I have a 4x4 matrix (; denotes next row, . denotes sparse
>>> "zeros") [3 . 2 . ; .  1 .  . ; 4 5 3 2; . . . .]. I want to obtain the
>>> vector [3 2 1 4 5 3 2]. I could not find any function that does this. Any
>>> idea is appreciated.
>>>
>> This seems like an odd thing to want.  What are you trying to do?
>>
>
>


-- 
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which their
experiments lead.
-- Norbert Wiener

https://www.cse.buffalo.edu/~knepley/ <http://www.caam.rice.edu/~mk51/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20180213/ee6625bb/attachment.html>


More information about the petsc-users mailing list