[petsc-users] MatZeroRows

Barry Smith bsmith at petsc.dev
Thu Aug 13 16:19:41 CDT 2020


  Anthony,

    Keeping the nonzero locations (with zero in them) will be a bit faster in the call to MatZeroRows() because otherwise it has to shift all the entries in the sparse matrix arrays data structures to "remove" the unneeded locations. 
 
    But the real question is how it affects times in later function calls

1)  If you do the MatSetValues()/MatAssemblyBegin/End() repeatedly it will be much faster if you keep the nonzero locations (with zero in them). 

2)  Time for MatMult() will be a bit faster if you remove the locations, but the depending on the preconditioner the preconditioner may be more or less effective and a bit slower or faster. 

  So, rule of thumb is if you only do MatZeroRows() once you might generally remove the locations but if it is done in a loop with the same matrix (over time-steps for example, or even in SNES) you want to keep the nonzero locations.

  Barry

Note: in both cases the memory usage is the same because PETSc does not "return" the excessive memory.


> On Aug 13, 2020, at 8:07 AM, Matthew Knepley <knepley at gmail.com> wrote:
> 
> On Thu, Aug 13, 2020 at 3:17 AM Anthony Paul Haas <aph at email.arizona.edu <mailto:aph at email.arizona.edu>> wrote:
> Hello,
> 
> I am using MatZeroRows for imposing a known forcing into my equations in conjunction with rhs and by setting the diagonal of the matrix to 1.
> 
> I am using Fortran. I have used:
> 
> ! only local processors set their own zeros                                                                                                                                                     
> call MatSetOption(self%fieldLHSMat_ps, MAT_NO_OFF_PROC_ZERO_ROWS, PETSC_TRUE, ierr)
> 
> call MatSetOption(self%fieldLHSMat_ps, MAT_KEEP_NONZERO_PATTERN, PETSC_TRUE, ierr)
> 
> call MatZeroRows(self%fieldLHSMat_ps, numrows, glob_row_idx, diag, PETSC_NULL_OBJECT, PETSC_NULL_OBJECT, ierr)
> 
> 
> Is numrows above the local (on each proc.) number of rows to remove, or is it the global number of rows to remove?
> 
> Local.
>  
> Also on some processors, I have no rows to remove, hence the array glob_row_idx is not allocated. How can I tell Petsc? Should I pass PETSC_NULL_OBJECT instead of glob_row_idx in this case?   
> 
> If you pass numrows = 0, it should not matter what is in the next slot, as long as it type checks.
>  
> Finally, does using the option MAT_KEEP_NONZERO_PATTERN have an influence on the time the MatZeroRows call will take?
> 
> I don't think it makes much of a difference, but I have not measured it.
> 
>   Thanks,
> 
>      Matt
>  
> Thanks,
> 
> Best regards,
> 
> Anthony
> 
> 
> 
> 
> 
> -- 
> 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/20200813/1f72ca67/attachment.html>


More information about the petsc-users mailing list