[petsc-users] preallocation for FE matrix

Barry Smith bsmith at mcs.anl.gov
Mon Oct 4 16:26:55 CDT 2010


On Oct 4, 2010, at 4:21 PM, Tabrez Ali wrote:

> I am trying to assemble a FE matrix (adding one element at a time from the local stiffness matrix) and cant seem to get the preallocation right. I am correctly calculating the number of non zeros per row and storing the value in the array [nnzpr].

  (For sequential case) you cannot be calculating the number of nonzeros per row correctly and yet not getting the preallocation correct.

  For your simple problem. Print the nonzeros per row you are computing then print the sparse matrix you computing. That will show which rows are not computed or set properly.

> I dont understand why -mat_view_info shows allocated nonzeros to be 154 when sum(nnzpr) is 112.

   If you mess up the count on a row it allocates a few extra for that row (incase you end up needing them) so the number allocated can be more then the number actually needed.

   Barry


> 
> Here is part of the relevant code
> 
> ...
> call MatCreateSeqBAIJ(Petsc_Comm_Self, 1, m, n, petsc_null_integer, nnzpr, Mat_A, ierr)
> ...
> ! Assume a bilinear quad (2 dof per node)
> do j1=1,8
>   do j2=1,8
>     call MatSetValues(Mat_A, 1, indx(j1)-1, 1, indx(j2)-1, k(j1,j2), Add_Values, ierr)
>   end do
> end do
> ...
> call MatAssemblyBegin(Mat_A,Mat_Final_Assembly,ierr)
> call MatAssemblyEnd(Mat_A,Mat_Final_Assembly,ierr)
> ...
> 
> On running it I get
> 
> -bash-3.00$ ./a.out <inp -info -mat_view_info
> ...
>  Total non-zero elements estimated i.e., sum(nnzpr) =                  112
> [0] PetscCommDuplicate(): Duplicating a communicator 1140850689 -2080374784 max tags = 2147483647
> [0] PetscCommDuplicate():   returning tag 2147483647
> [0] MatAssemblyEnd_SeqBAIJ(): Matrix size: 12 X 12, block size 1; storage space: 42 unneeded, 112 used
> [0] MatAssemblyEnd_SeqBAIJ(): Number of mallocs during MatSetValues is 9
> [0] MatAssemblyEnd_SeqBAIJ(): Most nonzeros blocks in any row is 12
> ...
> Matrix Object:
>   type=seqbaij, rows=12, cols=12
>   total: nonzeros=112, allocated nonzeros=154
>       block size is 1
> 
> I dont understand why -mat_view_info shows allocated nonzeros to be 154 when sum(nnzpr) is 112.
> 
> Thanks in advance.



More information about the petsc-users mailing list