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