[petsc-users] zeros in sparse aij

Xiangdong Liang xdliang at gmail.com
Wed Dec 7 11:04:52 CST 2011


On Wed, Dec 7, 2011 at 4:44 AM, Matthew Knepley <knepley at gmail.com> wrote:
> On Tue, Dec 6, 2011 at 11:39 PM, Xiangdong Liang <xdliang at gmail.com> wrote:
>>
>> On Wed, Dec 7, 2011 at 12:11 AM, Barry Smith <bsmith at mcs.anl.gov> wrote:
>> >
>> > On Dec 6, 2011, at 10:26 PM, Xiangdong Liang wrote:
>> >
>> >> Hello everyone,
>> >>
>> >> Can anyone help on the usage of MAT_IGNORE_ZERO_ENTRIES? Suppose I
>> >> want to have a 10-by-10 sparse matrix, where each row has maximum two
>> >> nonzeros. I would like to have petsc ignore the 0.0  values by not
>> >> allocating space for 0.0 values. In my problem, the nonzero pattern of
>> >> sparse matrix will never change. I hope the ignore of zero entries
>> >> will save lots of operations when I am doing matrix-vector product or
>> >> spare-direct decomposition .
>> >>
>> >> Below is my script. When I check the mat_view_info, I have
>> >>
>> >> Matrix Object:
>> >> type=mpiaij, rows=10, cols=10
>> >> total: nonzeros=20, allocated nonzeros=40
>> >>   not using I-node (on process 0) routines
>> >>
>> >> Is there a way to have nonzeros=10, and allocated nonzeros=10, since
>> >> the number of real nonzeros=10? Thanks.
>> >
>> >   Those "extra" nonzeros are not actually in the sparse matrix so they
>> > do not cause extra multiples. You can safely ignore them.
>>
>> I am sorry I am still not clear.   Do "extra" nonzeros refer to
>> “nonzeros=20” or "allocated nonzeros=40"? With or without
>> MatSetOption(A,MAT_IGNORE_ZERO_ENTRIES,PETSC_TRUE), I see the same
>> mat_view_info. How can I see the differences in the spare matrix
>> generated With/Without this option? Thanks.
>
>
> If there are 2 nonzeros per row, there are 20 nonzeros not 10 in the matrix.
> According to
> the output, you allocated 40 nonzeros for the matrix.

Now, I understand the "allocated nonzeros=40". How can I bring the
other one " total nonzero=20" down to " total nonzero=10", since 10
out of 20 values are 0.0? Thanks.


>
> When you call MatAssemblyEnd(), we compress the matrix so that the 20 extra
> allocated nonzeros
> are not present.
>
>   Matt
>
>>
>>
>> Xiangdong
>>
>>
>> >
>> >  Barry
>> >
>> >>
>> >> Xiangdong
>> >>
>> >> -----------------------------------------------------------
>> >>  Mat A;  int N=10, i, ns,ne;
>> >>
>> >> ierr=MatCreateMPIAIJ(PETSC_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,N,N,2,NULL,2,NULL,&A);CHKERRQ(ierr);
>> >>   ierr = MatGetOwnershipRange(A, &ns, &ne); CHKERRQ(ierr);
>> >>   for (i=ns;i<ne;i++)    {      ierr=MatSetValue(A,i, i, 1.0,
>> >> ADD_VALUES); CHKERRQ(ierr);      ierr=MatSetValue(A,i, (i+1)%N, 0.0,
>> >> ADD_VALUES); CHKERRQ(ierr);    }
>> >>     MatSetOption(A,MAT_IGNORE_ZERO_ENTRIES,PETSC_TRUE);     ierr =
>> >> MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);     ierr =
>> >> MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
>> >>
>> >> --------------------------------------------------------
>> >>
>> >>
>> >> On Thu, Dec 1, 2011 at 10:01 PM, Barry Smith <bsmith at mcs.anl.gov>
>> >> wrote:
>> >>>
>> >>>  The checks in the code are lines like
>> >>>
>> >>>      if (value == 0.0 && ignorezeroentries && (is == ADD_VALUES))
>> >>> continue;
>> >>>
>> >>> hence changing the source code  to ignore small values is not
>> >>> difficult.  But I think this is a terribly cheesy hack and would hope people
>> >>> would not do this.
>> >>>
>> >>>    Barry
>> >>>
>> >>>
>> >>>
>> >>> On Dec 1, 2011, at 8:42 PM, Mohamad M. Nasr-Azadani wrote:
>> >>>
>> >>>> I was always wondering how difficult it would be to define a constant
>> >>>> say, ZERO_DROP_TOLERANCE so that when the matrix is setup,
>> >>>> MatAssemblyBegin()/End(), it automatically ignores the values below this
>> >>>> threshold?
>> >>>> I understand the for the matrices that might change in successive
>> >>>> iterations, that might not be a good idea since the memory reallocation
>> >>>> could be very slow, but for a lot of cases which a constant matrix, that
>> >>>> could be simply helpful.
>> >>>>
>> >>>> Best,
>> >>>> Mohamad
>> >>>>
>> >>>>
>> >>>>
>> >>>>
>> >>>>
>> >>>> On Thu, Dec 1, 2011 at 5:00 PM, Barry Smith <bsmith at mcs.anl.gov>
>> >>>> wrote:
>> >>>>
>> >>>> On Dec 1, 2011, at 6:44 PM, Xiangdong Liang wrote:
>> >>>>
>> >>>>> Hello everyone,
>> >>>>>
>> >>>>> I have a question about whether zeros will change the sparse
>> >>>>> pattern.
>> >>>>> Suppose I am generating two sparse matrices A and B. A is generated
>> >>>>> with exactly number of nonzeros, say 10 nnz per row. When I generate
>> >>>>> matrix B, I specify 12 nonzeros, but two of them are given zero
>> >>>>> values
>> >>>>> by MatSetValue. Will A and B have same sparsity patterns and
>> >>>>> performance ? In other words, will PETSc simply ignore these zeros
>> >>>>> entries?  I output these A and B in matlab, and it seems that these
>> >>>>> zeros entries are ignored. I just want to double check on this.
>> >>>>>
>> >>>>> Is the option MAT_IGNORE_ZERO_ENTRIES on by default?
>> >>>>
>> >>>>   No, by default PETSc will insert the zero values thus increasing
>> >>>> the nonzero pattern. If you set that option to the matrix then inserting
>> >>>> values it will not introduce an increase in the pattern.
>> >>>>
>> >>>>
>> >>>>    BTW: if you then load the matrix via a binary file to MATLAB it
>> >>>> may be that MATLAB silently removes those locations so you don't see them.
>> >>>>   Barry
>> >>>>
>> >>>>> Thanks.
>> >>>>>
>> >>>>> Best,
>> >>>>> Xiangdong
>> >>>>
>> >>>>
>> >>>
>> >
>
>
>
>
> --
> 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


More information about the petsc-users mailing list