[petsc-dev] MatCopy to zero preallocated matrix

Vaclav Hapla vaclav.hapla at vsb.cz
Thu Mar 1 17:03:20 CST 2012


Dear PETSc team,
why I am not able to do this:

...
MatCreate(PETSC_COMM_SELF, &Kreg);
MatSetSizes(Kreg,m,n,m,n);
MatSetType(Kreg, MATSEQAIJ);
MatSeqAIJSetPreallocation(Kreg,0,nnz);
MatAssemblyBegin(Kreg, MAT_FINAL_ASSEMBLY);
MatAssemblyEnd(   Kreg, MAT_FINAL_ASSEMBLY);
PetscFree(nnz);
{
     PetscInt nz_Kreg;
     MatGetRow(Kreg, 0, &nz_Kreg, PETSC_IGNORE, PETSC_IGNORE);
     PetscPrintf(PETSC_COMM_SELF, "nnz %d  Kreg %d\n", nnz[0], 
nz_Kreg);  // prints nnz 11  Kreg 0 !!!
}
MatCopy(K_loc, Kreg, DIFFERENT_NONZERO_PATTERN); //fails: New nonzero at 
(0,0) caused a malloc!


PETSc complains about new nonzero - not surprisingly because 
MatAssemblyBegin/End filters zeros as I understand.
But when I comment out MatAssemblyBegin/End, MatCopy complains that it 
is only for assembled matrices.

I think that to call MatSetValues on all allocated nonzeros just to make 
them survive MatAssemblyBegin/End or to replace MatCopy call by loop 
over raw array is both quite awkward.
Maybe one should be able to turn the filter in MatAssemblyBegin/End off. 
Or is there any other way out?

BTW, what I need is to make a copy Kreg of given matrix K_loc but with 
few additional preallocated positions which are filled later. Is there 
some other convenient solution?

Cheers,
Vaclav Hapla



More information about the petsc-dev mailing list