[petsc-users] Allocating the diagonal for MatMPIAIJSetPreallocation

Matthew Knepley knepley at gmail.com
Fri Apr 1 11:33:50 CDT 2022

On Fri, Apr 1, 2022 at 12:27 PM Samuel Estes <samuelestes91 at gmail.com>

> Hi,
> I have a problem in which I know (roughly) the number of non-zero entries
> for each row of a matrix but I don't have a convenient way of determining
> whether they belong to the diagonal or off-diagonal part of the parallel
> matrix. Is there some way I can just allocate the total number of non-zeros
> in a row regardless of which part they belong to? I'm assuming that this is
> not possible but I just wanted to check. It seems like it should be
> possible in principle since the matrix is only split by the rows but the
> columns of a row are all on the same processor (at least as I understand
> it). Thanks!

In serial, the matrix is stored by rows. In parallel, it is split into a
diagonal and off-diagonal block, so that we can overlap communication and
computation in the matvec.

However, we have a convenience structure for figuring this out, called
In my code, I wrote a loop around the code that filled up my matrix, which
executed twice. On the first pass, I fed in the MatPreallocator matrix.
When this finished
you can call
on your system amtrix, then on the second
pass use the system matrix. This was only a few extra lines of code for me.
If you want to optimize further, you can have a flag that only computes the
values on the
second pass.



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.cse.buffalo.edu/~knepley/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20220401/fbc868a0/attachment.html>

More information about the petsc-users mailing list