On Fri, Apr 1, 2022 at 12:27 PM Samuel Estes <[email protected]> wrote:
> 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 MatPreallocator, https://petsc.org/main/docs/manualpages/Mat/MATPREALLOCATOR.html 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 https://petsc.org/main/docs/manualpages/Mat/MatPreallocatorPreallocate.html#MatPreallocatorPreallocate 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. Thanks, Matt Sam > -- 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/>
