[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